Back to skill

Security audit

Genviral - Social Media Automation

Security checks for vulnerabilities and agentic risk

Overview

This skill is legitimate social-media automation, but it needs review because it can publish or delete live content, set up recurring autonomous posting, and uses risky credential/config loading.

Install only if you are comfortable giving the skill authority over connected social accounts. Start with test accounts or draft/self-only modes, avoid enabling the cron jobs until you add explicit approval before posting, protect and rotate GENVIRAL_API_KEY if exposed, do not store secrets in shared or committed env files, keep the API base URL pinned to Genviral, and manually confirm any delete or bulk-delete operation.

Vulnerability Patterns
  • System PersistenceInstalls backdoors, hooks, services, or scheduled tasks that survive the run
  • 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)

T06 · System Persistence

Error
Location
cron-setup.md:20
Finding
Persistent Autonomous Agent Jobs Can Publish Content Without Per-Run Approval<![CDATA[ ## Vulnerability Details **File Location**: `cron-setup.md:20-26`, `cron-setup.md:32-38`, `cron-setup.md:44-50` **Vulnerability Type**: `T06: System Persistence` **Risk Level**: High ### Vulnerable Code ```bash openclaw cron add \ --name "Genviral: Daily Content" \ --cron "0 9 * * *" \ --tz "YOUR_TIMEZONE" \ --session isolated \ --message "Run the Genviral daily content pipeline. Read the genviral SKILL.md, then: 1) Pick a topic from content/scratchpad.md or generate a new one based on performance/insights.md. 2) Generate a slideshow with a strong hook. 3) Render all slides. 4) Review each slide visually. If any slide is below quality, regenerate it. 5) Post to the default account. 6) Log the post in performance/log.json. Use the hooks that have the highest weights in hooks/library.json." \ --announce ``` ```bash openclaw cron add \ --name "Genviral: Performance Check" \ --cron "0 18 * * *" \ --tz "YOUR_TIMEZONE" \ --session isolated \ --message "Run the Genviral performance check. Read the genviral SKILL.md, then: 1) Run analytics-summary to get overall stats. 2) Run analytics-posts to get individual post metrics. 3) Update performance/log.json with latest metrics for posts older than 24h. 4) If any post significantly outperformed or underperformed, note why in performance/insights.md. 5) Report a brief summary of today's content performance." \ --announce ``` ```bash openclaw cron add \ --name "Genviral: Weekly Review" \ --cron "0 10 * * 0" \ --tz "YOUR_TIMEZONE" \ --session isolated \ --message "Run the Genviral weekly review. Read the genviral SKILL.md, then: 1) Analyze all posts from the past 7 days in performance/log.json. 2) Identify top 3 and bottom 3 performers. 3) Update hook weights in hooks/library.json (increase weight for hooks that drove high engagement, decrease for underperformers). 4) Update performance/insights.md with this week's learnings. 5) Generate 5 new content ideas for next week in conten ...[truncated 2053 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Do not present automatic publishing as the default scheduled workflow. 2. Require explicit, informed opt-in separately for each scheduled job. 3. Make scheduled content generation produce drafts only; require interactive approval before publication. 4. Display the exact target accounts, frequency, expected API usage, and files that each task may modify before installation. 5. Add an approval token or queue that a human must confirm before any `create-post` operation. 6. Use narrowly scoped API credentials for scheduled analytics and draft generation. 7. Separate read-only analytics jobs from write-capable publishing jobs. 8. Include explicit removal instructions, such as listing jobs and removing each generated job ID. 9. Add rate limits and a maximum lifetime or expiration date to recurring jobs. 10. Protect mutable prompt and strategy files from untrusted modifications before scheduled sessions load them. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
scripts/genviral.sh:176
Finding
Automatic Sourcing of a Global Environment File Enables Arbitrary Shell Execution<![CDATA[ ## Vulnerability Details **File Location**: `scripts/genviral.sh:176-179`, with unconditional startup invocation at `scripts/genviral.sh:2914-2915` **Vulnerability Type**: `T09: Insecure Skill Coding Practices` **Risk Level**: High ### Vulnerable Code ```bash load_defaults() { # Load env file if available [[ -f "${HOME}/.config/env/global.env" ]] && source "${HOME}/.config/env/global.env" 2>/dev/null || true API_KEY="${GENVIRAL_API_KEY:-}" BASE_URL="$(config_get base_url "https://www.genviral.io/api/partner/v1")" DEFAULT_PACK_ID="$(config_get default_pack_id "")" DEFAULT_SLIDE_COUNT="$(config_get default_slide_count "5")" DEFAULT_ASPECT_RATIO="$(config_get default_aspect_ratio "4:5")" DEFAULT_TYPE="$(config_get default_type "educational")" DEFAULT_STYLE="$(config_get default_style_preset "tiktok")" DEFAULT_LANGUAGE="$(config_get language "en")" DEFAULT_ACCOUNT_IDS="$(config_get default_account_ids "")" DEFAULT_PRIVACY="$(config_get privacy_level "PUBLIC_TO_EVERYONE")" DEFAULT_POST_MODE="$(config_get post_mode "DIRECT_POST")" HTTP_CONNECT_TIMEOUT="$(config_get connect_timeout "10")" HTTP_MAX_TIME="$(config_get max_time "120")" HTTP_RETRIES="$(config_get retries "2")" HTTP_RETRY_DELAY="$(config_get retry_delay "2")" } ``` The function executes before command dispatch: ```bash check_deps load_defaults COMMAND="${1:-help}" shift 2>/dev/null || true ``` ### Technical Analysis Bash `source` does not treat the target as a data-only environment file. It executes every shell construct in that file in the current process. Consequently, aliases, functions, command substitutions, redirections, external commands, and arbitrary shell statements placed in `~/.config/env/global.env` execute with the privileges of the user invoking the wrapper. The global file is loaded before command selection, authentication checks, and API operations. Therefore, the behavior is triggered even for apparent ...[truncated 1443 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the `source "${HOME}/.config/env/global.env"` operation. 2. Obtain `GENVIRAL_API_KEY` directly from the process environment or a dedicated secrets manager. 3. If file-based loading is required, use a Skill-specific file and parse it strictly as data rather than shell code. 4. Allowlist only expected names, such as `GENVIRAL_API_KEY`. 5. Reject command substitutions, shell metacharacters, multiline values, export functions, and unknown keys. 6. Verify that the file is a regular file, is owned by the current user, and is not group- or world-writable. 7. Refuse symbolic links where a dedicated credential file is used. 8. Require restrictive permissions such as mode `0600`. 9. Do not suppress parser or permission errors; report them clearly without printing secret values. 10. Avoid loading credential files for unauthenticated commands such as `help`. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/genviral.sh:218
Finding
Unvalidated Configurable API Endpoint Can Receive the Genviral Bearer Token<![CDATA[ ## Vulnerability Details **File Location**: `scripts/genviral.sh:90`, `scripts/genviral.sh:181`, `scripts/genviral.sh:218-240` **Vulnerability Type**: `T09: Insecure Skill Coding Practices` **Risk Level**: Medium ### Vulnerable Code The configuration path can be selected through an environment variable: ```bash CONFIG_FILE="${GENVIRAL_CONFIG:-${SKILL_DIR}/defaults.yaml}" ``` The API destination is then read without scheme or hostname validation: ```bash API_KEY="${GENVIRAL_API_KEY:-}" BASE_URL="$(config_get base_url "https://www.genviral.io/api/partner/v1")" ``` Every API request sends the bearer token to the resulting destination: ```bash api_call() { local method="$1" local endpoint="$2" local body="${3:-}" local url="${BASE_URL%/}${endpoint}" local curl_args=( -sS --connect-timeout "$HTTP_CONNECT_TIMEOUT" --max-time "$HTTP_MAX_TIME" --retry "$HTTP_RETRIES" --retry-delay "$HTTP_RETRY_DELAY" -X "$method" -H "Authorization: Bearer ${API_KEY}" -H "Content-Type: application/json" -w '\n%{http_code}' ) [[ -n "$body" ]] && curl_args+=(-d "$body") local response response="$(curl "${curl_args[@]}" "$url" 2>&1)" || { die "Request failed: curl error for $method $endpoint" } ``` ### Technical Analysis The wrapper treats `base_url` as trusted configuration even though the configuration file can be selected through `GENVIRAL_CONFIG`. It does not enforce HTTPS, verify that the hostname is an approved Genviral domain, or otherwise bind the bearer token to its intended origin. As a result, anyone who can influence the process environment or selected configuration file can redirect authenticated requests to another host. The `Authorization: Bearer` header is then transmitted to that host. The default checked-in value is the legitimate endpoint: ```yaml base_url: "https://www.genviral.io/api/partner/v1" ``` Therefore, exploitation re ...[truncated 1318 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin authenticated requests to the documented Genviral API origin whenever custom endpoints are unnecessary. 2. If endpoint customization is required, enforce an explicit hostname allowlist. 3. Require the `https` scheme and reject plaintext HTTP, embedded credentials, IP literals, and unexpected ports. 4. Parse URLs with a dedicated parser rather than relying on string concatenation. 5. Bind credentials to an expected origin and refuse to attach the bearer token to any other destination. 6. Validate configuration ownership and permissions before loading it. 7. Do not permit an inherited environment variable to silently replace security-sensitive configuration without explicit user approval. 8. Add Curl protocol restrictions such as `--proto '=https'`. 9. Keep redirects disabled for authenticated calls unless every redirect target is revalidated and the authorization header is removed across origins. 10. Add automated tests confirming that non-Genviral endpoints and insecure schemes are rejected before network transmission. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • 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
Findings (25)

Direct Prompt Extraction

High
Category
System Prompt Leakage
Content
1. **Hook Selection:** Read `hooks/library.json` and pick a hook. Rotate through categories.

2. **Prompt Assembly:** Use the selected hook to build a full slideshow prompt. Reference `prompts/slideshow.md`.

3. **Generate Slideshow:** Run `generate` with the assembled prompt.
Confidence
85% confidence
Finding
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Direct Prompt Extraction

High
Category
System Prompt Leakage
Content
# Slideshow Prompt Templates

Use these templates when generating slideshows via the genviral API. Before using any template:
Confidence
85% confidence
Finding
Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Tool Parameter Abuse

High
Category
Tool Misuse
Content
analytics-target-create         POST /analytics/targets
  analytics-target                GET /analytics/targets/{id}
  analytics-target-update         PATCH /analytics/targets/{id}
  analytics-target-delete         DELETE /analytics/targets/{id}
  analytics-target-refresh        POST /analytics/targets/{id}/refresh
  analytics-refresh | get-analytics-refresh
                                  GET /analytics/refreshes/{id}
Confidence
90% 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).

Tool Parameter Abuse

High
Category
Tool Misuse
Content
require_arg "id" "$pack_id"
    warn "Deleting pack $pack_id..."

    api_call DELETE "/packs/${pack_id}" >/dev/null

    ok "Pack deleted."
}
Confidence
90% 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).

Tool Parameter Abuse

High
Category
Tool Misuse
Content
warn "Deleting image $image_id from pack $pack_id..."

    api_call DELETE "/packs/${pack_id}/images/${image_id}" >/dev/null

    ok "Image deleted from pack."
}
Confidence
90% 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).

Tool Parameter Abuse

High
Category
Tool Misuse
Content
require_arg "id" "$template_id"
    warn "Deleting template $template_id..."

    api_call DELETE "/templates/${template_id}" >/dev/null

    ok "Template deleted."
}
Confidence
90% 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).

