Back to skill

Security audit

Lobster Radio – Free Local AI Radio

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent news-to-audio skill, but it needs review because it stores configurable text in agent memory and includes unsafe file and installation handling.

Install only if you are comfortable with a Chinese-language skill that can use network access, download large ML models, save audio files locally, write configuration into OpenClaw memory, and create scheduled tasks. Prefer using a virtual environment, review model sources before enabling trust_remote_code examples, back up ~/.openclaw/MEMORY.md and generated radio data, and avoid exposing filename or TTS configuration fields to untrusted input until validation is added.

Vulnerability Patterns
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (3)

T02 · Agent Memory Poisoning

Error
Location
utils/config_manager.py:128
Finding
Persistent Agent Memory Injection Through Unsanitized TTS Configuration## Vulnerability Details **File Location**: `utils/config_manager.py:128-153`; related input handling in `scripts/configure_tts.py:147-162` **Vulnerability Type**: Persistent agent memory poisoning **Risk Level**: High ### Vulnerable Code ```python def save_tts_config(self, config: TTSConfig): """ Save TTS configuration. Args: config: TTS configuration """ content = self._read_memory() tts_section = f""" ## TTS Configuration - Provider: {config.provider} - Model: {config.model} - Voice: {config.voice} - Emotion: {config.emotion} - Speed: {config.speed} - Pitch: {config.pitch} """ if "## TTS Configuration" in content: content = re.sub( r'## TTS Configuration.*?(?=\n##|\Z)', tts_section.strip(), content, flags=re.DOTALL ) else: content += "\n" + tts_section self._write_memory(content) ``` The relevant command-line inputs are accepted without validation: ```python parser.add_argument('--voice', type=str, help='Voice ID') parser.add_argument('--emotion', type=str, help='Emotion type') parser.add_argument('--speed', type=float, help='Speech speed') parser.add_argument('--pitch', type=float, help='Pitch') parser.add_argument('--model', type=str, help='Model name') args = parser.parse_args() if args.test: asyncio.run(test_tts()) else: asyncio.run(configure_tts( voice=args.voice, emotion=args.emotion, speed=args.speed, pitch=args.pitch, model=args.model )) ``` ### Technical Analysis String-valued configuration fields such as `model`, `voice`, and `emotion` are directly interpolated into Markdown and written to `~/.openclaw/MEMORY.md`. There is no rejection or encoding of carriage returns, line feeds, Markdown headings, or instruction-like text. A malicious value can therefore terminate ...[truncated 1736 chars]
Remediation
## Remediation Suggestions 1. Store Skill configuration in a dedicated structured file, such as a Skill-scoped JSON or SQLite record, rather than in agent instruction memory. 2. Define strict allowlists for `provider`, `model`, `voice`, and `emotion`. Reject unknown values instead of accepting arbitrary strings. 3. Reject carriage returns, line feeds, null bytes, Markdown headings, and other formatting control characters in every value written to memory. 4. If Markdown storage is unavoidable, serialize values using a format that cannot create new Markdown structure and decode them only within trusted code. 5. Separate persistent user preferences from instruction-bearing memory so configuration data cannot be interpreted as agent directives. 6. Validate values again at the persistence boundary, even if callers also perform validation. 7. Add tests using multiline values and Markdown headings to verify that they cannot alter the structure of `MEMORY.md`.

T05 · Unauthorized Access and Privilege Escalation

