A public event-submission form that hands anonymous strangers a PHP shell drop-box wired straight to the web root
CVE-2026-48939 is an unauthenticated arbitrary file upload in the iCagenda Joomla extension's frontend event-registration form. The controller layer skips file-type checks (access control is only enforced at the view layer — CWE-284/CWE-434), and uploads land directly under /images/icagenda/frontend/attachments/ inside the web root, where PHP is executable. Any anonymous internet visitor can POST a .php webshell and immediately fetch it via GET. Affected: iCagenda 1.0.0 through 4.0.7; fixed in 4.0.8 (mainline, 2026-06-15) and 3.9.15 (legacy branch, 2026-06-16).
The vendor CVSS of 9.8 (some feeds list 10.0) is accurate — this is a textbook pre-auth RCE on a component whose entire purpose is to be internet-facing. Add active exploitation since June 15, 2026 and CISA KEV inclusion with a remediation due date of July 13, 2026 (yesterday), and there is no plausible reading that softens this. If iCagenda is installed on a public Joomla site, assume compromise until proven otherwise.
4 steps from start to impact.
Discover an iCagenda-enabled Joomla site
/index.php?option=com_icagenda or the event submission route. Mass-scanning uses httpx + nuclei templates that landed within hours of the advisory, plus Shodan/FOFA queries for com_icagenda. Google dorks like inurl:option=com_icagenda return tens of thousands of results.- Target runs Joomla with iCagenda ≤ 4.0.7
- Frontend event submission form is reachable (default)
- Some admins disable the public submission form
- WAFs may block
com_icagendafingerprint requests
CVE-2026-48939.yaml published; Wordfence-style Joomla plugin scanners flag installed version.POST a PHP webshell via the attachment field
file field containing a .php (or .phtml, .phar) payload. The controller writes the file verbatim to /images/icagenda/frontend/attachments/<filename> without extension whitelist, MIME sniffing, or filename randomization. Public PoC by shinthink on GitHub automates this in ~15 lines of Python.- HTTP POST reachable to the event submission endpoint
- No upload-blocking WAF rule in front
- ModSecurity CRS PL2+ blocks
.phpin multipart uploads - Cloudflare/Sucuri managed rulesets shipped virtual patches within 48h
POST to iCagenda submit endpoint from unusual IPs, followed by GET of a new .php in the attachments dir.Execute the webshell and pivot
GET /images/icagenda/frontend/attachments/shell.php?cmd=id. PHP-FPM executes as the webserver user (typically www-data/apache/nginx). Observed post-ex activity per Sucuri and TheHackerNews reporting: cron backdoors, credential theft from configuration.php, mass SEO spam injection, and pivoting to shared-hosting neighbours.- PHP execution enabled in the uploads path (Apache/Nginx default)
- Outbound egress permitted for C2
- Nginx
location ~ /images/ { ... }blocks with.phpdeny stops it dead - suEXEC / open_basedir limits lateral file access
php spawning sh, wget, curl, or python; egress to known C2 IPs (feeds from Abuse.ch, Sucuri).Establish persistence and monetize
index.php or a fake com_ajax plugin, harvests configuration.php (DB creds), and either sells access, deploys a coin miner, or joins the box into a Balbooa/iCagenda-fed botnet observed by CISA.- Write access to Joomla directory tree (usually yes for
www-data) - No FIM / immutable-file protections
- Read-only filesystem for
/administratorbreaks persistence - OSSEC/Wazuh FIM alerts on Joomla core modifications
.htaccess changes.The supporting signals.
| In-the-wild status | Active mass exploitation since 2026-06-15 (zero-day). Reported by CISA, TheHackerNews, and Sucuri. |
|---|---|
| KEV status | Listed on CISA KEV; remediation due date 2026-07-13 (federal deadline already passed). |
| Public PoC | shinthink/CVE-2026-48939 — pre-auth RCE exploit, ~15 lines Python. Nuclei template also public. |
| EPSS | 0.01505 — deceptively low; EPSS lags fresh KEV entries. Treat as ≥0.90 given confirmed ITW mass-exploit. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H → network, no auth, no UI, full CIA. Score 9.8 (NVD) / 10.0 (vendor). |
| Affected versions | iCagenda 1.0.0 through 4.0.7 (all released versions prior to the patch). |
| Fixed versions | 4.0.8 (2026-06-15, mainline) and 3.9.15 (2026-06-16, legacy 3.x branch). |
| Exposure data | Shodan/FOFA return tens of thousands of Joomla sites with com_icagenda fingerprint. Small-org and municipality sites over-represented. |
| Disclosure | 2026-06-20 — disclosed AFTER exploitation began; classic zero-day pattern. |
| Reporter | Sucuri incident-response team surfaced the pattern in customer logs; JoomliC (vendor) shipped fix within hours. |
noisgate verdict.
Verdict is CRITICAL because the single most decisive factor is active KEV-listed mass exploitation of an unauthenticated pre-auth RCE on a public-facing web component — every friction check (auth, UI, network position) is bypassed by design. The affected role — a Joomla extension on a public site — IS the high-value external footprint; the blast radius is full webserver RCE with pivot potential into DB, tenant, and shared-hosting neighbours.
Why this verdict
- KEV-listed with due date already passed (2026-07-13) — CISA has independently validated exploitation; federal agencies are already out of SLA.
- Zero prerequisites:
AV:N/AC:L/PR:N/UI:N. The attacker needs an HTTP client and the target URL. No credentials, no phishing, no internal foothold. - Public weaponized exploit on GitHub plus Nuclei template — commoditized, script-kiddie tier.
- Role multiplier: iCagenda by design runs on public Joomla sites. Every install occupies the internet-facing role — there is no low-value deployment tier. Blast radius is host RCE → DB credential theft (Joomla
configuration.php) → tenant/shared-host pivot. - Friction audit fails to reduce severity: no friction point narrows the population. WAFs help but are not universal; Joomla small-shop deployments rarely front-end with ModSecurity.
Why not higher?
CRITICAL is the ceiling in this schema. Impact is capped at webserver-user RCE — it is not kernel, not identity provider, not hypervisor. A single compromised Joomla site is unlikely to cascade to enterprise-fleet takeover unless the site shares infrastructure with more sensitive tiers.
Why not lower?
Every downgrade lever fails: exploitation is active and confirmed (not theoretical), the exploit is public (not researcher-only), there are no auth prerequisites (not post-auth), and the affected component is definitionally internet-facing (not internal-only). Downgrading below HIGH would require ignoring KEV and ITW evidence.
What to do — in priority order.
- Take iCagenda offline immediately if you cannot patch today — Unpublish or uninstall the
com_icagendacomponent via Joomla Extensions Manager. This is the noisgate CRITICAL mitigation SLA of ≤3 days — for KEV+ITW the effective window is hours. If the extension is business-critical, block frontend event submission via.htaccessdeny on the submit route until patched. - Deny PHP execution in the uploads directory — Add an Nginx
location ~ /images/icagenda/.*\.php$ { deny all; }or Apache<FilesMatch "\.ph(p[3457]?|t|tml|ar)$">Require all denied</FilesMatch>block scoped to/images/icagenda/frontend/attachments/. Deploy within hours, well inside the ≤3-day mitigation SLA. - Hunt for existing webshells — Search
/images/icagenda/frontend/attachments/recursively for.php,.phtml,.phar, and any file with PHP shebang or<?phpcontent. Grep webserver access logs from 2026-06-01 onward for POSTs to iCagenda submission endpoints followed by GETs of new files in that directory. Assume-breach if the extension was exposed. - Rotate Joomla DB credentials and admin passwords — If exposure existed prior to patching, treat
configuration.phpas leaked. Rotate DB user password, Joomla super-user passwords, any API tokens embedded in the config, and revoke sessions. - Deploy WAF virtual patch — Cloudflare, Sucuri, and Wordfence have published rules blocking multipart uploads containing PHP magic bytes to iCagenda endpoints. Enable within hours as a stopgap while planning the version upgrade.
- Renaming the extension directory — the vulnerable route is registered by Joomla's component router, not by directory name.
- MFA on the Joomla admin panel — the exploit does not touch admin auth; it hits the anonymous public form.
- IP-allowlisting the admin panel — same reason; the endpoint is public by design.
- Relying on
disable_functionsin PHP — the shell still gets code execution and can proxy via file writes even ifexec/systemare blocked.
Crowdsourced verification payload.
Run this on the Joomla webserver host as the user owning the Joomla install (or root). Invoke as ./check_icagenda.sh /var/www/html. It reads the iCagenda manifest, compares version to the patched baselines, and inspects the attachments directory for suspicious PHP artifacts.
#!/usr/bin/env bash
# noisgate verifier — CVE-2026-48939 (iCagenda Joomla RCE)
# Usage: ./check_icagenda.sh <joomla_webroot>
# Exits 0 PATCHED, 1 VULNERABLE, 2 UNKNOWN
set -u
ROOT="${1:-/var/www/html}"
MANIFEST="$ROOT/administrator/components/com_icagenda/icagenda.xml"
ATTACH_DIR="$ROOT/images/icagenda/frontend/attachments"
if [ ! -f "$MANIFEST" ]; then
echo "UNKNOWN: iCagenda manifest not found at $MANIFEST"
exit 2
fi
VER=$(grep -oE '<version>[^<]+' "$MANIFEST" | head -n1 | sed 's/<version>//')
if [ -z "$VER" ]; then
echo "UNKNOWN: could not parse version"
exit 2
fi
echo "Installed iCagenda version: $VER"
# semver-ish compare: patched if >=4.0.8, or >=3.9.15 on 3.x branch
vuln=1
IFS='.' read -r MAJ MIN PAT <<< "$VER"
MAJ=${MAJ:-0}; MIN=${MIN:-0}; PAT=${PAT:-0}
if [ "$MAJ" -gt 4 ]; then vuln=0; fi
if [ "$MAJ" -eq 4 ] && { [ "$MIN" -gt 0 ] || [ "$PAT" -ge 8 ]; }; then vuln=0; fi
if [ "$MAJ" -eq 3 ] && [ "$MIN" -eq 9 ] && [ "$PAT" -ge 15 ]; then vuln=0; fi
# Even patched — hunt for planted shells
SHELLS=0
if [ -d "$ATTACH_DIR" ]; then
SHELLS=$(find "$ATTACH_DIR" -type f \( -iname '*.php' -o -iname '*.phtml' -o -iname '*.phar' -o -iname '*.php[3457]' \) 2>/dev/null | wc -l)
if [ "$SHELLS" -gt 0 ]; then
echo "WARNING: $SHELLS suspicious PHP-executable file(s) found in $ATTACH_DIR:"
find "$ATTACH_DIR" -type f \( -iname '*.php' -o -iname '*.phtml' -o -iname '*.phar' \) -printf ' %p (mtime %TY-%Tm-%Td)\n'
fi
fi
if [ "$vuln" -eq 1 ]; then
echo "VULNERABLE: iCagenda $VER is affected by CVE-2026-48939. Upgrade to 4.0.8 or 3.9.15."
exit 1
fi
if [ "$SHELLS" -gt 0 ]; then
echo "VULNERABLE: iCagenda patched but suspicious artifacts present — assume prior compromise."
exit 1
fi
echo "PATCHED: iCagenda $VER is not affected and attachments dir is clean."
exit 0
If you remember one thing.
com_icagenda ≤ 4.0.7, and treat those hosts as assumed-breach given exploitation began 2026-06-15. Per the noisgate mitigation SLA for CRITICAL (≤3 days) — and effectively within hours given KEV+ITW status — deploy the Nginx/Apache PHP-execution deny rule on /images/icagenda/frontend/attachments/, unpublish the extension if not business-critical, and enable the vendor WAF virtual patch. Per the noisgate remediation SLA for CRITICAL (≤90 days) — but sensibly compressed to ≤7 days here — upgrade to iCagenda 4.0.8 (or 3.9.15 on the legacy branch), then run the verifier to confirm both version and clean attachments directory. On any host where the extension was reachable pre-patch, rotate configuration.php DB credentials, rotate Joomla super-user passwords, and hunt for cron/.htaccess/template-file persistence before restoring to production.Sources
- CISA KEV — CVE-2026-48939
- TheHackerNews — iCagenda and Balbooa Joomla flaws exploited as zero-days
- BleepingComputer — CISA warns of actively exploited Joomla extension RCE flaws
- SecurityWeek — Organizations warned of exploited Joomla extension vulnerabilities
- IONIX threat center — CVE-2026-48939
- shinthink/CVE-2026-48939 PoC (GitHub)
- mySites.guru — iCagenda Zero Day File Upload RCE Fixed in 4.0.8
- SentinelOne vulnerability database — CVE-2026-48939
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.