T09 · Insecure Skill Coding Practices
- Location
SKILL.md:195- Finding
Command Injection Through Unsafe URL Interpolation in a Shell Command
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill has a coherent URL-extraction purpose, but its shell-based curl examples and broad arbitrary-URL handling create a real review concern before installation.
Review this skill before installing. Use it only for public URLs you intend to send to the Marswave/ListenHub API, avoid private or signed links, and be aware that extracted content and raw API responses may be saved locally. The shell command examples should be treated carefully because unsafe substitution of a crafted URL could execute unintended local commands.
SKILL.md:195Command Injection Through Unsafe URL Interpolation in a Shell Command
The manifest declares triggers including "extract content" and a broad condition like "another skill needs to parse source material," which are not tightly scoped to this specific URL-extraction skill. These phrases could match many ordinary requests and increase the chance of unintended invocation.
Several required user-facing prompts are specified only in Chinese, such as the config summary and setup questions. This imposes a language choice on users without offering a locale preference or documenting a justified region-specific constraint.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
TASK_ID="<id-from-step-3>"
for i in $(seq 1 60); do
RESULT=$(curl -sS "https://api.marswave.ai/openapi/v1/content/extract/$TASK_ID" \
-H "Authorization: Bearer $LISTENHUB_API_KEY" 2>/dev/null)
STATUS=$(echo "$RESULT" | tr -d '\000-\037\177' | jq -r '.data.status // "processing"')
case "$STATUS" in
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
TASK_ID="<id-from-step-3>"
for i in $(seq 1 60); do
RESULT=$(curl -sS "https://api.marswave.ai/openapi/v1/content/extract/$TASK_ID" \
-H "Authorization: Bearer $LISTENHUB_API_KEY" 2>/dev/null)
STATUS=$(echo "$RESULT" | tr -d '\000-\037\177' | jq -r '.data.status // "processing"')
case "$STATUS" in
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
TASK_ID="<id-from-step-3>"
for i in $(seq 1 60); do
RESULT=$(curl -sS "https://api.marswave.ai/openapi/v1/content/extract/$TASK_ID" \
-H "Authorization: Bearer $LISTENHUB_API_KEY" 2>/dev/null)
STATUS=$(echo "$RESULT" | tr -d '\000-\037\177' | jq -r '.data.status // "processing"')
case "$STATUS" in
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
TASK_ID="<id-from-step-3>"
for i in $(seq 1 60); do
RESULT=$(curl -sS "https://api.marswave.ai/openapi/v1/content/extract/$TASK_ID" \
-H "Authorization: Bearer $LISTENHUB_API_KEY" 2>/dev/null)
STATUS=$(echo "$RESULT" | tr -d '\000-\037\177' | jq -r '.data.status // "processing"')
case "$STATUS" in
The skill writes full extracted content and raw API responses to local files in the current directory, which can persist sensitive data from parsed URLs without strong user-specific consent at the point of write. Saving raw API responses is especially risky because metadata or unexpected fields may contain sensitive or unnecessary information beyond what the user expects from simple parsing.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl -sS -X POST "https://api.marswave.ai/openapi/v1/content/extract" \
-H "Authorization: Bearer $LISTENHUB_API_KEY" \
-H "Content-Type: application/json" \
-d '{
The documented support for 'Any HTTP(S) URL' creates a very broad activation and processing scope, which can cause the skill to fetch and parse arbitrary attacker-controlled URLs. In a content-parsing skill, this increases the risk of misuse such as unintended external requests, parsing untrusted internal endpoints if downstream controls are weak, or activation in contexts broader than users expect.
The manifest frames this skill as extracting and parsing content from URLs, but the instructions add persistent local config creation and saving behavior in .listenhub/content-parser/config.json. While result saving may be adjacent to extraction, maintaining local configuration state is not an obvious requirement of a URL parsing skill's stated purpose.
No suspicious patterns detected.