T09 · Insecure Skill Coding Practices
- Location
scripts/cap_probe.py:139- Finding
Bearer credentials can be transmitted to an arbitrary network endpoint
- Content
View full analysis
str: return (value or DEFAULT_BASE_URL).strip() def resolve_cap_endpoint(base_url: str) -> str: parsed = urllib.parse.urlsplit(base_url) if not parsed.scheme or not parsed.netloc: raise ValueError(f"Invalid base URL: {base_url!r}") path = parsed.path.rstrip("/") if path.endswith("/echo"): endpoint_path = f"{path}/api/v1/cap" else: endpoint_path = f"{path}/cap" return urllib.parse.urlunsplit( (parsed.scheme, parsed.netloc, endpoint_path, "", "") ) def _resolve_headers(api_key: str | None) -> dict[str, str]: headers = { "Accept": "application/json", "Content-Type": "application/json", } token = _resolve_api_token(api_key) if not token: return headers if token.lower().startswith("bearer "): headers["Authorization"] = token else: headers["Authorization"] = f"Bearer {token}" return headers ``` ```python def _post_cap( base_url: str, verb: str, params: dict[str, Any] | None, headers: dict[str, str] ) -> dict[str, Any]: payload = _build_payload(verb, params) data = json.dumps(payload).encode("utf-8") req = urllib.request.Request( _cap_endpoint(base_url), data=data, method="POST", headers=headers, ) try: with urllib.request.urlopen(req, timeout=20.0) as response: parsed = _json_or_text(response.read()) ``` ```python parser.add_argument( "--base-url", default="", help=f"CAP server base URL (default: {DEFAULT_BASE_URL}).", ) parser.add_argument("--api-key", default="", help="Bearer token or raw API key.") ``` ### Technical Analysis The script permits the caller to su ...[truncated 1805 chars]- Remediation
View remediation
