Back to skill

Security audit

ListenHub

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly performs cloud media generation, but its image workflow can make unsafe persistent shell changes, auto-install packages with elevated privileges, and send prompts to a differently branded API than the user-facing ListenHub description suggests.

Review carefully before installing. Avoid submitting sensitive text, private URLs, confidential prompts, or reference images unless you are comfortable sending them to the disclosed external services. Preinstall curl and jq yourself, set LISTENHUB_API_KEY through OpenClaw environment configuration rather than letting scripts write shell rc files, and treat the image script as higher risk until its Labnana/Marswave provider use, auto-install behavior, and credential persistence are corrected.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (3)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/generate-image.sh:345
Finding

Shell Startup Command Injection Through Unsafely Persisted Configuration Values

Content
View full analysis
&2 echo " Visit https://listenhub.ai/settings/api-keys" >&2 echo " (Requires subscription)" >&2 echo "" >&2 echo -n " Please paste your API key: " >&2 read -r api_key if [ -z "$api_key" ]; then echo "Error: API key cannot be empty" >&2 exit 1 fi # Check if config already exists (avoid duplicate append) if ! grep -q "^export LISTENHUB_API_KEY=" "$shell_rc" 2>/dev/null; then echo "export LISTENHUB_API_KEY=\"$api_key\"" >> "$shell_rc" else # If exists, replace sed_inplace "$shell_rc" "s|^export LISTENHUB_API_KEY=.*|export LISTENHUB_API_KEY=\"$api_key\"|" fi export LISTENHUB_API_KEY="$api_key" fi if [ -z "${LISTENHUB_OUTPUT_DIR:-}" ]; then echo "2. Output path" >&2 echo -n " Image save location (default: ~/Downloads): " >&2 read -r output_dir if [ -z "$output_dir" ]; then output_dir="$HOME/Downloads" fi output_dir="${output_dir/#\~/$HOME}" mkdir -p "$output_dir" if ! grep -q "^export LISTENHUB_OUTPUT_DIR=" "$shell_rc" 2>/dev/null; then echo "export LISTENHUB_OUTPUT_DIR=\"$output_dir\"" >> "$shell_rc" else sed_inplace "$shell_rc" "s|^export LISTENHUB_OUTPUT_DIR=.*|export LISTENHUB_OUTPUT_DIR=\"$output_dir\"|" fi export LISTENHUB_OUTPUT_DIR="$output_dir" fi ``` ### Technical Analysis The script inserts values obtained through `read` directly into `.bashrc`, `.zshrc`, or another shell startup file. The values are placed inside double-quoted shell assignments without shell-safe serialization or strict character validation. A value containing a closing quote and shell syntax can produce an executable command in the resulting startup file. Command substitutions retained in the genera ...[truncated 2014 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
scripts/generate-image.sh:247
Finding

Automatic Privileged Package Installation Using Eval

