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
- 91% confidence
- Finding
- The request destination and authorization material are influenced by environment variables, especially SCRUMBALL_BASE_URL and SCRUMBALL_API_KEY, and then sent to urllib.request.urlopen without any allowlist or destination validation. In this skill, that means a caller or surrounding runtime can redirect requests to an arbitrary host and cause API credentials and the persistent install identifier to be exfiltrated in headers.
