Group-Office PHP Deserialization Remote Code Execution (CVE-2026-34838)
by bamuwe · 2026-07-05
- Severity
- Critical
- CVE
- CVE-2026-34838 (GHSA-h22j-frrf-5vxq)
- Category
- web
- Affected product
- Group-Office groupware suite
- Affected versions
- Group-Office <= 25.0.89
- Disclosed
- 2026-07-05
- Patch status
- patched
References
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-05 |
| Last Updated | 2026-04 |
| Author / Researcher | bamuwe |
| CVE / Advisory | CVE-2026-34838 (GHSA-h22j-frrf-5vxq) |
| Category | web |
| Severity | Critical |
| CVSS Score | Not specified in source |
| Status | PoC |
| Tags | php, deserialization, rce, groupware, gadget-chain, authenticated, group-office, guzzlehttp |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | Group-Office groupware suite |
| Versions Affected | Group-Office <= 25.0.89 |
| Language / Platform | Python 3 (PoC), target is a PHP web application |
| Authentication Required | Yes (valid username/password) |
| Network Access Required | Yes |
Summary
CVE-2026-34838 is a PHP object deserialization vulnerability in Group-Office. The AbstractSettingsCollection::_loadData() method calls unserialize() on a stored setting value prefixed with serialized:, without validating the object type. By storing a crafted GuzzleHttp\Cookie\FileCookieJar object as one of the export-related settings (e.g. export_include_headers) and then triggering an export action, the attacker causes the gadget’s __destruct() method to write attacker-controlled content — including a PHP web shell — to an arbitrary file path via file_put_contents(). The included PoC authenticates, stores the crafted gadget chain via the settings-save endpoint, and triggers one of several export routes to fire the deserialization and file write, demonstrating arbitrary file write and disclosing the path toward RCE.
Vulnerability Details
Root Cause
AbstractSettingsCollection::_loadData() (in go/base/model/AbstractSettingsCollection.php) unserializes a stored setting value without restricting allowed classes, enabling a PHP POP (property-oriented programming) gadget chain via GuzzleHttp\Cookie\FileCookieJar::__destruct() -> save() -> file_put_contents().
Attack Vector
- Authenticate to Group-Office and obtain a valid session plus CSRF
security_token. - Store a serialized
GuzzleHttp\Cookie\FileCookieJargadget-chain payload (embedding a PHP web shell as the cookie value and an attacker-chosen file path) as theexport_include_headerssetting viacore/saveSetting. - Trigger one of several export-capable routes (e.g.
files/file/export,email/account/export) that loadsGO\Base\Export\Settings, causing_loadData()tounserialize()the stored payload. - When the resulting
FileCookieJarobject is garbage-collected, its__destruct()writes the embedded PHP code to the attacker-specified path, yielding arbitrary file write and a path to remote code execution.
Impact
Authenticated attacker-controlled arbitrary file write, leading to remote code execution as the web server user in environments where the write path is web-accessible or otherwise executable.
Environment / Lab Setup
Target: Group-Office <= 25.0.89 web application
Attacker: Python 3, `requests` library, valid Group-Office credentials
Proof of Concept
PoC Script
See
poc.pyin this folder.
| |
Edit the TARGET, USERNAME, and PASSWORD constants at the top of the script. It logs in, builds the serialized FileCookieJar gadget chain embedding a PHP web-shell snippet, stores it via core/saveSetting, and then triggers one of several export routes to fire the deserialization and confirm the file write.
Detection & Indicators of Compromise
Signs of compromise:
- Setting values containing the
serialized:prefix withGuzzleHttp\Cookie\*class names - Unexpected PHP files appearing in writable directories such as
/tmp - Export-route requests immediately following anomalous
saveSettingcalls from the same session
Remediation
| Action | Detail |
|---|---|
| Primary fix | Update to a Group-Office release beyond 25.0.89 that addresses GHSA-h22j-frrf-5vxq |
| Interim mitigation | Restrict/validate settings values before unserialize() (allow-list classes or migrate to json_decode); restrict writable directories from being web-executable |
References
Notes
Mirrored from https://github.com/bamuwe/CVE-2026-34838 on 2026-07-05.
| |