Back to skill

Security audit

Genviral Skill

Security checks for vulnerabilities and agentic risk

Overview

The Genviral posting skill is mostly coherent, but it includes an updater and recommended daily cron job that can replace the skill's own instructions and scripts from a mutable GitHub branch without integrity verification.

Install only if you are comfortable granting this skill access to a Genviral API key and connected social accounts. Avoid enabling the daily self-update cron; prefer manual reviewed updates from pinned releases, and review posts, target accounts, and delete operations before running automation.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • 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
Findings (4)

T03 · Remote Payload Retrieval and Execution

Error
Location
scripts/update-skill.sh:72
Finding
Unauthenticated Remote Replacement of Executable Skill Code<![CDATA[ ## Vulnerability Details **File Location**: `scripts/update-skill.sh:72-79`, `scripts/update-skill.sh:99-114` **Vulnerability Type**: Remote payload retrieval and execution **Risk Level**: Critical ### Vulnerable Code ```bash # Resolve GitHub token (explicit env var, or from gh CLI) GH_TOKEN="${GITHUB_TOKEN:-$(gh auth token 2>/dev/null || echo "")}" REMOTE_SHA=$(curl -sf \ -H "Accept: application/vnd.github.v3+json" \ -H "Authorization: Bearer $GH_TOKEN" \ "https://api.github.com/repos/fdarkaou/genviral-skill/commits/$REMOTE_BRANCH" \ | jq -r '.sha' 2>/dev/null || echo "") ``` ```bash for FILE in "${SKILL_OWNED_FILES[@]}"; do RAW_URL="https://raw.githubusercontent.com/fdarkaou/genviral-skill/$REMOTE_SHA/$FILE" TARGET="$SKILL_DIR/$FILE" if [[ "$DRY_RUN" == "true" ]]; then echo "[DRY RUN] Would update: $FILE" continue fi # Fetch and write atomically TMPFILE=$(mktemp) if curl -sf "$RAW_URL" -o "$TMPFILE"; then mkdir -p "$(dirname "$TARGET")" mv "$TMPFILE" "$TARGET" # Make scripts executable [[ "$FILE" == scripts/* ]] && chmod +x "$TARGET" ``` ### Technical Analysis The updater obtains the latest commit identifier from the upstream repository's mutable `main` branch and then downloads files from that commit. It overwrites local executable scripts, documentation, and `SKILL.md`, and explicitly marks downloaded scripts as executable. Using the remotely returned commit SHA ensures that all downloaded files come from one commit, but it does not establish that the commit is an authorized, reviewed release. There is no locally pinned expected commit, signed-release verification, trusted-key validation, or hash manifest independent of the same upstream repository. The files subject to replacement include `scripts/genviral.sh`, `scripts/update-skill.sh`, and `SKILL.md`. Consequently, the remotely supplied payload can alter both locally executed shell code and the instructions subsequently loaded by the AI a ...[truncated 1372 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove unattended replacement of executable scripts and `SKILL.md`. 2. Require explicit user approval before downloading or applying an update. 3. Update only from immutable, reviewed releases rather than the mutable `main` branch. 4. Verify a signed release or signed commit against a locally configured trusted maintainer key. 5. Maintain an independently distributed or locally pinned manifest containing the expected SHA-256 digest of every updated file. 6. Download updates into a staging directory and present the file list, hashes, and diffs for review. 7. Refuse partial updates if any expected file is missing or fails verification. 8. Apply all files atomically only after every signature and hash has been validated. 9. Do not automatically mark newly downloaded content executable until verification succeeds. 10. Run update operations with a restricted environment that does not expose `GENVIRAL_API_KEY` or unrelated credentials. ]]>

T06 · System Persistence

Error
Location
docs/setup.md:195
Finding
Daily Scheduled Task Creates Persistent Remote Update Channel<![CDATA[ ## Vulnerability Details **File Location**: `docs/setup.md:195-206` **Vulnerability Type**: Persistent scheduled execution **Risk Level**: High ### Vulnerable Code ```bash openclaw cron add \ --name "Genviral: Daily Skill Update" \ --cron "0 6 * * *" \ --tz "YOUR_TIMEZONE" \ --session isolated \ --message "Run the genviral skill self-updater: bash scripts/update-skill.sh. It will check for updates to SKILL.md, scripts/, and docs/ from the upstream repo and apply them. Never touches workspace/. Report what was updated or confirm already up to date." \ --announce ``` ### Technical Analysis The setup documentation recommends installing an OpenClaw cron job that invokes the self-updater every day. This converts an optional update command into a cross-session, unattended mechanism that repeatedly downloads and installs mutable remote content. An isolated agent session does not eliminate the persistence risk because the updater writes directly into the installed Skill directory. Those modifications remain available to later sessions. The scheduled task therefore establishes a durable remote code and instruction update channel. Automatic updates are not necessary for the core declared functionality of creating media, publishing posts, and obtaining analytics. ### Attack Path 1. A user follows the recommended setup and installs the daily OpenClaw cron job. 2. The scheduled task runs `scripts/update-skill.sh` each day without per-update user authorization. 3. At any later time, the upstream `main` branch or maintainer account is compromised. 4. The next cron execution retrieves and installs the malicious upstream version. 5. Modified scripts or Skill instructions persist in the local installation. 6. Later automated posting jobs or interactive invocations execute or load the malicious content. ### Impact Assessment The scheduled task creates persistence across sessions and allows a later upstream compromise to affect systems that originall ...[truncated 422 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the recommendation to install an unattended daily updater. 2. Make update checks informational only and require explicit approval before applying changes. 3. If periodic checks are retained, have the job report that a signed release is available without downloading or modifying local files. 4. Pin automated environments to an administrator-approved release or commit. 5. Require signature and independent hash verification before any installation. 6. Record update provenance, verified signer identity, old and new versions, and file hashes in an append-only audit log. 7. Keep posting automation separate from code-update automation so compromise of one workflow does not automatically modify the other. 8. Provide clear removal and disablement instructions for any scheduled task. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/genviral.sh:190
Finding
Global Environment File Is Executed as Arbitrary Shell Code<![CDATA[ ## Vulnerability Details **File Location**: `scripts/genviral.sh:190-195` **Vulnerability Type**: Unsafe configuration-file execution **Risk Level**: Medium ### 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")" ``` ### Technical Analysis The script uses Bash `source` to load a file described as an environment file. `source` does not parse the file as passive key-value data. It executes all content in the current shell context, including command substitutions, functions, redirections, subprocess launches, and arbitrary shell commands. The file is global rather than Skill-specific, which expands the trust boundary. Any other process or tool capable of modifying that file can turn the next Genviral invocation into a code-execution opportunity. Execution occurs before the script reads `GENVIRAL_API_KEY`, so malicious commands in the file run in the same process environment and can inspect exported credentials or alter variables used by later API requests. ### Attack Path 1. An attacker or compromised local tool gains write access to `~/.config/env/global.env`. 2. The attacker inserts a shell command, command substitution, or malicious function into the file. 3. The user or an automated job invokes any command through `scripts/genviral.sh`. 4. `load_defaults` sources the file. 5. Bash executes the injected commands with the privileges of the invoking account. 6. The payload may inspect environment variables, alter configuration, or launch additional processes before normal API handling begins. ### Impact Assessment Exploitation provides arbitrary command execution with the permissions of the user or agent invoking the Skill. The payload can access exported environment variables, including `GENVIRAL_API ...[truncated 346 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Do not use `source` for environment configuration. 2. Prefer requiring the caller or service manager to provide `GENVIRAL_API_KEY` directly in the process environment. 3. If file-based configuration is necessary, parse only a strict allowlist of keys using a non-executing parser. 4. Reject lines containing shell metacharacters, command substitutions, function declarations, redirections, or unsupported syntax. 5. Validate file ownership and reject files writable by group or other users. 6. Use a Skill-specific configuration file rather than a shared global environment file. 7. Never suppress parsing or permission errors silently; fail closed with a clear diagnostic. 8. Ensure scheduled jobs expose only the minimum required environment variables. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/genviral.sh:194
Finding
Configurable API Base URL Can Redirect the Bearer Credential<![CDATA[ ## Vulnerability Details **File Location**: `scripts/genviral.sh:194-195`, `scripts/genviral.sh:232-253` **Vulnerability Type**: Unrestricted credential destination **Risk Level**: Medium ### Vulnerable Code ```bash API_KEY="${GENVIRAL_API_KEY:-}" BASE_URL="$(config_get base_url "https://www.genviral.io/api/partner/v1")" ``` ```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 API base URL is loaded from configurable YAML, but the value is not restricted to the official Genviral HTTPS origin. Every request constructed by `api_call` attaches the `GENVIRAL_API_KEY` as an `Authorization: Bearer` header. As a result, anyone capable of changing the configuration selected by `GENVIRAL_CONFIG`, or its `base_url` value, can choose the destination that receives the bearer credential. The code does not enforce HTTPS, validate the hostname, reject URL user information, or require explicit confirmation for a nonstandard endpoint. The network transmission itself is necessary for the declared API functionality, but allowing the credential destination to be changed without validation exceeds the minimum privilege required. ### Attack Path 1. An attacker modifies the active YAML configuration or causes `GENVIRAL_CONFIG` to select an attacker-controlled configuration. 2. The configuration sets `base_url` to an attacker-operat ...[truncated 1025 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Enforce `https` as the only permitted URL scheme. 2. Allow authenticated requests only to an explicit hostname allowlist, preferably the single official Genviral API hostname. 3. Validate the normalized URL using a real URL parser rather than shell substring checks. 4. Reject embedded user information, fragments, unexpected ports, IP-literal hosts, and ambiguous hostname forms. 5. Disable redirects for authenticated requests or validate every redirect target before forwarding credentials. 6. If custom endpoints are required for development, use a separate explicit flag and separate development credentials. 7. Display the destination and require confirmation before sending credentials to any non-production endpoint. 8. Protect the configuration file through restrictive ownership and permissions. 9. Avoid allowing an unrestricted environment variable to select arbitrary configuration without equivalent destination validation. ]]>
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 (48)

Self-Modification

High
Category
Rogue Agent
Content
scripts/
    genviral.sh             # 42+ commands wrapping every Partner API endpoint
    update-skill.sh         # Self-updater (keeps skill files current, never touches workspace/)

  prompts/
    slideshow.md            # Prompt templates for slideshow generation
Confidence
97% confidence
Finding
A documented self-updater is a direct self-modification capability: it can change executable scripts and agent instruction files after installation. In a skill environment, this creates a strong supply-chain and persistence risk because future behavior can diverge from the reviewed version without fresh security review.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The declared purpose focuses on Genviral API automation, but the skill also includes remote self-update behavior that reaches out to GitHub, overwrites local skill files, and performs version/lock coordination. This hidden expansion of behavior is dangerous because users and orchestrators may approve the skill for social posting tasks without realizing it can modify its own code and fetch unreviewed remote content.

Self-Modification

High
Category
Rogue Agent
Content
scripts/
    genviral.sh             # Main API wrapper (all commands)
    update-skill.sh         # Self-updater
```

## Command Routing
Confidence
98% confidence
Finding
The skill explicitly includes a self-updater script, which is a self-modification mechanism. In agent environments, self-modifying code is dangerous because it can replace trusted local behavior with newly fetched remote content, bypass prior review, and expand capabilities over time.

Self-Modification

High
Category
Rogue Agent
Content
## Auto-Updates

This skill includes a self-updater that keeps skill-owned files in sync with the latest version from `fdarkaou/genviral-skill`.

```bash
bash scripts/update-skill.sh           # check + apply if updates available
Confidence
99% confidence
Finding
The auto-update section operationalizes self-modification by instructing direct execution of a script that checks for and applies remote updates, including forced re-application. This creates a clear path for remote content ingestion and local overwrite, which is especially risky when the skill also has shell and network capabilities.

Ae1

High
Category
analysis-evasion
Content
**What gets updated (skill-owned):** `SKILL.md`, `scripts/`, `docs/` (all subdirs)
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Direct Prompt Extraction

High
Category
System Prompt Leakage
Content
Assign best-matching image to each slide. Build a `pinned_images` map.

### 5. Prompt Assembly
Use the selected hook and visual direction to build a slideshow prompt. Reference `workspace/content/scratchpad.md` and `docs/prompts/slideshow.md`.

### 6. Generate WITH Pinned Images
```bash
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.

Context-Inappropriate Capability

High
Confidence
98% confidence
Finding
The cron setup tells the agent to run a self-updater that pulls and applies changes from an upstream repo to SKILL.md, scripts/, and docs/ automatically. This creates a supply-chain and prompt-injection risk: future unreviewed upstream changes could alter agent behavior or introduce malicious commands without explicit user review.

Self-Modification

High
Category
Rogue Agent
Content
--cron "0 6 * * *" \
  --tz "YOUR_TIMEZONE" \
  --session isolated \
  --message "Run the genviral skill self-updater: bash scripts/update-skill.sh. It will check for updates to SKILL.md, scripts/, and docs/ from the upstream repo and apply them. Never touches workspace/. Report what was updated or confirm already up to date." \
  --announce
```
Confidence
99% confidence
Finding
The explicit self-update instruction is a self-modification mechanism that allows the skill's instructions and scripts to change over time outside the original reviewed artifact. In an agent setting, this is dangerous because compromised upstream content or malicious updates can silently expand capabilities, bypass safeguards, or execute harmful actions on subsequent runs.

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
87% confidence
Finding
The skill is explicitly designed to post content to connected third-party accounts, but the README does not prominently warn that actions may publish externally, consume account permissions, expose brand content, or create irreversible public posts. In an agent setting, unclear disclosure increases the risk of accidental publication and privacy/brand harm.

Context-Inappropriate Capability

Medium
Confidence
95% confidence
Finding
The README advertises a self-update mechanism that overwrites skill-owned files such as SKILL.md, scripts/, and docs/. In an agent skill context, remote code or instruction updates materially expand the trust boundary and can introduce malicious behavior or altered routing without explicit review, which is not necessary for basic Genviral API automation.

Lp3

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding
The skill advertises shell-backed capabilities but does not declare any explicit tool scope or allowed-tools boundary. In a skill that can upload files, create posts, write workspace state, and invoke a self-updater, missing tool restrictions increases the chance of unintended command execution or overly broad agent access beyond what a user expects.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The instruction "Never use em-dashes in any generated content" imposes a blanket language/style constraint regardless of user preference. This is a natural-language policy issue because it forces a specific output convention without offering user choice or documenting a justified requirement.

Natural-Language Policy Violations

Medium
Confidence
94% confidence
Finding
The configuration hard-codes `language: "en"`, which imposes a specific language choice without indicating user selection, opt-in, or a documented locale-specific justification. This is a natural-language policy concern because it can force output into one language regardless of user preference.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The documentation exposes a destructive `analytics-target-delete` command with no warning about permanence, scope, or confirmation practices. In an automation-focused skill, users may copy commands directly into scripts or terminals and delete tracked analytics accounts unintentionally, causing operational disruption and loss of configuration/state.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The documentation exposes destructive `delete-pack` and `delete-pack-image` operations with no warning about permanence, confirmation requirements, or safeguards against accidental execution. In an automation-focused skill, users or downstream agents may invoke these commands programmatically, increasing the chance of unintended data loss or bulk deletion if IDs are wrong or workflows are misconfigured.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The workflow directs the agent to publish content to social accounts and immediately modify local tracking files, but it does not require any explicit user confirmation, dry-run mode, or warning before taking those side-effecting actions. In an agent skill, that creates a real risk of unintended posting and unauthorized workspace changes if the skill is invoked in the wrong context or with stale credentials.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
This markdown file documents a bulk deletion command and its usage examples, but it does not include any warning that the operation removes posts or may be irreversible. For markdown files, safety-relevant behaviors affecting user data should be explicitly disclosed so users understand the impact before invoking the command.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The documentation exposes a destructive `delete` operation with no warning, confirmation guidance, or mention of irreversibility. In an automation-focused skill that manages production content pipelines across social platforms, this increases the likelihood of accidental or scripted deletion of business-critical assets by users or downstream agents.

Static analysis

No suspicious patterns detected.