T09 · Insecure Skill Coding Practices
- Location
scripts/stt.py:23- Finding
Sensitive API requests do not enforce HTTPS
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill appears to do the promised speech-to-text and translation work, but it handles API keys and user audio/text in ways that deserve review before installation.
Review before installing. Use only if you trust Addis Assistant with the submitted audio and text, avoid sensitive content unless approved, and prefer a revised version that uses explicit HTTPS endpoints and reads API keys from an environment variable or secret store instead of command-line arguments.
scripts/stt.py:23Sensitive API requests do not enforce HTTPS
scripts/stt.py:23API keys are exposed through process command-line arguments
The code chunk is narrowly focused on STT: it validates an API key and audio file path, then calls api.addisassistant.com/api/v2/stt with multipart form data containing the audio file and language code. This aligns with the declared STT portion, including Amharic as the default language. However, the declared description also states that the skill provides text translation, and no translation logic, endpoint, or text-processing behavior appears in this code. Therefore the description overstates the implemented capabilities for the supplied code chunk.
The code chunk exclusively handles translation: it validates an API key, text, source language, and target language, then calls api.addisassistant.com/api/v1/translate. There is no audio input handling, no speech recognition logic, and no STT endpoint usage. Therefore, the description materially overstates the implemented functionality by claiming Speech-to-Text support when the code only performs translation.
The skill advertises executable scripts and detected shell-capable behavior but does not declare any tool scope restrictions such as permissions or allowed-tools. In agent environments, this can lead to over-broad execution authority, making it easier for the skill to invoke shell functionality or related capabilities without explicit review or containment.
The skill processes potentially sensitive audio and text by sending them to a third-party API, but the user-facing description does not clearly warn that this content leaves the local environment. This creates a privacy and data-governance risk, especially for speech transcripts, personal conversations, or confidential text that users may reasonably expect to remain local unless told otherwise.
The API spec clearly describes sending user-provided audio files and text to api.addisassistant.com, but it does not warn that potentially sensitive content leaves the local environment and is transmitted to a third-party remote service. In a speech-to-text and translation skill, this omission can mislead integrators or users into submitting confidential audio, personal data, or regulated content without informed consent or appropriate handling controls.
This endpoint intentionally transmits an audio file and request metadata to an external service, which creates a real data-exposure boundary even if it is the expected function of the skill. The danger is contextual rather than exploit-like: users may provide sensitive voice content, and without strong disclosure and trust controls, that content could be exposed to a remote processor, logged, retained, or mishandled.
Method: POST
curl --location 'api.addisassistant.com/api/v2/stt' \
--header 'x-api-key: Your-api-key' \
--form 'audio=@"/path/to/file.wav"' \
--form 'request_data="{ \"language_code\": \"am\" }"'
The function defaults language_code to "am", and the CLI path also silently applies that default when the user does not specify a language. This imposes a specific language choice without opt-in or an accompanying justification that the tool is region-specific.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
]
try:
result = subprocess.run(command, capture_output=True, text=True, check=True)
print(result.stdout)
except subprocess.CalledProcessError as e:
print(f"Error during STT API call: {e.stderr}")
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
]
try:
result = subprocess.run(command, capture_output=True, text=True, check=True)
print(result.stdout)
except subprocess.CalledProcessError as e:
print(f"Error during STT API call: {e.stderr}")
Accepting the API key via command-line argument can expose the secret to other local users through process listings, shell history, audit logs, job runners, or crash reports. In an agent skill context, this is more dangerous because operators may routinely paste secrets into automation commands, increasing the chance of credential leakage and unauthorized API use.
The script transmits arbitrary user text and the API key to a remote third-party service, but provides no user-facing notice, consent step, or data-handling warning. In a translation skill, submitted text may contain sensitive personal, business, or regulated information, so silent transmission creates a privacy and secret-exposure risk if users or integrators do not realize data leaves the local environment.
No suspicious patterns detected.