Tool Parameter Abuse

High
Category
Tool Misuse
Content
require_arg "id" "$slideshow_id"
    warn "Deleting slideshow $slideshow_id..."

    api_call DELETE "/slideshows/${slideshow_id}" >/dev/null

    ok "Slideshow deleted."
}
Confidence
90% 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).

Tool Parameter Abuse

High
Category
Tool Misuse
Content
warn "Deleting analytics target $id..."

    local response
    response="$(api_call DELETE "/analytics/targets/${id}")"

    ok "Analytics target deleted"
    printf '%s' "$response" | jq '.data'
Confidence
90% 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).

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The quick-start examples include render and create-post commands that can immediately publish media to connected accounts, but they are presented like routine setup steps without an explicit live-posting warning. Because this skill's purpose is cross-platform publishing, a user or downstream agent could run these commands assuming they are harmless examples, leading to unintended public posts on TikTok, Instagram, or other linked platforms.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The README explicitly promotes unattended cron-based automation of the full pipeline, including generate, render, review, and post, but does not clearly warn that this can publish content to real connected social accounts without human approval. In a skill designed to operate across multiple platforms, this omission materially increases the chance of accidental mass posting, brand damage, policy violations, or abuse if the skill is misconfigured or invoked in the wrong environment.

Lp3

