T09 · Insecure Skill Coding Practices
- Location
scripts/adidas_client.py:80- Finding
Unrestricted Base URL Allows Portal Credential Exfiltration
- Content
View full analysis
AdidasClickCredentials: if username or password: # Inline creds take precedence; fall back to env for base_url only. return AdidasClickCredentials( username=username or "", password=password or "", base_url=base_url or _env_base_url(), ) return credentials_from_env() ``` ```python # scripts/adidas_browser.py:790-792 def __init__(self, page: "Page", base_url: str) -> None: self.page = page self.base_url = base_url.rstrip("/") ``` ```python # scripts/adidas_browser.py:951-957 self.page.goto(self.base_url + _LOGIN_PATH, wait_until="domcontentloaded") try: self.page.wait_for_selector("#loginFormDsk", timeout=_DEFAULT_TIMEOUT_MS) self.page.fill("#usernameField", credentials.username) self.page.fill("#passwordField", credentials.password) # Leave "Remember me" (#form-reminder) unchecked. self.page.click("#send2Dsk") ``` ### Technical Analysis The Skill permits `base_url` to be supplied through an environment variable, standard input JSON, or a command-line flag. The value is used without URL normalization, HTTPS enforcement, hostname allowlisting, port restrictions, or verification that the final page remains on an approved adidas origin. The browser navigates to `${base_url}/login`, locates expected form s ...[truncated 1676 chars]- Remediation
View remediation
