← Back to Feed CACHED · 2026-07-13 20:14:37 · CACHE_KEY CVE-2026-48939
CVE-2026-48939 · CWE-434 · Disclosed 2026-06-20

iCagenda Joomla extension unauthenticated arbitrary file upload → RCE

ASSESSED — NOISGATE
Vendor
—
—
—
Reassessed
—
—
—
Verdict: —
Do you agree?
01 · The Real Story

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.

"Unauth PHP shell upload, KEV-listed, mass-exploited since June 15. Patch or rip out iCagenda by end of week — no negotiation."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Discover an iCagenda-enabled Joomla site

Attacker fingerprints Joomla sites exposing /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.
Conditions required:
  • Target runs Joomla with iCagenda ≤ 4.0.7
  • Frontend event submission form is reachable (default)
Where this breaks in practice:
  • Some admins disable the public submission form
  • WAFs may block com_icagenda fingerprint requests
Detection/coverage: Nuclei template CVE-2026-48939.yaml published; Wordfence-style Joomla plugin scanners flag installed version.
STEP 02

POST a PHP webshell via the attachment field

Attacker submits the event form with a multipart 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.
Conditions required:
  • HTTP POST reachable to the event submission endpoint
  • No upload-blocking WAF rule in front
Where this breaks in practice:
  • ModSecurity CRS PL2+ blocks .php in multipart uploads
  • Cloudflare/Sucuri managed rulesets shipped virtual patches within 48h
Detection/coverage: Web access logs show POST to iCagenda submit endpoint from unusual IPs, followed by GET of a new .php in the attachments dir.
STEP 03

Execute the webshell and pivot

Attacker requests 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.
Conditions required:
  • PHP execution enabled in the uploads path (Apache/Nginx default)
  • Outbound egress permitted for C2
Where this breaks in practice:
  • Nginx location ~ /images/ { ... } blocks with .php deny stops it dead
  • suEXEC / open_basedir limits lateral file access
Detection/coverage: EDR on the host flags php spawning sh, wget, curl, or python; egress to known C2 IPs (feeds from Abuse.ch, Sucuri).
STEP 04

Establish persistence and monetize

Attacker plants a secondary backdoor in the Joomla template 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.
Conditions required:
  • Write access to Joomla directory tree (usually yes for www-data)
  • No FIM / immutable-file protections
Where this breaks in practice:
  • Read-only filesystem for /administrator breaks persistence
  • OSSEC/Wazuh FIM alerts on Joomla core modifications
Detection/coverage: File integrity monitoring on Joomla install root; unexpected .htaccess changes.
03 · Compensating Control

1
Take iCagenda offline immediately if you cannot patch today — Unpublish or uninstall the com_icagenda component 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 .htaccess deny on the submit route until patched.
2
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.
3
Hunt for existing webshells — Search /images/icagenda/frontend/attachments/ recursively for .php, .phtml, .phar, and any file with PHP shebang or <?php content. 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.
4
Rotate Joomla DB credentials and admin passwords — If exposure existed prior to patching, treat configuration.php as leaked. Rotate DB user password, Joomla super-user passwords, any API tokens embedded in the config, and revoke sessions.
5
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.
What doesn't work
  • 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_functions in PHP — the shell still gets code execution and can proxy via file writes even if exec/system are blocked.
04 · Intelligence Metadata

The supporting signals.

In-the-wild statusActive mass exploitation since 2026-06-15 (zero-day). Reported by CISA, TheHackerNews, and Sucuri.
KEV statusListed on CISA KEV; remediation due date 2026-07-13 (federal deadline already passed).
Public PoCshinthink/CVE-2026-48939 — pre-auth RCE exploit, ~15 lines Python. Nuclei template also public.
EPSS0.01505 — deceptively low; EPSS lags fresh KEV entries. Treat as ≥0.90 given confirmed ITW mass-exploit.
CVSS vectorCVSS: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 versionsiCagenda 1.0.0 through 4.0.7 (all released versions prior to the patch).
Fixed versions4.0.8 (2026-06-15, mainline) and 3.9.15 (2026-06-16, legacy 3.x branch).
Exposure dataShodan/FOFA return tens of thousands of Joomla sites with com_icagenda fingerprint. Small-org and municipality sites over-represented.
Disclosure2026-06-20 — disclosed AFTER exploitation began; classic zero-day pattern.
ReporterSucuri incident-response team surfaced the pattern in customer logs; JoomliC (vendor) shipped fix within hours.

Sources.

  1. CISA KEV — CVE-2026-48939
  2. TheHackerNews — iCagenda and Balbooa Joomla flaws exploited as zero-days
  3. BleepingComputer — CISA warns of actively exploited Joomla extension RCE flaws
  4. SecurityWeek — Organizations warned of exploited Joomla extension vulnerabilities
  5. IONIX threat center — CVE-2026-48939
  6. shinthink/CVE-2026-48939 PoC (GitHub)
  7. mySites.guru — iCagenda Zero Day File Upload RCE Fixed in 4.0.8
  8. SentinelOne vulnerability database — CVE-2026-48939
05 · The Call

Final Verdict
= UNCHANGED to CRITICAL (9.8/10)

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.

06 · Verification

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.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/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