T09 · Insecure Skill Coding Practices
- Location
scripts/meeting-summarize.py:56- Finding
Configurable LLM Endpoint Can Receive StepFun Credentials and Confidential Meeting Transcripts
- Content
View full analysis
Dict[str, object]: api_key = load_api_key() if not api_key: raise RuntimeError("StepFun API key is not configured for LLM enrichment") payload = { "model": STEP_LLM_MODEL, "temperature": 0.2, "response_format": {"type": response_hint}, "messages": [ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_prompt}, ], } req = urllib.request.Request( STEP_CHAT_COMPLETIONS_URL, data=json.dumps(payload).encode("utf-8"), headers={ "Authorization": f"Bearer {api_key}", "Content-Type": "application/json", "Accept": "application/json", }, method="POST", ) try: with urllib.request.urlopen(req, timeout=180) as resp: raw = resp.read().decode("utf-8", errors="replace") ``` ### Technical Analysis The destination of an authenticated LLM request is taken directly from the `MEETING_SUMMARY_LLM_URL` environment variable. The code does not validate the scheme, hostname, port, or origin before attaching a StepFun bearer credential. The request body includes user-derived meeting information. Depending on the operation, this includes transcript excerpts, participant candidates, confidence flags, and potentially information derived from historical meeting minutes. Consequently, control of the environment variable provides a ...[truncated 1385 chars]- Remediation
View remediation
