Back to skill

Security audit

Directoryahu

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent video-generation pipeline, but it needs review because its executable orchestrator can write state files outside its output folder and claims a face-detection gate that is not implemented.

Review before installing. Run it only in a constrained workspace account, validate story_id values from users and agents, confine all writes to a dedicated output directory, implement real fail-closed face detection before generating videos, and require explicit user consent before sending narration or images to external TTS, image, or cloud-detection providers.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T09 · Insecure Skill Coding Practices

Error
Location
orchestrator.py:73
Finding

User-Controlled Story Identifier Enables Path Traversal and Arbitrary JSON File Overwrite

Content
View full analysis
Remediation
View remediation
str: if not STORY_ID_PATTERN.fullmatch(story_id): raise ValueError("Invalid story ID") return story_id ``` 2. Apply validation both to command-line input and to identifiers returned by external agents. 3. Resolve the destination and verify containment before writing: ```python def save(self, output_dir: Path): output_root = output_dir.resolve() safe_id = validate_story_id(self.story_id) state_file = (output_root / f"{safe_id}_state.json").resolve() if output_root not in state_file.parents: raise ValueError("State path escapes output directory") with open(state_file, "w", encoding="utf-8") as f: json.dump(self.__dict__, f, indent=2, default=str) ``` 4. Use atomic writes to prevent partial or corrupted state: - Create a temporary file inside `output_dir`. - Flush and synchronize it. - Replace the final file atomically with `os.replace()`. 5. Run the pipeline under a dedicated, least-privileged account whose write access is restricted to the intended output and data directories. 6. Add tests covering `../`, absolute paths, platform-specific separators, repeated separators, excessively long IDs, and agent-returned malicious IDs. ]]>

other

Warning
Location
orchestrator.py:318
Finding

Mandatory Face-Detection Safety Gate Is Implemented as a No-Op

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (13)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
87% confidence
Finding

The skill orchestrates agents that write outputs to disk ('Save video to output directory', create MP4/thumbnail/SRT, log to content calendar) but does not declare any explicit tool scope or allowed-tools boundary. In a multi-agent pipeline with filesystem-capable components, missing scope restrictions can allow broader-than-necessary file writes, increasing risk of unintended overwrite, data tampering, or writing outside the intended workspace.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger conditions are broad ('whenever the user wants to create Islamic content videos', mentions 'story videos', 'faceless creator', or batch-produce religious short-form content), which can cause the skill to activate for loosely related requests. Because this skill launches a complex multi-agent workflow with web search, image generation, TTS, and file-producing assembly steps, accidental invocation could trigger unnecessary tool use, external API calls, and content generation beyond user intent.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
Confidence
88% confidence
Finding

The pipeline persists full state objects to disk, including intermediate agent outputs and errors, without any access control, redaction, or storage protections. In this skill context, those artifacts may contain sensitive prompts, generated scripts, file paths, metadata, or operational details that could be exposed to other local users or retained longer than intended.

Content

Scanner excerpt · orchestrator.py (reported line 73)May include surrounding context.

python
completed_at: Optional[str] = None

    def save(self, output_dir: Path):
        """Persist state to disk for resume capability."""
        state_file = output_dir / f"{self.story_id}_state.json"
        with open(state_file, "w") as f:
            json.dump(self.__dict__, f, indent=2, default=str)

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The code explicitly documents face detection as a hard gate, but _validate_no_faces() is a stub that always returns without checking anything. That means the pipeline can proceed under a false safety assumption and generate or publish content that violates its own policy controls, reducing trust in downstream safety guarantees.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The configuration hard-codes target_languages to ['en'] and sets default_language to en, which imposes a language constraint in the skill's natural-language behavior. The file does not present this as an explicit user choice or document a justified region-specific limitation, so it matches the locale-policy violation criteria.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This markdown file includes a natural-language/output policy that fixes the generated script language to en. The rule for SQP-3 applies to all file types and flags forced language constraints when there is no user opt-in or documented justification for the locale restriction.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
88% confidence
Finding

The instruction fixes the agent role as an 'Islamic story researcher' and the entire output format assumes Islamic framing and audience context. This imposes a specific cultural/religious scope by default rather than offering user choice or documenting the constraint as an explicit opt-in policy.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The schema requires 'text_arabic' and later mandates specific Arabic honorific formatting, which enforces a language/locale convention regardless of user preference. The file does not indicate that users may choose another language presentation or opt out of this formatting.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
77% confidence
Finding

The skill fixes a specific narrator portrayal tied to a religious/cultural aesthetic without indicating that this is a configurable creative choice. In context, this is less a technical exploit than a product-safety and representation issue: it can enforce a narrow depiction users did not request and may create avoidable cultural or reputational harm.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The skill explicitly recommends cloud face-detection providers but does not warn that generated images may be transmitted to third-party services for processing and logging. That creates a privacy and data-governance risk, especially if outputs contain sensitive religious, branded, or user-provided material and the operator assumes all processing is local.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill explicitly routes user-provided narration text to third-party TTS providers (ElevenLabs or OpenAI) but does not mention consent, disclosure, or data-handling expectations. Even if the content is not highly sensitive by design, scripts may contain unpublished, proprietary, or personal material, so silent external transmission creates a real privacy and compliance risk.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
85% confidence
Finding

This manifest includes multiple supported languages at L78, but L79 sets a fixed default language of "en" with no accompanying indication that the user can choose or override the locale. That creates a natural-language locale policy concern because the configuration implicitly privileges one language without documented opt-in.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
79% confidence
Finding

The requirement for 'Broad appeal across Muslim audiences' hard-codes a particular audience locale/cultural scope into the skill behavior. While this may be intentional, the file does not clearly frame it as a narrowly scoped domain skill or user-selected audience mode.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.