Error
Location
utils/audio_manager.py:181
Finding
Arbitrary File Read and Deletion Through Path Traversal## Vulnerability Details **File Location**: `utils/audio_manager.py:181-188` and `utils/audio_manager.py:210-228` **Vulnerability Type**: Unrestricted filesystem path resolution **Risk Level**: High ### Vulnerable Code ```python def get(self, filename: str) -> Optional[bytes]: """ Get an audio file. Args: filename: File name Returns: Optional[bytes]: Audio data, or None if it does not exist """ filepath = self.storage_dir / filename if filepath.exists(): with open(filepath, 'rb') as f: return f.read() return None ``` ```python def delete(self, filename: str) -> bool: """ Delete an audio file. Args: filename: File name Returns: bool: Whether deletion succeeded """ filepath = self.storage_dir / filename if filepath.exists(): filepath.unlink() metadata_file = filepath.with_suffix('.json') if metadata_file.exists(): metadata_file.unlink() return True return False ``` ### Technical Analysis The `get()` and `delete()` methods treat the caller-provided `filename` as a trusted relative filename. They do not reject absolute paths, parent-directory components, path separators, or symlinks that resolve outside `storage_dir`. With `pathlib`, joining a base path to an absolute second path causes the absolute path to take precedence. Relative inputs containing `../` can also escape the intended radio storage directory after filesystem resolution. Although `_sanitize_filename()` exists elsewhere in the class, it is only applied when generating new output filenames. It is not called by either vulnerable method, and filename-oriented character filtering alone would not be a sufficient containment control. The deletion routine additionally derives and deletes a `.json` sibling of the attacker-selected path. ### Attack Path ...[truncated 1423 chars]
Remediation
## Remediation Suggestions 1. Accept only basename identifiers rather than arbitrary filesystem paths. 2. Reject absolute paths, `.` and `..` components, directory separators, null bytes, and filenames with unexpected extensions. 3. Resolve the storage root and candidate path before access, then enforce containment: ```python root = self.storage_dir.resolve() candidate = (root / filename).resolve() if not candidate.is_relative_to(root): raise ValueError("Invalid filename") ``` 4. On Python versions without `Path.is_relative_to()`, compare resolved parents safely rather than using string-prefix checks. 5. Restrict operations to expected audio extensions and use a server-generated opaque identifier mapped to a stored path. 6. Defend against symlink escapes. Where practical, disallow symlinks in the storage directory or use operating-system APIs that avoid following them. 7. Apply the same validated containment logic to the derived metadata path. 8. Add tests covering absolute paths, nested traversal, encoded separators, symlinks, and valid in-directory files.

T08 · Insecure Dependencies

Warning
Location
requirements.txt:1
Finding
Non-Reproducible Installation of Broad Unpinned Dependencies## Vulnerability Details **File Location**: `requirements.txt:1-11`; installation performed by `scripts/install.sh:48-61` **Vulnerability Type**: Unsafe dependency and supply-chain configuration **Risk Level**: Medium ### Vulnerable Code ```text torch>=2.0.0 transformers>=4.40.0 accelerate>=0.20.0 huggingface_hub>=0.16.0 modelscope>=1.10.0 aiohttp>=3.9.0 pydub>=0.25.1 pyaudio>=0.2.14 requests>=2.31.0 qwen-tts==0.1.0 soundfile>=0.12.0 tqdm>=4.65.0 ``` The installer executes dependency installation directly: ```bash cd "$SKILL_DIR" if command -v pip3 &> /dev/null; then pip3 install -r requirements.txt elif command -v pip &> /dev/null; then pip install -r requirements.txt else echo "pip is not installed" exit 1 fi ``` ### Technical Analysis Most dependencies use open-ended minimum-version constraints. Consequently, the package versions installed in the future can differ substantially from those reviewed or tested with the Skill. No lockfile or package hashes are supplied to authenticate exact artifacts. Python package installation can execute build backends and installation-related code with the privileges of the invoking user. A compromised future release, compromised distribution account, malicious transitive dependency, or unsafe package index configuration could therefore introduce executable code during installation. The broad machine-learning dependency set also creates a large transitive dependency surface. The audit did not identify a confirmed malicious package name in the current file; the issue is the mutable and unverifiable installation process. ### Attack Path 1. A user runs the documented installation script. 2. The script invokes the active `pip` or `pip3` executable without creating or enforcing a dedicated virtual environment. 3. Pip resolves the latest versions satisfying the open-ended constraints ...[truncated 900 chars]
Remediation
## Remediation Suggestions 1. Pin every direct and transitive dependency to an exact reviewed version. 2. Generate a lockfile containing cryptographic hashes and install with hash enforcement, such as `pip install --require-hashes`. 3. Use a dedicated virtual environment and invoke its Python interpreter explicitly. 4. Document and enforce trusted package indexes; disable unexpected extra indexes to reduce dependency-confusion exposure. 5. Review and minimize the dependency set. Remove packages that are not required by the supported Cowork and Qwen3-TTS workflows. 6. Add automated vulnerability, license, and provenance scanning for locked artifacts. 7. Rebuild and retest the lockfile through a controlled update process rather than allowing unrestricted upgrades during user installation. 8. Warn users not to run the installer as root or with administrative privileges.
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (111)