Medium
Category
MCP Least Privilege
Confidence
95% confidence
Finding
The skill exposes extensive shell-based capabilities through a bash wrapper but does not declare any tool scope or permissions boundary. This increases the chance an agent invokes networked or state-changing commands without explicit policy gating, especially because the skill includes upload, posting, deletion, and analytics actions.

Vague Triggers

Medium
Confidence
84% confidence
Finding
The description claims support for posting to 'any supported platform,' which is overly broad and can cause an agent to over-trust the skill's applicability or perform actions against unintended account types. In a posting automation skill, ambiguous scope increases operational risk because agents may assume capabilities or compatibility that have not been clearly bounded.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The skill documents immediate publishing, scheduling, retry, and deletion workflows without a strong up-front warning that these are live, externally visible, and potentially destructive actions. In an automation context, an agent could publish content or delete posts with insufficient user awareness or confirmation, causing reputational or operational harm.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The upload section explains how to transfer local files to Genviral's CDN but does not clearly warn that selected files leave the local environment and are transmitted to third-party infrastructure. This creates privacy and data handling risk if an agent uploads sensitive, proprietary, or personal media without the user understanding the destination and retention implications.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
This is a real safety issue because the file provides ready-to-run cron jobs that will autonomously generate content, post to external social media accounts, and modify local tracking files without an explicit warning about unattended actions. In this skill's context, the risk is heightened because the scheduled prompts instruct the agent to make publishing and file-update decisions automatically, which can lead to unauthorized posts, brand damage, or persistent bad state in local data if the workflow misfires.

