NVD has published CVE-2026-90937, a CVSS 9.9 (Critical) vulnerability in Froxlor, the open-source server administration panel widely deployed by web hosting providers and shared-hosting operators. The flaw is network-exploitable and requires only a low-privileged authenticated customer account — exactly the kind of access any paying shared-hosting customer already has.
The root cause: Froxlor versions prior to 2.2.5 fail to validate newline characters in subdomain redirect URLs. When Froxlor's cron job rebuilds web server virtual host configurations, attacker-supplied URLs containing literal newlines are written verbatim into nginx or Apache vhost files. That gives an authenticated customer the ability to inject arbitrary web server configuration directives — corrupting configurations, denying service across all hosted domains, or hijacking HTTP responses for every site on the box.
If you operate shared hosting infrastructure, resell hosting, or manage panels for customers, this is a patch-now issue. A single malicious tenant can take down — or silently weaponize — every domain co-hosted on the same server.
Technical Analysis
Affected Products and Versions
| Attribute | Detail |
|---|---|
| Product | Froxlor server management panel |
| Affected versions | All versions before 2.2.5 |
| Fixed version | Froxlor 2.2.5 |
| CVE | CVE-2026-90937 |
| CVSS v3.x | 9.9 (Critical) |
| Attack vector | Network |
| Privileges required | Low (authenticated customer account) |
| Impacted components | Generated nginx / Apache vhost configuration files |
| Reference | https://nvd.nist.gov/vuln/detail/CVE-2026-90937 |
How the Vulnerability Works (Defender's View)
The attack chain is straightforward and dangerously reliable:
- Attacker authenticates as a standard Froxlor customer — no elevated panel privileges needed. On a shared host, this is a commodity account costing a few dollars a month.
- Malicious redirect URL is saved. When creating or editing a subdomain, the customer supplies a redirect target URL containing literal newline characters (
\n/ CRLF). Froxlor fails to sanitize or reject these characters. - Cron rebuild writes the payload to disk. Froxlor's scheduled configuration rebuild regenerates vhost files (typically under
/etc/nginx/sites-enabled/,/etc/nginx/conf.d/, or/etc/apache2/sites-enabled/). The injected newline breaks out of the intended directive context, and everything after it is interpreted as new, attacker-controlled configuration directives. - Web server reloads with attacker-controlled configuration. Depending on the directives injected, the attacker can:
- Corrupt the configuration so nginx/Apache fails to restart → denial of service for every hosted domain.
- Inject
return,rewrite, orproxy_passdirectives to redirect or proxy victim traffic to attacker infrastructure → credential harvesting, malware delivery, SEO poisoning. - Alter
root/aliaspaths or addlocationblocks to expose files outside intended document roots. - Inject logging or response-header manipulation to hijack HTTP responses across co-hosted domains.
Why CVSS 9.9 — Scope Change Is the Killer
The near-maximal score reflects a scope change: a vulnerability in the customer-facing panel compromises the entire web server security authority. One tenant's action impacts the confidentiality and integrity of all tenants' sites and their visitors. In multi-tenant hosting, this collapses the trust boundary the entire business model depends on.
Exploitation Requirements and Status
- Authentication required: Yes — a valid customer-level Froxlor account. This is not a meaningful barrier in shared-hosting environments; treat this as exploitable by any tenant.
- User interaction: None.
- Exploitation status: At time of publication, check the NVD entry and CISA KEV catalog for updates on in-the-wild exploitation. Given the low complexity and the high-value target (hosting providers aggregate thousands of domains), assume motivated attackers will move quickly. The configuration-write primitive is trivially weaponizable — do not wait for a public PoC to act.
Detection & Response
The strongest detection surface is the web server configuration layer itself: unexpected vhost modifications, config-test failures, and anomalous directives appearing in generated files. Secondary surfaces include Froxlor cron activity and web server reload events.
Sigma Rules
The following rules target the two most reliable observables: (1) unauthorized modification of nginx/Apache vhost configuration files, and (2) nginx configuration test failures indicating corrupted or maliciously altered configs.
---
title: Web Server Vhost Configuration Modified Outside Change Window
id: 3f8a1c94-7b2e-4d51-9a06-8c4e5f2a91b7
status: experimental
description: Detects modification of nginx or Apache virtual host configuration files. In Froxlor-managed environments, vhost files are regenerated only by the Froxlor cron job; writes at unexpected times or with suspicious content may indicate CVE-2026-90937 config injection.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-90937
author: Security Arsenal
date: 2026/04/06
tags:
- attack.defense_evasion
- attack.t1554
logsource:
category: file_event
product: linux
detection:
selection_path:
TargetFilename|contains:
- '/etc/nginx/sites-enabled/'
- '/etc/nginx/sites-available/'
- '/etc/nginx/conf.d/'
- '/etc/apache2/sites-enabled/'
- '/etc/apache2/sites-available/'
- '/etc/httpd/conf.d/'
- '/etc/httpd/conf/vhosts/'
filter_known_cron_window:
# Tune: suppress events matching your known Froxlor cron rebuild window
Image|endswith:
- '/froxlor'
condition: selection_path and not filter_known_cron_window
falsepositives:
- Legitimate administrator vhost edits during maintenance windows
- Froxlor cron rebuilds (tune the filter to your cron schedule)
level: high
---
title: Nginx or Apache Configuration Test Failure
id: 9d2c5e81-4a6f-4b38-a1d7-5e9c3f7b2048
status: experimental
description: Detects failed nginx or Apache configuration validation (nginx -t / apachectl configtest). A sudden config-test failure on a hosting server may indicate injected or corrupted vhost directives from CVE-2026-90937 exploitation, which can also cause service-wide denial of service.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-90937
author: Security Arsenal
date: 2026/04/06
tags:
- attack.impact
- attack.t1499
logsource:
category: process_creation
product: linux
detection:
selection_test:
Image|endswith:
- '/nginx'
- '/apachectl'
- '/apache2ctl'
- '/httpd'
CommandLine|contains:
- ' -t'
- 'configtest'
condition: selection_test
falsepositives:
- Routine administrator config validation before reloads
level: medium
Analyst note on tuning: The vhost-modification rule is only useful if you baseline your Froxlor cron schedule. Froxlor regenerates configs on a fixed cadence — typically every 5–15 minutes via /etc/cron.d/froxlor. Any vhost write outside that window, or any reload failure after a rebuild, is your high-fidelity signal. Pair file-integrity monitoring (FIM) with scheduled nginx -t validation after every rebuild.
KQL — Microsoft Sentinel (Syslog/CEF Ingestion)
Hosting servers forwarding syslog to Sentinel can be hunted with the following query. It looks for web server configuration errors, unexpected reloads, and cron activity correlated with config failures.
// Hunt for nginx/Apache config corruption and suspicious vhost changes
// Requires Syslog or CEF ingestion from hosting servers into Sentinel
union isfuzzy=true
(Syslog
| where Facility =~ "cron" or ProcessName has_any ("CRON", "froxlor")
| where SyslogMessage has_any ("froxlor", "vhost", "config")
| project TimeGenerated, Computer, ProcessName, SyslogMessage, Source = "Syslog-Cron"),
(Syslog
| where SyslogMessage has_any ("emerg", "syntax error", "unknown directive", "invalid", "duplicate")
and SyslogMessage has_any ("nginx", "apache2", "httpd")
| project TimeGenerated, Computer, ProcessName, SyslogMessage, Source = "Syslog-WebError"),
(CommonSecurityLog
| where Message has_any ("sites-enabled", "conf.d", "vhost")
and Message has_any ("modified", "written", "error")
| project TimeGenerated, DeviceName = Computer, Message, Source = "CEF")
| order by TimeGenerated desc
| summarize EventCount = count(), SampleMessages = make_set(SyslogMessage, 3) by Computer, Source, bin(TimeGenerated, 15m)
| where EventCount >= 1
| order by TimeGenerated desc
// Targeted hunt: web server reload failures following Froxlor cron execution
Syslog
| where TimeGenerated > ago(24h)
| where SyslogMessage has_any ("froxlor", "nginx", "apache2", "httpd")
| where SyslogMessage has_any ("emerg", "failed", "test failed", "syntax error", "Reloading")
| extend EventType = case(
SyslogMessage has "froxlor", "FroxlorCron",
SyslogMessage has_any ("emerg", "failed", "syntax error"), "ConfigFailure",
"Reload")
| summarize FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated), Events = count(), Messages = make_set(SyslogMessage, 5) by Computer, EventType
| order by Computer asc, FirstSeen asc
Triage guidance: A ConfigFailure event within minutes of a FroxlorCron event on the same host is a strong indicator that a rebuilt vhost file contains injected or malformed directives. Pull the most recently modified files under the vhost directories immediately and diff against the previous generation.
Velociraptor VQL Hunt
For live-response or fleet-wide hunting on hosting servers, this artifact inventories recently modified vhost files and scans them for high-risk injected directives.
-- Hunt for recently modified vhost configs containing high-risk directives
-- CVE-2026-90937: Froxlor newline injection writes attacker directives into vhosts
LET vhost_dirs = (
SELECT FullPath, Mtime, Size
FROM glob(globs=[
'/etc/nginx/sites-enabled/*',
'/etc/nginx/conf.d/*.conf',
'/etc/apache2/sites-enabled/*',
'/etc/httpd/conf.d/*.conf'
])
WHERE Mtime > (now() - 86400)
)
SELECT FullPath,
Mtime,
Size,
read_file(filename=FullPath, length=100000) AS ConfigContent
FROM vhost_dirs
WHERE ConfigContent =~ '(?i)(proxy_pass|return\\s+30[0-9]|rewrite.*(http|https)://|alias\\s+/|root\\s+/tmp|root\\s+/var/tmp|add_header|sub_filter)'
OR ConfigContent =~ '\\r'
ORDER BY Mtime DESC
-- Identify which processes/users touched vhost files in the last 24h
SELECT Pid,
Name,
CommandLine,
Username,
CreateTime
FROM pslist()
WHERE CommandLine =~ '(?i)(nginx|apache2|httpd|froxlor|crontab|sites-enabled|conf\.d)'
ORDER BY CreateTime DESC
What to look for: Injected configs frequently contain proxy_pass to unfamiliar hosts, return 301/302 to external domains the tenant doesn't own, or root/alias paths pointing outside legitimate document roots. CRLF artifacts (\r) in nginx configs on Debian-style systems are also anomalous. Diff modified files against your configuration baseline — in a Froxlor environment, vhosts are fully machine-generated, so any content that didn't originate from panel data is suspect by definition.
Remediation & Verification Script
Use the following Bash script on Froxlor hosting servers to check panel version, scan vhost configurations for injected directives, validate web server configs, and enforce FIM alerting. Run as root.
#!/bin/bash
# CVE-2026-90937 - Froxlor config injection verification & hardening
# Security Arsenal - run as root on Froxlor hosting servers
set -u
echo "=== CVE-2026-90937 Verification & Hardening ==="
# 1. Check Froxlor version
echo "[*] Checking Froxlor version..."
if [ -f /var/www/froxlor/lib/version.inc.php ]; then
grep -E "version|build" /var/www/froxlor/lib/version.inc.php
elif command -v froxlor >/dev/null 2>&1; then
froxlor --version 2>/dev/null || echo "[!] Version check failed - verify manually in panel UI"
else
echo "[!] Froxlor installation not found at default path - check panel footer for version"
fi
echo "[!] REQUIRED: Froxlor >= 2.2.5. Upgrade immediately if below."
# 2. Scan vhost configs for high-risk injected directives
echo "[*] Scanning vhost configs for suspicious directives..."
VHOST_DIRS="/etc/nginx/sites-enabled /etc/nginx/conf.d /etc/apache2/sites-enabled /etc/httpd/conf.d"
for DIR in $VHOST_DIRS; do
if [ -d "$DIR" ]; then
echo "--- Scanning $DIR ---"
grep -rEn 'proxy_pass|return[[:space:]]+30[0-9]|rewrite.*https?://|alias[[:space:]]+/|root[[:space:]]+/tmp|root[[:space:]]+/var/tmp|\r' "$DIR" 2>/dev/null \
| grep -vE '^\s*#|Binary file' || echo "[OK] No high-risk patterns found in $DIR"
fi
done
# 3. Find vhost files modified in last 24h
echo "[*] Vhost files modified in last 24 hours:"
for DIR in $VHOST_DIRS; do
[ -d "$DIR" ] && find "$DIR" -type f -mtime -1 -exec ls -la {} \; 2>/dev/null
done
# 4. Validate web server configuration
echo "[*] Validating web server configuration..."
if command -v nginx >/dev/null 2>&1; then
nginx -t && echo "[OK] nginx config valid" || echo "[CRITICAL] nginx config INVALID - possible injection/corruption"
fi
if command -v apachectl >/dev/null 2>&1; then
apachectl configtest 2>&1 | grep -q "Syntax OK" && echo "[OK] Apache config valid" || echo "[CRITICAL] Apache config INVALID - possible injection/corruption"
fi
# 5. Audit recent Froxlor cron executions
echo "[*] Recent Froxlor cron activity:"
grep -i "froxlor" /var/log/syslog 2>/dev/null | tail -20 || journalctl -u cron --since "24 hours ago" 2>/dev/null | grep -i froxlor | tail -20
# 6. Check for unexpected customer redirect entries in Froxlor DB (adjust credentials)
echo "[*] Manual step: review subdomain redirect targets in Froxlor panel (Domains > Subdomains)"
echo " Look for redirect URLs containing unusual characters, trailing whitespace, or encoded newlines (%0a, %0d)."
echo "=== Verification complete. If any CRITICAL findings: isolate the server, diff vhosts against backup, and audit the responsible customer account. ==="
Remediation
1. Patch Immediately — Froxlor 2.2.5
Upgrade all Froxlor installations to version 2.2.5 or later, which adds newline validation to subdomain redirect URLs. This is the only complete fix.
- Vendor advisory / release: https://github.com/froxlor/froxlor/releases
- NVD entry: https://nvd.nist.gov/vuln/detail/CVE-2026-90937
Verify the version in the panel footer and via /var/www/froxlor/lib/version.inc.php after upgrade. Force a manual config rebuild post-patch (php /var/www/froxlor/scripts/froxlor_master_cronjob.php --force) and confirm nginx -t / apachectl configtest passes cleanly.
2. Audit Existing Redirect Entries and Vhost Files
Patching does not remove already-injected malicious configuration. After upgrading:
- Review every customer subdomain redirect target for embedded or encoded newlines (
%0a,%0d, CRLF sequences). - Diff all generated vhost files against a known-good baseline or backup.
- Look specifically for
proxy_pass, unexpectedreturn 30xredirects to external domains, and alteredroot/aliasdirectives.
3. Enforce Post-Rebuild Config Validation
Add an automated nginx -t / apache2ctl configtest gate after every Froxlor cron rebuild and before any web server reload. A failing config test should block the reload and page on-call — this converts a potential fleet-wide outage into an alert.
4. Deploy File Integrity Monitoring on Vhost Directories
Monitor /etc/nginx/sites-enabled/, /etc/nginx/conf.d/, /etc/apache2/sites-enabled/, and /etc/httpd/conf.d/ with FIM (Wazuh, Tripwire, auditd). Alert on writes outside the Froxlor cron window. In a managed-panel environment, vhost files should be written by exactly one process on a known schedule — anything else is anomalous.
5. Restrict and Monitor Customer Account Creation
Because exploitation requires only an authenticated customer account:
- Enable MFA on all Froxlor accounts where supported.
- Audit recently created customer accounts and correlate with vhost modification timestamps.
- Alert on first-time subdomain/redirect creation from newly registered accounts.
6. Containment if Exploitation Is Suspected
- Stop web server reloads; freeze the current known-good configuration.
- Restore vhost files from backup; validate with config test before reload.
- Suspend the responsible customer account; preserve panel logs, web logs, and database audit trails for forensics.
- Review access logs for evidence of traffic redirection or credential capture affecting co-hosted tenants — you may have notification obligations to downstream customers.
The Bottom Line
CVE-2026-90937 is a reminder that hosting control panels are Tier-0 assets. They hold the keys to every tenant's web presence, and a single input-validation failure collapses the multi-tenant trust model entirely. Authenticated-but-low-privilege bugs score 9.9 for a reason: in shared hosting, "authenticated attacker" describes your entire customer base.
Patch to 2.2.5 today, gate every config reload behind validation, and treat vhost directories with the same FIM rigor you'd apply to /etc/shadow. Your tenants — and their visitors — are depending on boundaries they can't enforce themselves.
Related Resources
Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.