Tainted flow: 'req' from os.getenv (line 178, credential/environment) → urllib.request.urlopen (network output)
Critical
- Category
- Data Flow
- Content
req = urllib.request.Request(url=url, method=op["method"], headers=req_headers, data=data) try: with urllib.request.urlopen(req, timeout=timeout) as resp: raw = resp.read().decode("utf-8") try: payload = json.loads(raw) if raw else None- Confidence
- 95% confidence
- Finding
- The code allows the network destination to be fully controlled by environment variable `SCRUMBALL_BASE_URL` and then sends request headers, body/query data, and the generated `x-install-id` to that endpoint. In an agent/runtime context, environment variables are part of the trust boundary, so this creates an SSRF/exfiltration path if the base URL is changed to an attacker-controlled or internal host.