Tool Parameter Abuse

High
Category
Tool Misuse
Content
```bash
# 删除Skill目录
rm -rf ~/.openclaw/workspace/skills/lobster-radio-skill

# 重启OpenClaw
openclaw restart
Confidence
90% confidence
Finding
Although not malicious, the documentation instructs users to run a forceful recursive deletion command directly in a shell. In installation docs, this is dangerous because users may copy-paste it without verifying the path, and any path typo, symlink confusion, or directory layout change could cause irreversible loss of local files.

Tool Parameter Abuse

High
Category
Tool Misuse
Content
```bash
# 删除Skill目录
rm -rf ~/.openclaw/workspace/skills/lobster-radio-skill

# 重启OpenClaw
openclaw restart
Confidence
90% confidence
Finding
Although not malicious, the documentation instructs users to run a forceful recursive deletion command directly in a shell. In installation docs, this is dangerous because users may copy-paste it without verifying the path, and any path typo, symlink confusion, or directory layout change could cause irreversible loss of local files.

Tool Parameter Abuse

High
Category
Tool Misuse
Content
cp -r ~/.openclaw/workspace/skills/lobster-radio-skill/data ./backup

# 删除旧版本
rm -rf ~/.openclaw/workspace/skills/lobster-radio-skill

# 复制新版本
cp -r /path/to/new-lobster-radio-skill ~/.openclaw/workspace/skills/
Confidence
91% confidence
Finding
The update workflow includes forceful recursive deletion of the installed skill directory during replacement. In context this is risky because update operations are routine, so users may execute them casually, and mistakes can destroy the existing installation or locally stored data before the replacement is verified.

Tool Parameter Abuse

High
Category
Tool Misuse
Content
cp -r ~/.openclaw/workspace/skills/lobster-radio-skill/data ./backup

# 删除旧版本
rm -rf ~/.openclaw/workspace/skills/lobster-radio-skill

# 复制新版本
cp -r /path/to/new-lobster-radio-skill ~/.openclaw/workspace/skills/
Confidence
91% confidence
Finding
The update workflow includes forceful recursive deletion of the installed skill directory during replacement. In context this is risky because update operations are routine, so users may execute them casually, and mistakes can destroy the existing installation or locally stored data before the replacement is verified.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The documented use of trust_remote_code=True causes Transformers to execute model-repository supplied Python code during loading. That introduces a real supply-chain/code-execution risk unrelated to the core need of generating radio audio, and becomes more dangerous because the guide encourages downloading models from third-party repositories.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding
The skill description omits that part of the effective workflow can involve external retrieval via platform/CLI mechanisms, which is a different trust and permission profile from a simple local radio-generation utility. In context, this is more concerning because the skill also stores user preferences and can be scheduled, increasing persistence and repeated execution risk.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding
The skill description omits that part of the effective workflow can involve external retrieval via platform/CLI mechanisms, which is a different trust and permission profile from a simple local radio-generation utility. In context, this is more concerning because the skill also stores user preferences and can be scheduled, increasing persistence and repeated execution risk.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill description omits that part of the effective workflow can involve external retrieval via platform/CLI mechanisms, which is a different trust and permission profile from a simple local radio-generation utility. In context, this is more concerning because the skill also stores user preferences and can be scheduled, increasing persistence and repeated execution risk.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The skill description omits that part of the effective workflow can involve external retrieval via platform/CLI mechanisms, which is a different trust and permission profile from a simple local radio-generation utility. In context, this is more concerning because the skill also stores user preferences and can be scheduled, increasing persistence and repeated execution risk.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The skill description omits that part of the effective workflow can involve external retrieval via platform/CLI mechanisms, which is a different trust and permission profile from a simple local radio-generation utility. In context, this is more concerning because the skill also stores user preferences and can be scheduled, increasing persistence and repeated execution risk.

Tp4

