Skip to content

CVE-2026-60102: Verified Reproduction

CVE-2026-60102: Horde VFS < 3.0.1 OS command injection via Horde Vfs Smb driver

CVE-2026-60102 is verified against horde/vfs · github. Affected versions: < 3.0.1. Fixed in 3.0.1. Vulnerability class: Command Injection. This high reproduction includes runnable sandbox proof, artifacts, and a plain-text agent view under REPRO-2026-00288.

REPRO-2026-00288 horde/vfs · github Command Injection Jul 14, 2026 CVE entry .txt
Severity
HIGH
CVSS
8.8
Confidence
HIGH
Reproduced in
12m 50s
Tool calls
135
Spend
$1.30
01 · Overview

What Is CVE-2026-60102?

CVE-2026-60102 is a high-severity OS command injection in the Horde VFS API (Horde_Vfs_Smb driver) before 3.0.1. Authenticated users can inject shell commands through crafted filenames used in normal VFS operations. Pruva reproduced it (reproduction REPRO-2026-00288).

02 · Severity & CVSS

CVE-2026-60102 Severity & CVSS Score

CVE-2026-60102 is rated high severity, with a CVSS base score of 8.8 out of 10.

HIGH threat level
8.8 / 10 CVSS base
03 · Affected Versions

Affected horde/vfs Versions

horde/vfs · github versions < 3.0.1 are affected.

How to Reproduce CVE-2026-60102

$ pruva-verify REPRO-2026-00288
or curl -O https://www.pruva.dev/api/v1/reproductions/REPRO-2026-00288/artifacts/bundle/repro/reproduction_steps.sh && chmod +x reproduction_steps.sh && ./reproduction_steps.sh
Run in a VM or disposable container. This exploits a real vulnerability.
06 · Proof of Reproduction

Proof of Reproduction for CVE-2026-60102

Remote code execution — reproduced
  • reached the target end-to-end
  • high confidence
  • the upstream fix blocks the same trigger
Trigger

folder/file name supplied to authenticated VFS operations

Attack chain
  1. Horde_Vfs_Smb::createFolder()
  2. _command()
  3. _execute()
  4. proc_open()
Runnable proof: reproduction_steps.sh
Captured evidence: vulnerable smbclientfixed smbclient
How the agent worked 320 events · 135 tool calls · 13 min
13 minDuration
135Tool calls
89Reasoning steps
320Events
1Dead-ends
Agent activity over 13 min
Support
30
Hypothesis
2
Repro
123
Judge
27
Variant
134
0:0012:50

Root Cause and Exploit Chain for CVE-2026-60102

Versions: All versions before commit 41f74b4acfc144e09013d04dd121e0a5da808361 (released as v3.0.1).

Horde VFS before 3.0.1 builds a shell command string in Horde_Vfs_Smb::_command() and executes it with proc_open(). The _escapeShellCommand() helper only escapes semicolons and backslashes, leaving command substitution ($(...)) and backticks intact. A crafted file or folder name containing $(...) is therefore interpolated into a double-quoted shell context and executed by /bin/sh -c before the configured smbclient binary is ever invoked. We confirmed this by calling the real Horde_Vfs_Smb::createFolder() method with a folder name of $(id > /tmp/horde_vfs_smb_poc_folder).dir; the vulnerable commit creates the marker file with id output, while the fixed commit leaves the marker untouched and passes the literal payload as an argument to smbclient.

  • Package/component: Horde VFS, specifically the Horde_Vfs_Smb driver (lib/Horde/Vfs/Smb.php).
  • Affected versions: All versions before commit 41f74b4acfc144e09013d04dd121e0a5da808361 (released as v3.0.1).
  • Risk level: High. An authenticated caller can inject arbitrary shell commands through normal VFS operations such as file upload, create folder, rename, delete, or read paths.
  • Consequences: Full OS command execution as the user running the PHP process.

Impact Parity

  • Disclosed/claimed maximum impact: Code execution (OS command injection) via proc_open() / /bin/sh -c.
  • Reproduced impact from this run: We demonstrated arbitrary command execution by causing the shell to run id > /tmp/horde_vfs_smb_poc_folder and captured the resulting uid/gid output.
  • Parity: full for the createFolder() path; the same quoting weakness is present in all VFS operations that build the smbclient -c command string.
  • Not demonstrated: No remote authentication bypass was needed; the reproduction assumes an already authenticated VFS caller as described in the CVE.

Root Cause

In the vulnerable code (lib/Horde/Vfs/Smb.php before 41f74b4^), _command() concatenates user-supplied paths/names into a single string:

$fullcmd = $this->_params['smbclient']
    . ' "//' . $this->_params['hostspec'] . '/' . $share . '"'
    . ' "-U' . $this->_params['username'] . '"'
    . ' -D "' . $path . '"'
    . ' -c "';
foreach ($cmd as $c) {
    $fullcmd .= $c . ";";
}
$fullcmd .= '"';
return $this->_execute($fullcmd);

_execute() passes the string directly to proc_open(), which invokes the configured shell (/bin/sh -c) when the command is not an array. The _escapeShellCommand() helper only escapes ; and \, so $, backticks, parentheses, and quotes remain active. A folder name like $(id > /tmp/horde_vfs_smb_poc_folder).dir is first quoted in a double-quoted mkdir "..." segment, but the shell still expands $(...) before running smbclient.

The fix (41f74b4acfc144e09013d04dd121e0a5da808361) replaces the shell string with an argv array passed to proc_open() and adds _quoteSmbArg() to escape single and double quotes inside the smbclient -c mini-language. Because proc_open() with an array calls execvp() directly, no shell is involved and shell metacharacters lose their special meaning.