Content
View full analysis
/dev/null; then missing_deps+=("jq") fi if ! find_curl &>/dev/null; then missing_deps+=("curl") fi if [ ${#missing_deps[@]} -gt 0 ]; then echo "→ Missing required tools: ${missing_deps[*]}" >&2 echo " Auto-installing..." >&2 case "$PLATFORM" in macos) install_cmd="brew install ${missing_deps[*]}" ;; linux) if command -v apt-get &>/dev/null; then install_cmd="sudo apt-get update && sudo apt-get install -y ${missing_deps[*]}" elif command -v yum &>/dev/null; then install_cmd="sudo yum install -y ${missing_deps[*]}" elif command -v dnf &>/dev/null; then install_cmd="sudo dnf install -y ${missing_deps[*]}" elif command -v pacman &>/dev/null; then install_cmd="sudo pacman -S --noconfirm ${missing_deps[*]}" fi ;; windows) if command -v choco &>/dev/null; then install_cmd="choco install -y ${missing_deps[*]}" elif command -v scoop &>/dev/null; then install_cmd="scoop install ${missing_deps[*]}" fi ;; esac if eval "$install_cmd"; then echo "✓ Dependencies installed successfully" >&2 else echo "Error: Auto-installation failed" >&2 echo " Please run manually: $install_cmd" >&2 exit 1 fi fi } ``` ### Technical Analysis The image-generation script automatically invokes a system package manager when `jq` or `curl` is missing. On Linux, this includes commands executed through `sudo`. Installing operating-system packages is not necessary to the core privilege boundary of an API wrapper and materially changes the h ...[truncated 1929 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Note
Location
scripts/lib.sh:61
Finding

Unnecessary Credential Discovery in General Shell Startup Files

Content
View full analysis
/dev/null) || return 1 local value="${line#*=}" case "$value" in \"*) value="${value#\"}" value="${value%\"*}" ;; \'*) value="${value#\'}" value="${value%\'*}" ;; *) value="${value%%#*}" value="${value%"${value##*[![:space:]]}"}" ;; esac [ -n "$value" ] && printf '%s' "$value" } _key=$(_extract_api_key ~/.zshrc) || _key=$(_extract_api_key ~/.bashrc) || _key="" if [ -n "$_key" ]; then export LISTENHUB_API_KEY="$_key" fi unset -f _extract_api_key unset _key fi ``` A similar broader search occurs in `scripts/generate-image.sh:210-242`: ```bash for rc_file in ~/.zshrc ~/.bashrc ~/.bash_profile ~/.profile; do if [ -f "$rc_file" ]; then line=$(grep -E "^export ${var_name}=" "$rc_file" 2>/dev/null | tail -1) || true if [ -n "$line" ]; then value="${line#*=}" value="${value#\"}" value="${value%\"}" value="${value#\'}" value="${value%\'}" value="${value/\$HOME/$HOME}" value="${value/#\~/$HOME}" if [ -n "$value" ]; then export "$var_name"="$value" return 0 fi fi fi done ``` ### Technical Analysis When `LISTENHUB_API_KEY` is not already present in the process environment, the scripts search general-purpose shell startup files and implicitly extract the credential. This is broader than necessary for the declared API-wrapper functionality and couples the Skill to files that may contain other ...[truncated 1460 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
Findings (42)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The description claims a multi-purpose skill covering podcasts, explainer videos, read-aloud narration, and AI images from several input types. The actual code chunk only handles one specific action: generate audio for an existing podcast episode via podcast/episodes/{episodeId}/audio, optionally using provided script JSON. That is a materially narrower and different capability set than declared. While podcast/audio creation is aligned in part, the broader media-generation claims and input support are not evidenced by this code.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
89% confidence
Finding

The code chunk is narrowly focused on generating podcast script/text content, not audio, video, narration, or images. It even explicitly states that it only generates text content and that audio must be handled by another script. While parts of the declared description overlap with the code's support for podcast creation from text or URLs, the description materially overstates the implemented capabilities in this chunk by claiming explainer video, voice narration, and AI image generation support. This is a meaningful description-behavior mismatch rather than a minor implementation detail.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The description claims a multi-modal creation skill covering podcasts, explainer videos, narration, and AI images. The actual code chunk is narrowly focused on creating podcast episodes only. It supports text queries plus optional URL/text sources and speaker/language/mode selection, which aligns with part of the podcast claim, but there is no implementation for video generation, image generation, or generic read-aloud/narration workflows. The broad declared purpose therefore materially overstates the implemented capabilities of this code chunk.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

The declared description promises a broad multimodal creation capability: podcasts, explainer videos, voice narration, and AI images from various input types such as URLs, topics, plain text, and prompts. The supplied code chunk does something much narrower: it creates speech audio by sending validated multi-speaker script JSON to a ListenHub speech endpoint. There is no evidence of video generation, image generation, link ingestion, article processing, topic-to-script conversion, or generic plain-text handling beyond explicit script entries. While voice narration is partially aligned, the overall description materially overstates the implemented functionality, so this is a mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The description claims a multi-modal creation skill covering podcasts, explainer videos, voice narration, and AI images, with support for YouTube links, article URLs, plain text, and image prompts. The actual code is much narrower: it is a text-to-speech wrapper around ListenHub's FlowSpeech endpoint. It only accepts type=text or type=url, requires a single speaker ID, and submits a request to generate audio. There is no code for video creation, image generation, podcast assembly workflow, YouTube-specific handling, or image prompts. 'Read this aloud' / voice narration is accurately represented, and article URLs/plain text are supported, but the overall declared purpose materially overstates the skill's capabilities.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The description claims a broad multimedia skill centered on ListenHub, supporting podcasting, explainer videos, narration, and image generation from several input types. The actual code chunk only generates images from a text prompt plus optional reference image URLs. It does not contain functionality for audio generation, podcast creation, video creation, narration, YouTube/article ingestion, or general knowledge sharing workflows. Additionally, the network target is api.labnana.com with a Marswave client header, which is materially inconsistent with the declared ListenHub branding/purpose, even though it reuses a LISTENHUB_API_KEY variable. The script also modifies user shell config files and can auto-install jq/curl, behaviors not declared in the description. Therefore the declared description does not accurately represent the code's actual behavior.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 52)May include surrounding context.

md
| Image | `generate-image.sh` | AI image generation |

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 69)May include surrounding context.

md
| Image | `generate-image.sh` | AI image generation |

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The script automatically installs missing packages by invoking platform package managers and executing the constructed install command with eval, including sudo and non-interactive flags. For a media-generation skill, silently changing system state and potentially requesting elevated privileges is unnecessary and creates a high-risk path for unauthorized software installation or abuse if the environment is manipulated.

Content

No source excerpt is available for this finding.

Chaining Abuse

High
Category
Tool Misuse
Confidence
95% confidence
Finding

Chaining sudo apt-get update && sudo apt-get install compounds privileged operations into a single automated flow, reducing opportunities for the user to inspect or stop the process. This creates a stronger abuse pattern than a single advisory command because it performs multiple root-level steps automatically during ordinary script execution.

Content

Scanner excerpt · scripts/generate-image.sh (reported line 281)May include surrounding context.

sh
linux)
        # Detect Linux distribution
        if command -v apt-get &>/dev/null; then
          install_cmd="sudo apt-get update && sudo apt-get install -y ${missing_deps[*]}"
        elif command -v yum &>/dev/null; then
          install_cmd="sudo yum install -y ${missing_deps[*]}"
        elif command -v dnf &>/dev/null; then

