Content management and web applications
Joomla core, September 2026 security release (CVE-2026-90915, CVE-2026-92222 and others)
Joomla core check
Joomla 5.4.9 and 6.1.4, released on 29 September 2026, fix 16 core security issues (CVE-2026-90906 to CVE-2026-92232). The Joomla Security Strike Team rates two of them High and thirteen Moderate.
| CVE | Severity | What | Affected |
|---|---|---|---|
| CVE-2026-90915 | High | Arbitrary directory deletion. The cache purge action (System, Clear Cache) did not confine the cache group name, so a path traversal in the file-based cache could delete any directory the web server can write to | 4.0.0 to 5.4.8, 6.0.0 to 6.1.3 |
| CVE-2026-92222 | High | Server-side request forgery through URL fields (feed and request URLs) in several core extensions. Needs a Manager account or above | 3.0.0 and later |
| CVE-2026-92227 | Moderate, high impact | A multi-factor authentication bypass through remember-me cookies issued too early. Needs the password first | 4.0.0 to 5.4.8, 6.0.0 to 6.1.3 |
| CVE-2026-90916 | Improper access checks in the content history comparison view | 4.0.0 to 5.4.8, 6.0.0 to 6.1.3 | |
| CVE-2026-90906, CVE-2026-92224 | Cross-site scripting in HTMLHelper::link and the link toolbar |
||
| CVE-2026-90917 | A flaw in tagged items | ||
| CVE-2026-92231, CVE-2026-92232 | Two InputFilter bypasses (HTML5 entity decoding, whitespace in data URIs) |
||
| CVE-2026-90913, CVE-2026-92226 | Access-control fixes in the Joomla API |
The release also fixes issues that the sources used here describe without an identifier, including unauthorized account creation while registration is disabled. The table lists only the identifiers those sources name.
| Affected | Joomla 6.0.0 to 6.1.3, and 4.0.0 to 5.4.8. The SSRF flaw reaches back to 3.0.0, one XSS flaw to 1.5.0 |
| Fixed | 5.4.9 and 6.1.4 |
| Move to | 5.4.9 or later, or 6.1.4 or later. 3.x, 4.x and 5.0 to 5.3 are past security support |
| Exploited | No exploitation reported in the sources used. Most of the flaws need a logged-in account |
How the script reads an install
libraries/src/Version.php holds the version as constants (MAJOR_VERSION, MINOR_VERSION, PATCH_VERSION). The script also reads one file the fix changed, libraries/src/Cache/Storage/FileStorage.php: the cache-purge fix adds Path::check($dir, $this->_root). That signature confirms the High cache flaw and catches a partial update, a fixed version number on a file that still has the old code, or the reverse. The other fifteen fixes are judged by the version.
Quick start
curl -fLO https://raw.githubusercontent.com/PrivacySafe/security-patches/refs/heads/main/joomla/joomla-check.sh
less joomla-check.sh
chmod +x joomla-check.sh
./joomla-check.sh check
By default it searches /var/www /srv /home /opt /usr/share. Pass directories to narrow it. Everything is read-only.
Commands
| Command | What it does |
|---|---|
check (default) |
Finds each Joomla by libraries/src/Version.php, reads the version and the cache-purge signature, and reports. Exit 0 nothing exposed, 1 exposed or unclear |
mitigate --allow LIST [--web auto|apache|nginx] [--dir DIR] [--server-name NAME] [--dry-run] [--reload] [--force] |
Changes the host (root). The project's suggestion, not Joomla's: restricts /administrator to the addresses or CIDRs in LIST (comma separated) plus loopback; every other address gets a 403. Acts only when an exposed Joomla is found. --allow is mandatory, because without it everyone would be locked out. Apache: psf-joomla-admin-allow.conf with Require ip, checked with a configtest. nginx: a geo and map block included right after http { and an include at the top of every PHP-serving server block, checked with nginx -t. If the web server rejects the result, everything is undone at once. Reloads nothing unless you add --reload |
rollback [--dry-run] [--reload] |
Removes what mitigate added and restores the files it edited |
version |
Prints the script version |
Commands that change the host need root. Run them with sudo from an admin account, not from a root login, so the change is recorded against a person. The script stops and prints the exact command if you forget:
sudo ./joomla-check.sh mitigate --allow 203.0.113.0/24 --dry-run
sudo ./joomla-check.sh mitigate --allow 203.0.113.0/24
sudo ./joomla-check.sh rollback
Mitigation: restrict the administrator path
Most of these flaws need a logged-in account, so limiting who can reach the login reduces the exposure. Run ./joomla-check.sh mitigate --allow 203.0.113.0/24 --dry-run, then again without --dry-run and with --reload. Verified on nginx 1.24: from an address outside the list, /administrator/index.php, /administrator/ and /ADMINISTRATOR/index.php get 403. From loopback the request still reaches the PHP handler. /index.php and static files are unaffected; rollback restores the original behavior. On Apache 2.4.58 the same restriction answered 403 from a non-allowed address and 200 from loopback on every virtual host.
If a proxy or CDN sits in front of the server, the address the web server sees is the proxy's, so the rule would lock everyone out or let everyone in. Make sure real client addresses reach the web server first, and keep a second way in, such as a second session or console access. This is PrivacySafe's recommendation. The fix is to update to 5.4.9 or 6.1.4 or newer.
Update
Update from the administrator (System, Update, Joomla) or with the update package. Joomla documents no workaround. Until then the project suggests limiting who holds Manager or higher and restricting the administrator path by address, since most of these flaws need a logged-in account. That is not Joomla's guidance.
Sources
Before you run it
- The fix. Update to 5.4.9 or later in 5.x, or to 6.1.4 or later. Sites on 3.x, 4.x or 5.0 to 5.3 move to 5.4.9 or 6.1.4 or later: those branches are past security support.
- Two flaws are rated High. CVE-2026-90915 (arbitrary directory deletion through the cache purge action) and CVE-2026-92222 (server-side request forgery, which needs a Manager account or above). The SSRF flaw reaches back to 3.0.0.
- The release is broader than the CVE list. 5.4.9 and 6.1.4 fix 16 core issues. The script names the ones in its README, and the same update fixes the rest.
- There is no hunt. No indicators of exploitation have been published.
- It also checks running docker and podman containers, unless you name a directory or set
SCAN_CONTAINERS=0. The check finds installs inside running docker and podman containers by their marker file, copies only the files it reads into a private temporary directory, and judges them like a host install. A path shown as.../docker_NAME_PATHis the PATH inside the container NAME. It never runs anything in a container beyondfindand a file copy, never copies.envorwp-config.php, never keeps a staged symlink, and is skipped when you name directories yourself.
The Security Patches software and this documentation are dedicated to the public domain under CC0 1.0 Universal. Other pages on privacysafe.app/docs are CC BY-SA 4.0 unless the page says otherwise.