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
- 94% confidence
- Finding
- The request destination is derived from environment-controlled configuration via SCRUMBALL_BASE_URL and then used in urllib.request.urlopen without any allowlist or validation. In a skill context, this enables server-side request forgery or exfiltration of sensitive headers such as authorization and the persisted x-install-id to an attacker-controlled endpoint if the environment is manipulated.