Tool Parameter Abuse

High
Category
Tool Misuse
Confidence
97% confidence
Finding

The --noconfirm flag suppresses user review for package installation, turning dependency handling into unattended system modification. In this context it is an abuse-prone parameter choice because the skill can perform impactful actions without a meaningful approval checkpoint.

Content

Scanner excerpt · scripts/generate-image.sh (reported line 287)May include surrounding context.

sh
elif command -v dnf &>/dev/null; then
          install_cmd="sudo dnf install -y ${missing_deps[*]}"
        elif command -v pacman &>/dev/null; then
          install_cmd="sudo pacman -S --noconfirm ${missing_deps[*]}"
        else
          echo "Error: No supported package manager detected" >&2
          echo "  Please install manually: ${missing_deps[*]}" >&2

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The script persistently writes the API key and output directory into shell startup files such as ~/.zshrc and ~/.bashrc. Storing secrets in interactive shell config files broadens exposure to other tools, users, and accidental disclosure, and it modifies long-term user configuration beyond the immediate task without strong justification.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/lib.sh (reported line 131)May include surrounding context.

sh
Error: LISTENHUB_API_KEY not set

Setup:
  1. Get API key from https://listenhub.ai/settings/api-keys
  2. Add to ~/.zshrc or ~/.bashrc:
     export LISTENHUB_API_KEY="lh_sk_..."
  3. Run: source ~/.zshrc

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill instructs use of shell scripts and networked API access but declares no explicit tool scope or permissions boundaries. In an agent environment, that increases the chance the skill is invoked with broader-than-expected execution authority, making accidental command execution or unintended network actions more likely.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
67% confidence
Finding