Natural-Language Policy Violations

Medium
Confidence
97% confidence
Finding
The configuration hard-codes `language: "en"`, which imposes a specific language choice without indicating user selection, opt-in, or justification. This is a natural-language policy concern because it can override user locale expectations without offering a choice.

Context-Inappropriate Capability

Medium
Confidence
97% confidence
Finding
The script sources ${HOME}/.config/env/global.env during startup, which executes arbitrary shell content from the local host rather than merely reading configuration. In an agent skill context, this expands scope from Partner API automation into host-side secret access and code execution via a user-controlled file, increasing the blast radius well beyond the advertised functionality.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The script performs irreversible deletion of a pack immediately after printing a warning message, but does not require user confirmation or an explicit force flag. Under the code-file criteria, destructive operations should include some user disclosure safeguard; a warning-only log is weaker than an interactive confirmation for irreversible deletes, especially in a broad automation wrapper.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
This command deletes a pack image immediately after logging a warning, with no prompt or opt-in flag to confirm the irreversible action. Because the operation modifies remote user data, the current disclosure is minimal and does not ensure the user intended the deletion.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The delete-template command performs an irreversible remote deletion with only a warning log before execution. For destructive operations in code files, a clearer user-facing safeguard such as confirmation or an explicit force option is appropriate to prevent accidental data loss.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The command deletes a slideshow after emitting a warning, but there is no confirmation step before the irreversible API call. Since this removes user content remotely, accidental invocation could lead to unwanted data loss without sufficient runtime disclosure.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
This bulk deletion command can remove up to 50 posts but only emits a warning before submitting the delete request. The lack of confirmation or a force-style acknowledgment is a missing user warning for a high-impact destructive operation affecting multiple remote resources.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The command deletes an analytics target after a warning log but offers no confirmation prompt or explicit user acknowledgment. For irreversible remote deletions, this is insufficient protection against accidental command execution.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The setup guide instructs users to persist an API key in an environment file without warning that the value contains a secret credential that must be protected from source control, shared machines, backups, and logs. In a skill that automates posting and account management across social platforms, exposure of this key could let an attacker create, modify, or schedule content and access connected account data through the Genviral API.

Vague Triggers

Low
Confidence
84% confidence
Finding
This manifest config enables posting every day of the week at a configured time, but it does not document any limiting conditions, exclusion cases, or narrower activation context for when automated posting should or should not occur. For manifest files, missing specificity on trigger scope or constraints can lead to unintended skill invocation or execution patterns.