T01 · Skill Instruction Hijacking
- Location
SKILL.md:21- Finding
Mandatory Third-Party Promotional CTA Alters User-Requested Output
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This slideshow skill mostly matches its stated purpose, but it needs Review because it can steer generated videos toward a Clawlite.ai call-to-action and uses broad network, session, and file-write authority without enough safeguards.
Before installing, remove or override the Clawlite.ai CTA default, run only trusted project JSON files, prefer local images and audio, avoid sensitive prompts or private URLs, keep `OPENCLAW_BASE_URL` pinned to a trusted local endpoint, and run the pipeline in a constrained output directory.
SKILL.md:21Mandatory Third-Party Promotional CTA Alters User-Requested Output
scripts/generate_slides.py:96Unrestricted Remote Image and Audio Fetching Enables SSRF
scripts/resolve_images.py:148OpenClaw Session Credential Can Be Disclosed to an Arbitrary Configured Endpoint
scripts/run_pipeline.py:32Project-Controlled Paths Can Escape the Configured Output Directory
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
npm install
# Configure your OpenClaw environment
cp .env.example .env
# Add OPENAI_API_KEY, ELEVENLABS_API_KEY, etc.
# Generate a slideshow video from a blog post
Referenced artifact was not completely inspected
- `scripts/resolve_images.py`: resolve `imageQuery` values into usable remote image URLs
The README encourages ingestion of URLs, tweets, briefs, and transcripts, which can contain sensitive or proprietary data, yet it gives no warning that this content may be transmitted to external providers for fetching, image generation, narration, or rendering. In an agent-skill context, that omission increases the chance users unknowingly expose confidential material to third-party services.
The manifest describes a slideshow generator driven by image sources and structured copy, but the README expands the skill into a content-ingestion pipeline that accepts blog post URLs, tweet threads, and other arbitrary content sources. That is a broader behavior domain than the manifest's stated scope and changes the skill from asset assembly into source-content ingestion and transformation.
The manifest focuses on generating slideshows, captions, voice sync, and MP4 exports. The README describes additional behavior around Schema.org metadata generation, hosting-page transcript embedding, crawler indexing support, and cross-linking for discovery, which are publishing/SEO capabilities outside the manifest's stated asset-generation scope.
The setup instructions tell users to populate API keys and use external AI services, but they omit basic guidance on secret handling and third-party processing. This can lead to accidental credential exposure through committed .env files, shared environments, logs, or misunderstanding about where user data is sent.
The skill describes capabilities that involve shell execution, file read/write, environment access, and network retrieval, but it does not declare an explicit tool scope or permission boundary. That makes it easier for an agent or operator to invoke the skill with broader-than-necessary privileges, increasing the chance of unintended command execution, filesystem modification, or data exposure.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
references/pipeline.example.json to a working JSON file and replace the image sources and copy.The skill instructs users to download remote images and even resolve image queries into remote URLs, but it does not clearly warn that image sources, queries, IP address, and possibly project metadata may be transmitted to third parties and cached locally. This can leak sensitive prompts, campaign plans, or internal content sourcing behavior, especially in enterprise or confidential workflows.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
Use this path for TikTok or Shorts posts where voice timing must match the slide timing.
1. Write one spoken sentence per slide.
2. Generate one ordered audio file per sentence, such as `line_01.mp3`, `line_02.mp3`.
3. Keep on-screen text shorter than the sentence. Use captions as emphasis, not full transcript.
4. Generate slides in the same order.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
def run(cmd):
return subprocess.run(cmd, check=False)
def main():
The script explicitly allows --audio to be a remote URL and passes it to ffmpeg unchanged. That expands a local media-processing tool into one that can make outbound network requests, creating SSRF-style exposure, unexpected data egress, and risk from ffmpeg parsing untrusted remote content.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
def ffprobe_duration(path: Path) -> float:
out = subprocess.check_output([
'ffprobe', '-v', 'error', '-show_entries', 'format=duration',
'-of', 'default=noprint_wrappers=1:nokey=1', str(path)
], text=True).strip()
The script unconditionally recreates predictable intermediate files in the output directory, including concat manifests, merged audio, and sync metadata, before the user opts into overwrite behavior for the final export. In shared or automation-heavy environments, this can destroy prior outputs or overwrite attacker-planted symlink targets, causing data loss or unintended file modification.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
fv.write(f'duration {duration:.3f}\n')
fv.write(f"file '{slides[-1].as_posix()}'\n")
subprocess.run([
'ffmpeg', '-y', '-hide_banner', '-loglevel', 'error',
'-f', 'concat', '-safe', '0', '-i', str(audio_concat),
'-c:a', 'libmp3lame', '-q:a', '2', str(merged_audio)
The code sends user-provided image queries to external services such as Pinterest, Unsplash, and potentially an image-generation backend without any consent, warning, or privacy boundary. In this skill’s context, queries may encode campaign plans, customer data, or sensitive prompts, so silent third-party disclosure is a real privacy and data-handling risk even if it is part of the intended functionality.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
def run(cmd):
subprocess.run(cmd, check=True)
def main():
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
def run(cmd):
subprocess.run(cmd, check=True)
def main():
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
def run(cmd):
subprocess.run(cmd, check=True)
def main():
The tech stack explicitly includes web_fetch, pdf, summarize, and sessions_spawn, which indicates a broader orchestration and content acquisition workflow than simply generating slideshow assets and MP4s from supplied images/copy. While related to content production, these capabilities materially expand the skill's operational scope beyond the manifest wording.
ffmpeg is invoked with an attacker-controlled secondary input that may be a remote URL, causing the host running the skill to retrieve and parse arbitrary remote media. In an agent or automation environment, this is more dangerous because it can be abused for internal network access, metadata-service probing, or denial of service through oversized or malformed media.
When --output is provided, the script writes a file to disk, but the code gives no explicit disclosure beyond the argument name that it will create or overwrite a file. This is a file-write operation in a code file and lacks a clear warning, confirmation, or explanatory comment.
No suspicious patterns detected.