T09 · Insecure Skill Coding Practices
- Location
echodecks_client.py:8- Finding
API Key Is Sent to a Domain Different from the Documented Service Domain
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly matches its study-tool purpose, but it sends a sensitive EchoDecks API key to a hardcoded domain that is not the same domain documented for obtaining the key.
Review this before installing. Only use it if you trust the EchoDecks provider and are comfortable with your API key, deck/card content, submitted text, review activity, podcast requests, and account metadata being sent to the configured remote API. Confirm that echodecks.com is an official EchoDecks API host for keys obtained from echodecks.app, and consider using a revocable, least-privilege key if EchoDecks supports one.
echodecks_client.py:8API Key Is Sent to a Domain Different from the Documented Service Domain
echodecks_client.py:21Unencoded User-Controlled Values Are Concatenated into API Query Strings
echodecks_client.py:34Outbound HTTP Requests Have No Timeout
The skill declares access to an API key and describes API-backed wrappers, but it does not declare an explicit tool scope such as permissions or allowed-tools. That weakens containment and reviewability, making it easier for a skill with environment and network capabilities to access sensitive data or perform external actions beyond what a user would reasonably expect.
The skill presents deck management and AI generation features without clearly warning that user study content, deck text, and related metadata may be transmitted to an external service. Users may provide private notes or educational content under the assumption it stays local, creating confidentiality and consent risks.
The client sends request parameters and JSON payloads, including user-supplied text and deck/card data, to the remote EchoDecks API via requests.get/post/put/delete. Although the command names imply API usage, there is no visible warning, comment, or docstring in the code that user content may be transmitted to an external service, especially for generation features that may send free-form text.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
if method == "GET":
response = requests.get(url, headers=headers)
elif method == "POST":
response = requests.post(url, headers=headers, json=data)
elif method == "PUT":
response = requests.put(url, headers=headers, json=data)
elif method == "DELETE":
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
elif method == "POST":
response = requests.post(url, headers=headers, json=data)
elif method == "PUT":
response = requests.put(url, headers=headers, json=data)
elif method == "DELETE":
response = requests.delete(url, headers=headers)
else:
The skill notes per-action credit costs in individual tool descriptions, but it does not provide a prominent user warning that generation features consume paid account resources. This can lead to unexpected charges or depletion of limited credits if a user triggers generation without understanding the account impact.
This code accesses the sensitive environment variable ECHODECKS_API_KEY to authenticate outbound API requests, but there is no comment, docstring, or other user-facing warning explaining that credentials will be read from the environment. Under the code-file criteria, sensitive credential access should have some visible disclosure unless already documented elsewhere in the skill materials.
No suspicious patterns detected.