The skill invites users to submit rich content such as article URLs, plain text, and prompts and appears designed around multi-step generation workflows, which can create persistent external artifacts and retained task state. In context, this matters because generated media, linked content, and status-polling episode IDs may persist on the external service beyond the user's immediate session.

Content

Scanner excerpt · SKILL.md (reported line 5)May include surrounding context.

md
name: listenhub
description: |
  Turn ideas into podcasts, explainer videos, voice narration, and AI images via ListenHub.
  Use when the user wants to "make a podcast", "create an explainer video", "read this aloud",
  "generate an image", or share knowledge in audio/visual form.
  Supports: topic descriptions, YouTube links, article URLs, plain text, and image prompts.
  Requires LISTENHUB_API_KEY environment variable (get from https://listenhub.ai/settings/api-keys).

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The trigger phrases are broad enough to match common requests like 'read this aloud' or 'generate an image,' which can cause the skill to activate outside the user's intended context. In an agent setting, overbroad activation can lead to unintentional transmission of user content to external services or unnecessary shell/network execution.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill handles user text, URLs, and prompts through a third-party API but does not clearly warn that this content will be transmitted externally. Users may unknowingly expose sensitive text, proprietary documents, or private links to an external service, creating privacy and data-governance risk.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

Auto-detection terms such as 'explain,' 'introduce,' or 'video' are highly ambiguous and can misroute ordinary conversation into external API workflows. That raises privacy and safety risk because content may be sent off-platform or scripts executed based on an imprecise match rather than explicit consent.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This script takes arbitrary user-supplied content and sends it to the external ListenHub API via api_post without any explicit warning, confirmation, or redaction step. That creates a real data-exposure risk because users may provide sensitive text, internal documents, or personal information, and the skill context explicitly encourages sharing rich content for processing by a third-party service.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script transmits the user-provided query, speaker selections, and any supplied source URLs or source text to the external ListenHub API, but it does not provide any explicit warning, confirmation, or consent step before sending potentially sensitive content off-host. In a skill that accepts arbitrary text and URLs, users may unintentionally submit confidential internal data, private documents, or sensitive browsing targets to a third party.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The script takes arbitrary user-provided text and sends it to the ListenHub external API via api_post "speech" "$BODY" without any explicit notice, confirmation, or data-handling warning at the point of transmission. In a skill that may be used on article text, scripts, or other potentially sensitive content, this creates a real privacy and data-exposure risk because users may not realize their content leaves the local environment.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The script packages user-provided text or URLs into a JSON body and sends them to the external ListenHub API, but it does not provide any explicit warning, consent step, or data-handling notice at the point of transmission. In an agent skill context, users may paste sensitive text or private links assuming local processing, so silent exfiltration to a third-party service creates a real privacy and compliance risk.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The skill metadata says ListenHub, but the implementation targets Labnana/Marswave APIs and branding. This mismatch undermines user trust and means prompts and credentials may be sent to a different service than the user expects, which is a real security and privacy concern in a skill that transmits user content externally.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

The script sends user prompts, optional reference image URLs, and an API credential to an external service at api.labnana.com. External transmission is expected for cloud image generation, but it becomes materially more dangerous here because the skill is presented as ListenHub while actually routing data to a different provider, reducing informed consent.

Content

Scanner excerpt · scripts/generate-image.sh (reported line 55)May include surrounding context.

sh
fi

# Configuration
API_ENDPOINT="https://api.labnana.com/openapi/v1/images/generation"
AGENT_SKILLS_CLIENT_ID="PJBkELS1o_q9nJ~NzF2_Fmr21TNX&~eoJR49FFdFhD3U"
MAX_RETRIES=3
INITIAL_TIMEOUT=600

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The dependency handler automatically runs package-manager commands without an explicit confirmation step. In the context of a simple image-generation skill, autonomous installation is disproportionate and can surprise users with privileged changes, new trust relationships, and altered system state.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.