Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:H/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Admin account required so PR:H; network-reachable web UI with no user interaction and a simple upload gives AV:N/AC:L/UI:N; OS command execution yields full C:H/I:H/A:H on the same host (S:U).
Primary rating from Vendor (https://github.com/EGroupware/egroupware).
CVSS VectorVendor: https://github.com/EGroupware/egroupware
Lifecycle Timeline
5DescriptionCVE.org
Summary
An authenticated administrator can achieve OS-level Remote Code Execution (RCE) by uploading a malicious eTemplate XML file (.xet) to the VFS /etemplates mount.
The Widget::expand_name() method passes template widget attribute values directly into a PHP eval() call with only double-quote escaping applied - backtick characters are not escaped.
In PHP, backticks inside a double-quoted eval() string execute shell commands. This allows an admin-level user to escalate from web application access to arbitrary OS command execution on the server.
------------------------------------------------------------------------
Details
The vulnerability is located in api/src/Etemplate/Widget.php, Widget::expand_name(): (lines 703-728)
The method is designed to expand PHP variables (e.g., $row, $col,$cont[id]) in widget attribute values for auto-repeat grids. The eval() is triggered whenever $name contains a $ character (line 706). The only sanitization applied before the eval is:
str_replace('"', '\\"', $name)This escapes double quotes only. Backtick characters are not escaped. In PHP, backticks inside a double-quoted string in eval() are treated as shell execution operators - equivalent to shell_exec(). A widget id of $row\id`` produces:
eval('$name = "$row`id`";'); // executes shell command: idexpand_name() is called from:
form_name()expand_widget()set_attrs()Template::run()
The /etemplates VFS path is created exclusively for admin users - it is chgrp'd to Admins and chmod'd to 075 (Admins group has full rwx): class.filemanager_admin.inc.php:95-106
Custom templates in /etemplates take precedence over built-in filesystem templates, meaning a malicious template can silently override any existing application template.
Mitigating factor: The official Docker deployment sets disable_functions = exec,passthru,shell_exec,system,proc_open,popen in php.ini, which also blocks PHP backtick execution (backticks internally call shell_exec). Non-Docker or non-hardened deployments without this php.ini setting are fully vulnerable. Dockerfile:47
The current master branch in api/setup/setup.inc.php, confirming the vulnerability is present in the latest code as of today. setup.inc.php:14-17
------------------------------------------------------------------------
Proof of Concept (PoC)
Prerequisites
- Admin account
- Non-Docker deployment, or Docker deployment where disable_functions has been removed/modified in php.ini
Step 1 - Mount /etemplates:
Log in as admin, navigate to Admin → Filemanager → VFS Mounts, and click "Install custom templates". This executes the code in filemanager_admin.inc.php that mounts /etemplates with Admins-group write access.
Step 2 - Upload malicious template:
Create a file named index.xet with the following content:
<?xml version="1.0" encoding="UTF-8"?>
<overlay>
<template id="admin.index">
<grid>
<columns><column/></columns>
<rows>
<row>
<textbox id="$row`touch /tmp/pwned_egw 2>/dev/null`"/>
</row>
</rows>
</grid>
</template>
</overlay>Upload this file to /etemplates/admin/templates/default/index.xet via the VFS filemanager.
Step 3 - Trigger execution:
Navigate to the EGroupware admin panel:
https://<target>/egroupware/index.php?menuaction=admin.admin_ui.indexWhen the template is loaded and beforeSendToClient() runs, form_name() calls expand_name() with $name = '$row\touch /tmp/pwned_egw 2>/dev/null'and$row = 0. The eval becomes:
eval('$name = "$row`touch /tmp/pwned_egw 2>/dev/null`";');
PHP executes the backtick expression as a shell command.
Step 4 - Verify:
Check that /tmp/pwned_egw was created on the server. For a more impactful demonstration, replace touch /tmp/pwned_egw with id > /tmp/pwned_egw to capture the web server's OS user identity.
------------------------------------------------------------------------
Impact
Authenticated Remote Code Execution (RCE) via eval() with unsanitized shell metacharacters.
Who is impacted: Any EGroupware installation where:
- An admin account is compromised or a malicious admin exists, AND
- The server is not running with disable_functions blocking shell_exec (i.e., non-Docker or misconfigured deployments)
------------------------------------------------------------------------
Severity
The vulnerability allows escalation from EGroupware admin-level web access to arbitrary OS command execution as the web server user (typically www-data). From there, an attacker can read configuration files (including database credentials), pivot to other services, or establish persistence. This is not exploitable by regular (non-admin) users. The official Docker deployment is not affected due to disable_functions, but bare-metal, VM, or custom container deployments without this hardening are fully vulnerable.
AnalysisAI
Authenticated OS command injection in EGroupware lets an admin-level user escalate from web access to arbitrary shell command execution as the web server user (typically www-data). By uploading a crafted eTemplate .xet file to the admin-only /etemplates VFS mount, an attacker abuses Widget::expand_name(), which feeds widget attribute values into a PHP eval() while escaping only double quotes and leaving backtick shell operators intact. Publicly available exploit code exists and a vendor patch is available; there is no CISA KEV listing, so this is not confirmed as actively exploited.
Technical ContextAI
EGroupware is a PHP-based open-source collaborative groupware suite (mail, calendar, filemanager, admin) distributed as the composer package egroupware/egroupware. The flaw is a classic CWE-78 OS Command Injection reached through unsafe use of PHP eval(). In api/src/Etemplate/Widget.php, expand_name() (lines 703-728) expands template variables like $row, $col and $cont[id] for auto-repeat grids by building a double-quoted string and calling eval() whenever the attribute contains a '$'. The only sanitization is str_replace('"', '\\"', $name), which escapes double quotes but not backticks; inside a double-quoted PHP string, backticks are the execution operator equivalent to shell_exec(). Because custom templates in the admin-writable /etemplates VFS mount (chgrp Admins, chmod 075) take precedence over built-in filesystem templates, a malicious .xet silently overrides legitimate application templates and is executed when expand_name() runs via form_name(), expand_widget(), set_attrs() or Template::run().
RemediationAI
Vendor-released patch: upgrade to 26.4.20260413 (26.x branch) or 23.1.20260601 (23.1 branch) per advisory https://github.com/EGroupware/egroupware/security/advisories/GHSA-8737-2x9g-xjj7. If immediate patching is not possible, the most effective compensating control is to harden the PHP runtime by setting disable_functions = exec,passthru,shell_exec,system,proc_open,popen in php.ini (this is what the official Docker image does and it blocks PHP backtick execution); the trade-off is that any legitimate EGroupware feature relying on those shell functions will break, so validate application functionality after applying. Additionally, restrict and audit admin accounts and the Admins group, since exploitation requires admin-level access - avoid broad admin delegation and monitor the /etemplates VFS mount for unexpected .xet uploads. As a further precaution, avoid mounting /etemplates (do not click 'Install custom templates' in Admin → Filemanager → VFS Mounts) unless custom templates are genuinely required, which removes the admin-writable upload surface at the cost of losing custom template capability.
In PHP versions 7.1.x below 7.1.33, 7.2.x below 7.2.24 and 7.3.x below 7.3.11 in certain configurations of FPM setup it
sapi/cgi/cgi_main.c in PHP before 5.3.12 and 5.4.x before 5.4.2, when configured as a CGI script (aka php-cgi), does not
(1) boardData102.php, (2) boardData103.php, (3) boardDataJP.php, (4) boardDataNA.php, and (5) boardDataWW.php in Netgear
The '/common/download_agent_installer.php' script in the Quest KACE System Management Appliance 8.0.318 is accessible by
ProjectSend versions prior to r1720 are affected by an improper authentication vulnerability. Rated critical severity (C
Roundcube Webmail contains a critical PHP object deserialization vulnerability (CVE-2025-49113, CVSS 9.9) that allows au
Util/PHP/eval-stdin.php in PHPUnit before 4.8.28 and 5.x before 5.6.3 allows remote attackers to execute arbitrary PHP c
Palo Alto Networks PAN-OS management web interface contains an authentication bypass allowing unauthenticated attackers
Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re
Nagios XI version xi-5.7.5 is affected by OS command injection. Rated high severity (CVSS 8.8), this vulnerability is re
The get_referers function in /opt/ws/bin/sblistpack in Sophos Web Appliance before 3.7.9.1 and 3.8 before 3.8.1.1 allows
The Backup Migration plugin for WordPress is vulnerable to Remote Code Execution in all versions up to, and including, 1
Same weakness CWE-78 – OS Command Injection
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-46033
GHSA-8737-2x9g-xjj7