High
Category
MCP Tool Poisoning
Confidence
91% confidence
Finding
The skill description omits that part of the effective workflow can involve external retrieval via platform/CLI mechanisms, which is a different trust and permission profile from a simple local radio-generation utility. In context, this is more concerning because the skill also stores user preferences and can be scheduled, increasing persistence and repeated execution risk.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The skill description omits that part of the effective workflow can involve external retrieval via platform/CLI mechanisms, which is a different trust and permission profile from a simple local radio-generation utility. In context, this is more concerning because the skill also stores user preferences and can be scheduled, increasing persistence and repeated execution risk.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
The skill description omits that part of the effective workflow can involve external retrieval via platform/CLI mechanisms, which is a different trust and permission profile from a simple local radio-generation utility. In context, this is more concerning because the skill also stores user preferences and can be scheduled, increasing persistence and repeated execution risk.

Tool Parameter Abuse

High
Category
Tool Misuse
Content
# 检查是否已安装
if [ -d "$OPENCLAW_WORKSPACE/lobster-radio-skill" ]; then
    echo "⚠️  Skill已存在,正在更新..."
    rm -rf "$OPENCLAW_WORKSPACE/lobster-radio-skill"
fi

# 复制Skill
Confidence
95% confidence
Finding
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).

Direct Prompt Extraction

High
Category
System Prompt Leakage
Content
prompt = prompt.replace('{{tags}}', '、'.join(tags))
        prompt = prompt.replace('{{duration}}', str(duration))
        
        return prompt
    
    def parse_llm_response(self, response: str) -> RadioContent:
        """
Confidence
85% confidence
Finding
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Natural-Language Policy Violations

Medium
Confidence
92% confidence
Finding
This markdown file presents all user-facing documentation in Chinese, including headings, instructions, and examples, but does not indicate that the skill is China-specific or provide any language/locale opt-in. That can violate language/locale policy because it effectively forces a specific language on users without documented choice or justification.

Natural-Language Policy Violations

Medium
Confidence
88% confidence
Finding
The file forces a specific language presentation for all instructions and examples, and there is no indication that users may choose another language or locale. The policy calls for flagging language or locale constraints when they are imposed without user opt-in or justification.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
This markdown file documents commands that remove stored radios and delete scheduled tasks, but it does not warn users that these actions can permanently remove data or automation state. Under the markdown-specific warning rule, destructive behaviors that may affect user data or system integrity should be disclosed clearly.

Description-Behavior Mismatch

Medium
Confidence
88% confidence
Finding
Manifest 将技能定位为生成特定主题资讯电台、定时推送、TTS 配置和历史收听,不适用范围还排除了与资讯电台无关的内容。该示例却宣称可把“Python编程基础教程”转成音频,语义上更接近通用文档音频化/朗读能力,而非资讯电台生成。

Skill Enumeration

Medium
Category
Agent Snooping
Content
```bash
# 检查SKILL.md
cat ~/.openclaw/workspace/skills/lobster-radio-skill/SKILL.md

# 查看日志
openclaw logs | grep lobster-radio
Confidence
80% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The uninstall section includes a recursive deletion command but does not clearly warn that it permanently removes the skill directory and any local data stored under it. In an installation guide, such commands can be copied blindly, increasing the chance of accidental data loss if the path is mistaken, expanded unexpectedly, or contains user-generated content.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The manual update instructions tell users to delete the existing skill directory during upgrade without a prominent warning that unbacked-up configuration, generated media, or runtime state may be lost. Even though a partial backup step is shown, the guidance does not guarantee all important data is preserved, so users may unintentionally destroy local state.

Natural-Language Policy Violations

Medium
Confidence
93% confidence
Finding
This markdown file presents all user-facing instructions and usage guidance exclusively in Chinese, with no opt-in, alternative language path, or justification that the skill is intended only for a Chinese-speaking region or audience. That can violate language/locale policy where skills are expected to avoid forcing a specific language without user choice.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The documentation states that data is processed locally with no cloud upload or API costs, but the same skill description depends on external news search and model downloads, which require outbound network access. This creates a misleading security and privacy claim that could cause users or administrators to enable the skill under false assumptions about data exposure and connectivity requirements.

Natural-Language Policy Violations

Medium
Confidence
86% confidence
Finding
This markdown file presents all user-facing instructions in Chinese and does not indicate that users may choose another language or that the skill is intentionally limited to a Chinese-speaking region. Under the policy, forcing a specific language without opt-in is a natural-language policy concern.

Static analysis

Detected: suspicious.destructive_delete_command

Documentation contains a destructive delete command without an explicit confirmation gate.

Warn
Code
suspicious.destructive_delete_command
Location
INSTALL.md:285