Reproduction Steps

  1. Run bundle/repro/reproduction_steps.sh from the bundle directory.
  2. The script checks out the vulnerable commit (41f74b4^) and the fixed commit (41f74b4) of horde/Vfs into a cached repository.
  3. It installs PHP and Composer, then runs composer install for each commit.
  4. It creates a fake smbclient that logs arguments and exits 0.
  5. It runs a PHP harness that instantiates Horde_Vfs_Smb with the fake smbclient and calls createFolder('', '$(id > /tmp/horde_vfs_smb_poc_folder).dir').
  6. Expected evidence: on the vulnerable commit, /tmp/horde_vfs_smb_poc_folder is created and contains the id output; on the fixed commit, the marker is not created and the fake smbclient receives the literal payload.

Evidence

  • bundle/logs/reproduction_steps.log — overall run summary, commit SHAs, and captured fake smbclient arguments.
  • bundle/logs/vulnerable.log — shows Marker exists: YES with uid=1000(vscode) ....
  • bundle/logs/fixed.log — shows Marker exists: NO.
  • bundle/logs/vulnerable_smbclient.log — the fake smbclient receives mkdir ".dir"; because the shell already executed $(id > ...) and substituted an empty string.
  • bundle/logs/fixed_smbclient.log — the fake smbclient receives the literal mkdir "$(id > /tmp/horde_vfs_smb_poc_folder).dir";, confirming no shell expansion occurred.
  • bundle/repro/artifacts/fake_smbclient.sh — the fake smbclient used as the command target.
  • bundle/repro/artifacts/harness.php — the PHP harness that drives the real library path.

Key excerpts:

=== vulnerable (994f4a46fd76ea44eae2fe839216bb273ce49080) ===
Marker exists: YES
Marker content: uid=1000(vscode) gid=1000(vscode) groups=1000(vscode),969(969)
=== fixed (41f74b4acfc144e09013d04dd121e0a5da808361) ===
Marker exists: NO
ARG //127.0.0.1/share
ARG -c
ARG mkdir "$(id > /tmp/horde_vfs_smb_poc_folder).dir";

Recommendations / Next Steps

  • Upgrade guidance: Upgrade to Horde VFS v3.0.1 or any release containing commit 41f74b4acfc144e09013d04dd121e0a5da808361.
  • Fix approach: Avoid shell-string execution; pass the smbclient command as an argv array to proc_open() and quote names inside the smbclient -c mini-language rather than relying on shell quoting.
  • Testing recommendations: Add unit tests for createFolder, write, rename, delete, and readFile with payloads containing $(...), backticks, pipes, semicolons, and quotes to prevent regression.

Additional Notes

  • Idempotency: The reproduction script was run twice consecutively with identical results; both the vulnerable and fixed commits behaved consistently.
  • Limitations: The proof uses the library API (function_call) with a fake smbclient because the CVE claims the vulnerability is reachable through authenticated VFS operations. The actual production entry point in a Horde application would call the same Horde_Vfs_Smb methods after authentication.
  • Environment: Ubuntu 26.04, PHP 8.5, Composer 2.9, horde/Vfs repository at https://github.com/horde/Vfs.

CVE-2026-60102 Reproduction Transcript

The agent's step-by-step process — every tool call, every handoff, the moment the exploit fired.

Full session Replay every step — scrub the timeline or play it back.

Event 1/40
0:004:19
0:00
session startedaccounts/fireworks/models/kimi-k2p7-code · CVE-2026-60102 · REPRO-20
0:03
0:05
web search
0:08
0:09
0:13
0:14
0:23
0:24
0:30
0:30
0:35
0:38
0:45
1:04
1:15
1:16
web search
3:34
3:34
extract_facts
no facts extracted
3:36
3:36
3:36
supportrepro
4:16
4:18
4:18
4:18
4:19
08 · How to Fix

How to Fix CVE-2026-60102

Upgrade horde/vfs · github to 3.0.1 or later.

Coming soon

Step-by-step mitigation and hardening guidance for CVE-2026-60102 — configuration checks, workarounds where no patch exists, and how to verify you're protected — is on the way.

10 · FAQ

FAQ: CVE-2026-60102

How was CVE-2026-60102 demonstrated?

The reproduction calls the real Horde_Vfs_Smb::createFolder() with a folder name of '$(id > /tmp/horde_vfs_smb_poc_folder).dir'. On the vulnerable commit the marker file is created with id output; on the fixed commit the literal payload is passed as an argument to smbclient and no command runs.

Which VFS operations can trigger CVE-2026-60102?

Any operation that passes an attacker-controlled name into the SMB driver — upload, create folder, rename, delete, or read paths — because the name reaches the unsafely-built shell command in Horde_Vfs_Smb::_command().

Which versions are affected by CVE-2026-60102, and where is it fixed?

Horde VFS versions < 3.0.1 are affected. It is fixed in 3.0.1, which eliminates shell-string execution and hardens SMB argument quoting — upgrade to 3.0.1 or later.

How can I reproduce CVE-2026-60102?

Download the verified script from this page and run it in an isolated environment against Horde VFS < 3.0.1. It invokes createFolder() with a $(...) payload and shows the injected command executing, then confirms 3.0.1 treats the payload as a literal argument.
11 · References

References for CVE-2026-60102

Authoritative sources for CVE-2026-60102 — official vulnerability databases and the upstream advisory. Pruva's reproduction verifies the issue firsthand; these are the primary records to corroborate it.