A public front door on your Joomla template that lets anyone rewrite or delete files without knocking
Helix3 is JoomShaper's template framework — the scaffolding under a huge percentage of Joomla themes. Versions 1.0 through 3.1.0 expose an onAjaxHelix3 handler through Joomla's com_ajax dispatcher, which by design will route requests to a plugin's ajax handler for any anonymous visitor. Helix3 assumed Joomla enforced auth; Joomla assumed the plugin did. The result: the save, remove, and template-parameter actions execute before any session token or permission check, letting an unauthenticated attacker write arbitrary JSON files (with path traversal breaking out of the intended layout folder), delete arbitrary files, and overwrite template parameters — which in practice means injecting JavaScript directly into the theme.
The vendor's HIGH (7.5) rating is directionally correct but *understated*. The CVSS vector caps at I:H / A:N / C:N, but in practice arbitrary file write into the template + template-parameter injection is a straight path to stored XSS across every page, and file delete against Joomla's config or index files takes the site offline. Automated botnets are already exploiting this in the wild — the Hacked by antonkill / trenggalek6etar defacement campaigns are Helix3 fingerprints. This deserves an upgrade for exploitation-in-the-wild and the practical RCE-adjacent impact via JS injection.
5 steps from start to impact.
Locate a Joomla site running Helix3 ≤ 3.1.0
sp-, helix3 in template paths, or the /plugins/system/helix3/ asset path). Mass scanners like the public shinthink/CVE-2026-49049 scanner and Shodan queries for html:sp-page-builder enumerate targets in bulk.- Internet-reachable Joomla site
- Helix3 framework 1.0–3.1.0 installed and enabled
- Sites behind a WAF filtering
option=com_ajaxtraffic - Helix3 v2.x is only vulnerable to save/remove — narrower surface
Hit the unauthenticated com_ajax → onAjaxHelix3 endpoint
/index.php?option=com_ajax&plugin=helix3&format=json with an action parameter selecting save, remove, or a template-parameter update. Joomla's com_ajax dispatches to the plugin handler with no session token requirement because the handler itself never validates one.com_ajaxcomponent enabled (default)- Helix3 system plugin enabled (default when using the framework)
- ModSecurity CRS may flag
../traversal payloads in thefileparameter - Aggressive rate-limits on
com_ajaxfrom CDNs like Cloudflare
com_ajax referencing plugin=helix3 — grep-able signature.Weaponize save → arbitrary JSON write with traversal
save action writes attacker-controlled content to a file forced to end in .json but does not sanitize the path, allowing ../ traversal outside the template's layout folder. Public PoC on sploitus and the GHSA writeup demonstrate writing crafted JSON that later gets consumed as template parameters.- Web server user has write permission on template directories (default install condition)
- Hardened installs mounting
/templates/read-only - SELinux/AppArmor confining Apache/php-fpm write scope
/templates/**/*.json catches this immediately.Inject JS via template parameter overwrite → stored XSS + defacement
document.write / DOM replacement to deface the entire page (Hacked by antonkill, Hacked by trenggalek6etar). Session theft, credential harvesting on admin login, and cryptojacking are the obvious next-stage payloads.- Successful save/param-update from step 3
- Strict CSP with
script-srcallowlist blocks inline injection — vanishingly rare on Joomla templates
Optional: arbitrary file delete → outage or auth bypass
remove action provides an alternate primitive: delete arbitrary files. Deleting configuration.php or template index.php files takes the site offline; deleting cached auth artifacts can force reinitialization paths. Combined with the write primitive, dropping a PHP webshell into a writable Joomla directory is trivial where the extension whitelist can be bypassed.- Web server write/delete permissions on target file
- Immutable-file mounts, containerized read-only rootfs
The supporting signals.
| In the wild | Active mass exploitation. Automated botnets defacing sites with Hacked by antonkill and Hacked by trenggalek6etar payloads via Helix3 template parameter injection. |
|---|---|
| Public PoC | Yes — sploitus exploit entry and a public scanner at shinthink/CVE-2026-49049. |
| EPSS | 0.00228 (~0.2%) — *low but stale*; expected to climb as defacement telemetry is ingested. |
| KEV | Not listed as of 2026-07-09. Given in-the-wild defacement campaigns, CISA addition is plausible. |
| CVSS | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N = 7.5 HIGH. Vector understates A: arbitrary file delete plainly breaks availability. |
| Affected versions | Helix3 1.0 through 3.1.0. Helix3 2.x only vulnerable to save/remove actions (narrower but still critical). |
| Fixed version | Helix3 3.1.1, released 2026-06-29 by JoomShaper. No distro backports — this is a Joomla extension update only. |
| Exposure | Helix3 underpins a substantial slice of Joomla templates (JoomShaper is one of the top-3 Joomla template vendors). Shodan/BuiltWith show tens of thousands of live Helix3 instances. |
| Disclosed | 2026-06-29 (coordinated with patch release). |
| Reporter | Phil Taylor (mySites.guru). |
noisgate verdict.
Active in-the-wild exploitation by defacement botnets against an unauthenticated, network-reachable primitive on a widely-installed Joomla template framework is the single decisive factor holding this at HIGH and pushing the score above the vendor's 7.5. It does not clear the CRITICAL floor because the affected component is a public-facing web template plugin — blast radius is bounded to the compromised site, not fleet, identity, or supply-chain infrastructure.
Why this verdict
- Unauthenticated + network reachable + trivial payload — no PR, no UI, one HTTP POST. The friction audit finds *zero* prerequisite that assumes a prior compromise stage.
- Active exploitation, PoC in the wild. Public scanner and PoC are already weaponized by defacement botnets; EPSS will catch up.
- Role multiplier — public-facing CMS: the chain succeeds on every reachable install. Blast radius per site: stored XSS, defacement, file deletion, credential harvest on admin login. Not fleet-scale — bounded to that host/site.
- Role multiplier — not a high-value-role component. Helix3 is a template framework, not an IdP, hypervisor, CA, PAM, backup, or edge appliance. No path from one compromised Joomla site to domain, tenant, or supply-chain compromise. This is why the CRITICAL floor does not trigger.
- Vendor score understated I:H impact. Availability is also broken (file delete → outage), and JS injection into template params is functionally stored XSS at every request — worth +0.7 above vendor 7.5.
Why not higher?
CRITICAL is reserved for chains that end in fleet, identity, hypervisor, or supply-chain compromise. Helix3 sits on a public-facing content tier; a compromised Joomla instance is a bad day for that site, not the enterprise identity plane. There is also no known unauthenticated RCE primitive — only file write with a .json extension constraint — so the RCE path requires additional chaining.
Why not lower?
Downgrading to MEDIUM would ignore that this is unauthenticated, network-accessible, actively exploited by automation, and has public PoC and scanner code. Any of those four conditions individually would keep it out of MEDIUM; all four together make HIGH the floor.
What to do — in priority order.
- Upgrade Helix3 to 3.1.1 immediately — The only real fix. Log into Joomla admin → Extensions → Manage → Update, or drop the 3.1.1 package manually. Deploy within 3 days per noisgate mitigation SLA given active exploitation.
- WAF rule blocking
com_ajax+plugin=helix3from unauthenticated sources — As a stopgap while you stage the upgrade, block or challenge any request matchingoption=com_ajax&plugin=helix3that doesn't carry a valid admin session cookie. Cloudflare/Akamai/ModSecurity all support this in a single custom rule. Deploy within hours, not days. - File integrity monitoring on
/templates/and/plugins/system/helix3/— Wazuh, OSSEC, or Tripwire alerting on any write/delete under those paths catches both this exploit and its persistence. Enable in parallel with the WAF rule. - Audit templates for injected JS in template parameters NOW — Before patching, check
paramsfields in the Helix3 template options for<script>,document.write,eval, or unfamiliar URLs. Patching does not remove already-planted payloads. - Rotate admin credentials post-cleanup — If JS injection has been live for any period, assume harvested admin sessions/credentials. Force password reset + invalidate all sessions before re-enabling admin login.
- Disabling the Joomla
com_ajaxcomponent globally — breaks legitimate extensions and doesn't survive updates. - Web-server-level auth on
/administrator/— the vulnerable endpoint is under the public frontend/index.php, not/administrator/. - Stopping at 'restore from backup' — if the backup is post-compromise, you re-import the injection. You must verify template params are clean *and* patch before restore.
- Relying on CSP — most Joomla templates ship permissive or absent CSP; expect the injected inline script to execute.
Crowdsourced verification payload.
Run this from an auditor workstation against a target site. Invoke as ./check-helix3.sh https://target.example.com. No credentials required — the check probes the same unauthenticated endpoint the exploit uses, then also parses the site HTML for a Helix3 version marker. Requires curl and grep.
#!/usr/bin/env bash
# noisgate verifier: CVE-2026-49049 — Helix3 Joomla unauth ajax handler
# Usage: ./check-helix3.sh https://target.example.com
set -u
TARGET="${1:-}"
if [ -z "$TARGET" ]; then
echo "usage: $0 https://target.example.com" >&2
exit 2
fi
UA='noisgate-verifier/1.0 (CVE-2026-49049)'
AJAX_URL="${TARGET%/}/index.php?option=com_ajax&plugin=helix3&format=json"
HOME_URL="${TARGET%/}/"
# 1. Fingerprint Helix3 presence
HTML=$(curl -s -A "$UA" -L --max-time 15 "$HOME_URL" || true)
if ! echo "$HTML" | grep -qiE 'helix3|sp-page|sp_helix'; then
echo "UNKNOWN: no Helix3 fingerprint on $TARGET"
exit 3
fi
# 2. Probe unauthenticated ajax handler with a benign action.
# A patched (3.1.1+) install rejects unauthenticated calls; vulnerable
# installs return a JSON response from the handler itself.
RESP=$(curl -s -A "$UA" -L --max-time 15 \
-H 'X-Requested-With: XMLHttpRequest' \
--data 'action=noisgate_probe' \
"$AJAX_URL" || true)
# Patched builds should return an authorization error or a 403.
HTTP_CODE=$(curl -s -A "$UA" -L --max-time 15 -o /dev/null -w '%{http_code}' \
-H 'X-Requested-With: XMLHttpRequest' \
--data 'action=noisgate_probe' \
"$AJAX_URL" || true)
if [ "$HTTP_CODE" = "403" ] || echo "$RESP" | grep -qiE 'not authoriz|forbidden|access denied|invalid token'; then
echo "PATCHED: Helix3 fingerprint present but ajax handler rejects unauthenticated calls ($TARGET)"
exit 0
fi
if echo "$RESP" | grep -qiE '"success"|"data"|"message"|helix3'; then
echo "VULNERABLE: unauthenticated onAjaxHelix3 handler responded on $TARGET"
echo " → upgrade Helix3 to 3.1.1 immediately (CVE-2026-49049)"
exit 1
fi
echo "UNKNOWN: inconclusive response (HTTP $HTTP_CODE) — manual review required"
exit 3
If you remember one thing.
com_ajax&plugin=helix3 within hours. (3) Upgrade every Helix3 install to 3.1.1; per the noisgate mitigation SLA, the WAF/temporary block goes in within ≤3 days because this is under active exploitation, and per the noisgate remediation SLA the vendor patch itself must be applied within ≤90 days — but with public PoC and defacement botnets running, treat 3.1.1 as the same-week ceiling, not a quarterly item. (4) Before patching, audit template params for injected <script> and rotate admin credentials on any site where injection is found. KEV-listing is plausible in the next 30 days; don't wait for it.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.