Back to skill

Security audit

Viral Video Analysis

Security checks for vulnerabilities and agentic risk

Overview

The skill is related to video-ad coaching, but its real behavior is narrower than advertised and it sends video URLs to a third-party API.

Install only if you are comfortable sending video URLs to Memories.ai and treating the output as lightweight transcript/ROI coaching rather than full visual ad analysis. Avoid using unpublished, client-confidential, or highly sensitive campaign URLs unless that third-party processing is acceptable, and install dependencies in an isolated environment with pinned versions where possible.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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 (1)

T08 · Insecure Dependencies

Note
Location
SKILL.md:11
Finding
Unpinned Third-Party Dependency Installation Guidance<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:11`, `scripts/generate_report.py:7`, and `scripts/generate_report.py:14-19` **Vulnerability Type**: Unconstrained third-party dependencies and inaccurate installation documentation **Risk Level**: Low ### Vulnerable Code `SKILL.md:11`: ```markdown - **Python packages**: `generate_report.py` will auto-install `fpdf2`, `pandas`, `openpyxl` if missing ``` `scripts/generate_report.py:7`: ```python Requirements: pip install fpdf2 pandas openpyxl ``` `scripts/generate_report.py:14-19`: ```python try: from fpdf import FPDF import pandas as pd except ImportError: print("Error: Missing required packages.") print("Install with: pip install fpdf2 pandas openpyxl") sys.exit(1) ``` ### Technical Analysis The project instructs users to install `fpdf2`, `pandas`, and `openpyxl` without pinning reviewed versions or verifying package hashes. The repository contains no dependency lock file or hash-verified requirements file. An unconstrained command such as: ```bash pip install fpdf2 pandas openpyxl ``` resolves mutable package versions from the configured Python package index. If a future release is compromised, a package-index account is taken over, or the user's package index is maliciously configured, installation or subsequent import could execute attacker-controlled code with the privileges of the user running `pip` or the report generator. The documentation also states that `generate_report.py` automatically installs packages. The inspected implementation does not do so; it prints an installation command and exits. Although this discrepancy does not itself execute code, it may cause users to trust and follow an inadequately controlled dependency-installation workflow. ### Attack Path 1. A user invokes `scripts/generate_report.py` in an environment where one or more required packages are missing. 2. The import operation fails, and the script recommends running the unconstrai ...[truncated 1413 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Add a reviewed dependency file with exact versions, for example: ```text fpdf2==<reviewed-version> pandas==<reviewed-version> openpyxl==<reviewed-version> ``` 2. Generate and record cryptographic hashes for all direct and transitive dependencies, then install them with: ```bash python -m pip install --require-hashes -r requirements.txt ``` 3. Use a lock-file workflow such as `pip-tools`, Poetry, or another reproducible dependency manager to control transitive versions. 4. Run automated dependency vulnerability and integrity checks in CI, using tools such as `pip-audit`, and review dependency updates before merging them. 5. Install dependencies inside an isolated virtual environment under a non-privileged account. Do not recommend system-wide or elevated `pip` installation. 6. Correct `SKILL.md` to state that the script detects missing dependencies and prints manual installation instructions; it does not automatically install packages. 7. Prefer a controlled package index and explicitly document the trusted source used for dependency resolution. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (14)

Tainted flow: 'HEADERS' from os.environ.get (line 20, credential/environment) → requests.post (network output)

Critical
Category
Data Flow
Content
return {"error": "Platform not supported (Facebook)"}
    
    try:
        resp = requests.post(
            f"{BASE_URL}/{platform}/video/transcript",
            headers=HEADERS,
            json={"video_url": video_url, "channel": "rapid"},
Confidence
90% confidence
Finding
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding
The description significantly overstates the skill’s functionality. The code’s core behavior is a transcript-length heuristic: it calls an external API to fetch a transcript, counts words, assigns GOOD/OK/BAD based on thresholds, and emits stock feedback about reducing spoken words. It does not inspect visuals, does not ingest or analyze performance metrics, and does not perform substantive ad-performance analysis, ROI comparison, or structural diagnosis beyond word count. While the broad social platforms mostly align, the primary purpose in practice is much narrower than declared. There is also an extra undeclared batch Excel-analysis feature, though the main issue is that the implemented behavior is materially less capable than the description claims.

Tp4

High
Category
MCP Tool Poisoning
Confidence
93% confidence
Finding
The declared description promises a substantive video ad analysis capability combining audio transcripts, visual analysis, and performance metrics to explain underperformance and coach creators. The supplied code does not inspect videos, transcripts, or social platform content at all. It reads spreadsheet columns like creator, ad_spend, earnings, and roi, computes simple aggregates/groupings, and inserts fixed findings, thresholds, and feedback text into a PDF. While the output topic is related to video performance, the implemented behavior is materially narrower and different: report generation from existing tabular data rather than multimodal analysis of ad creatives. Therefore this is a clear description-behavior mismatch.

Lp3

Medium
Category
MCP Least Privilege
Confidence
88% confidence
Finding
The skill uses environment secrets and makes outbound network requests, but it does not declare an explicit tool/permission scope. That weakens least-privilege controls and makes it harder for a runtime or reviewer to understand what capabilities the skill actually needs before execution.

Vague Triggers

Medium
Confidence
91% confidence
Finding
The description says to use the skill when asked to 'give creator coaching feedback,' 'compare high vs low ROI content,' or 'identify video structure issues' without narrowing the context to ad-performance analysis only. These are broad, natural phrases that could match ordinary conversations and cause unintended invocation.

External Transmission

Medium
Category
Data Exfiltration
Content
HEADERS = {"Authorization": API_KEY}

def get_transcript(url: str, platform: str = "instagram"):
    resp = requests.post(
        f"{BASE_URL}/{platform}/video/transcript",
        headers=HEADERS,
        json={"video_url": url, "channel": "rapid"},
Confidence
91% confidence
Finding
The skill sends user-supplied video URLs and an API key-authenticated request to an external third-party service. Even though the transfer is part of the advertised functionality, it creates data-exposure risk because URLs, associated metadata, and potentially sensitive creator/workflow information leave the local trust boundary.

Vague Triggers

Medium
Confidence
94% confidence
Finding
The listed commands include broad phrases like 'Compare these videos' and 'Give me feedback for [creator]' that do not specify platform, ad-analysis context, or required inputs. Without exclusions or narrower phrasing, these triggers could collide with many everyday requests unrelated to this specific skill.

Intent-Code Divergence

Medium
Confidence
90% confidence
Finding
The module documentation overstates the capability as full video and performance analysis, while the logic only evaluates transcript length. Overclaiming functionality creates deceptive trust boundaries: users may expose content or rely on output for creator/business decisions under false assumptions about what was actually analyzed.

Description-Behavior Mismatch

Medium
Confidence
97% confidence
Finding
The skill description claims multimodal and performance-metric analysis, but the implementation only fetches a transcript and scores word count. This mismatch can mislead users into sharing business-sensitive videos or making decisions based on a much more limited analysis than advertised, which is a security-relevant trust and transparency issue.

External Transmission

Medium
Category
Data Exfiltration
Content
return {"error": "Platform not supported (Facebook)"}
    
    try:
        resp = requests.post(
            f"{BASE_URL}/{platform}/video/transcript",
            headers=HEADERS,
            json={"video_url": video_url, "channel": "rapid"},
Confidence
87% confidence
Finding
This code performs external transmission of user-provided video identifiers to a third-party service. While external API calls are expected for this tool, the transmission is security-relevant because it can disclose sensitive campaign, customer, or unpublished media metadata outside the local environment.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The script sends user-supplied video URLs to an external API and receives transcript data without any runtime disclosure or consent prompt. In this skill context, creators may analyze unpublished, proprietary, or client content, so silent third-party transmission increases privacy, confidentiality, and compliance risk.

Intent-Code Divergence

Medium
Confidence
89% confidence
Finding
The module documentation claims the script generates a report from video performance data, but the output includes predetermined findings and recommendations unrelated to the actual spreadsheet contents. This creates a software integrity and trust issue: operators may rely on the report as an objective analysis when it is partly static and potentially misleading.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The report presents hard-coded conclusions, coaching guidance, and example judgments as if they were part of a data-driven analysis, which can mislead users into making business decisions based on unsupported claims. In this skill context, that is more dangerous because users expect creator-performance recommendations to be derived from the uploaded dataset, not fixed editorial content.

Missing User Warnings

Low
Confidence
77% confidence
Finding
This code writes a new PDF file to disk using data loaded from the provided spreadsheet. Although it prints the saved path afterward, there is no prior warning, confirmation, or explanatory comment/docstring specifically disclosing that input data will be exported into a persistent report file, which can matter when the report contains performance and creator-level data.

Static analysis

No suspicious patterns detected.