Back to skill

Security audit

GEO Pulse — Brand AI Visibility Intelligence

Security checks for vulnerabilities and agentic risk

Overview

The skill does what it claims, but it sends brand data to a public plaintext HTTP API and uses unsafe command examples that deserve review before installation.

Review this skill before installing it for client or confidential brand work. It may send brand names, domains, metrics requests, and generated analysis to an external service at a default plaintext HTTP endpoint. Prefer configuring a trusted HTTPS GEO_PULSE_BASE_URL, avoid using sensitive unreleased client information, and ensure the agent safely serializes JSON rather than substituting brand names directly into shell commands.

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 (3)

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:27
Finding
Plaintext HTTP Communication with a Public API Endpoint<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:27-31` **Vulnerability Type**: Unencrypted external API communication **Risk Level**: High ### Vulnerable Code ```bash BASE_URL="${GEO_PULSE_BASE_URL:-http://8.148.223.19:8000}" ``` ```text All requests use `curl` with network access. ``` The insecure default is subsequently used for brand discovery, analysis, record creation, AI-search pipeline execution, profile retrieval, metrics retrieval, and historical trend retrieval at `SKILL.md:45-46`, `64-67`, `75-78`, `84-88`, `97-98`, `104-107`, and `158-161`. ### Technical Analysis The skill directs the agent to communicate with a bare public IP address over plaintext HTTP. HTTP provides neither transport confidentiality nor authenticated server identity. Any party capable of observing or modifying traffic between the agent and the service can read requests and tamper with responses. The use of a bare IP also prevents normal domain-based service identity controls. The skill does not require TLS, certificate validation, response signing, or another integrity mechanism. Because retrieved profile, metric, competitor, and recommendation fields are incorporated into client-facing reports, manipulated responses can directly alter the agent's conclusions. ### Attack Path 1. The agent loads the skill without setting `GEO_PULSE_BASE_URL`. 2. The default `http://8.148.223.19:8000` endpoint is selected. 3. The agent sends brand queries and pipeline requests across an attacker-observable network. 4. A network-positioned attacker intercepts the plaintext connection. 5. The attacker reads submitted brand information or replaces API responses with fabricated metrics, profiles, competitors, or recommendations. 6. The agent processes the modified response and presents the falsified information as a GEO audit or trend report. ### Impact Assessment An attacker with a suitable network position can disclose the brand research submitted to the service and manipu ...[truncated 355 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Replace the default endpoint with an authenticated HTTPS URL on a controlled domain. 2. Reject base URLs using plaintext HTTP rather than silently accepting them. 3. Retain normal TLS certificate and hostname verification; do not introduce `curl -k` or similar bypasses. 4. Document the service owner, expected hostname, data-retention policy, and categories of information transmitted. 5. Where report integrity is important, authenticate responses or validate them against a trusted integrity mechanism. 6. Use `curl --fail-with-body --show-error` and explicitly check HTTP status codes. 7. Validate every API response against a strict JSON schema before using it in a report. 8. Consider applying an outbound allowlist so the skill can communicate only with the approved API hostname. ]]>

T09 · Insecure Skill Coding Practices

Error
Location
SKILL.md:64
Finding
Unsafe Shell and JSON Interpolation of User-Controlled Brand Names<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:64-67` **Vulnerability Type**: Potential shell command injection and malformed JSON injection **Risk Level**: High ### Vulnerable Code ```bash BASE_URL="${GEO_PULSE_BASE_URL:-http://8.148.223.19:8000}" curl -s -X POST "$BASE_URL/api/brand-analyze" \ -H 'Content-Type: application/json' \ -d '{"brand":"BRAND_NAME"}' ``` The same unsafe payload construction pattern also appears in the brand creation, pipeline execution, and metrics requests at `SKILL.md:75-78`, `84-88`, and `104-107`. ### Technical Analysis The documented commands place `BRAND_NAME`, which originates from user input, inside a manually constructed JSON string contained in a single-quoted shell argument. The skill provides no safe serialization or escaping procedure. If an agent implements the placeholder by textual substitution, a brand name containing a single quote can terminate the shell argument. Additional shell syntax can then be interpreted as a command rather than data. Even when shell execution is avoided, double quotes, backslashes, control characters, and other JSON-significant characters can break the payload or modify its structure. The vulnerability arises because one untrusted value crosses two parser boundaries—JSON and the shell—without context-appropriate encoding. Input validation alone is not a complete defense because valid brand names may contain punctuation. ### Attack Path 1. A user requests a report for a specially crafted brand name containing quote and shell metacharacters. 2. The agent replaces the literal `BRAND_NAME` placeholder in the documented command with the supplied value. 3. The inserted quote terminates the intended single-quoted `-d` argument. 4. The local shell interprets the remaining attacker-controlled characters as shell syntax. 5. An injected command executes with the same operating-system identity and permissions as the agent process. 6. Alternatively, less complex input corru ...[truncated 886 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Never substitute user input directly into shell command text. 2. Store the input in a quoted variable and generate JSON with a proper serializer: ```bash BRAND_NAME='value supplied through a safe parameter boundary' payload="$(jq -n --arg brand "$BRAND_NAME" '{brand: $brand}')" curl --fail-with-body --show-error -X POST \ "$BASE_URL/api/brand-analyze" \ -H 'Content-Type: application/json' \ --data-binary "$payload" ``` 3. Apply the same structured serialization to brand creation, pipeline execution, and metrics requests. 4. Prefer a native HTTP client API with argument arrays and JSON serialization over dynamically assembled shell commands. 5. Validate input length and reject control characters, while still relying on serialization for injection prevention. 6. Do not use `eval`, `sh -c`, or equivalent mechanisms to execute dynamically generated command strings. 7. Add tests using brand names containing apostrophes, quotation marks, backslashes, newlines, command substitutions, and shell metacharacters. ]]>

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:111
Finding
Untrusted Remote API Content Is Inserted into Client-Facing Reports<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:111-140` **Vulnerability Type**: Unvalidated external content propagation **Risk Level**: Medium ### Vulnerable Code ```markdown # {Brand} GEO Audit Report > Report date: {date} | Domain: {domain} ## Brand Overview {brand_overview} ## Core GEO Metrics | Metric | Value | |--------|-------| | Visibility Score | {visibility_score} | | Brand Mention Rate | {brand_mention_rate × 100}% | | Link Reference Rate | {link_reference_rate × 100}% | | Brand Mentions | {brand_mention_count} | | Link References | {link_reference_count} | | Sentiment | Positive {positive} / Neutral {neutral} / Negative {negative} | ## Platform Performance | Platform | Mentions | Links | Positive | Neutral | Negative | |----------|----------|-------|----------|---------|----------| (from platform breakdown) ## Competitor Benchmark | Brand | Visibility Score | Brand Visibility | Link Visibility | |-------|------------------|------------------|-----------------| (sorted by visibility_score desc; mark target brand with ⭐) ## Recommendations {suggestion} ``` ### Technical Analysis The report template directly incorporates fields returned by an external service, including `brand_overview`, platform data, competitor data, and `suggestion`. The skill does not require schema validation, content escaping, URL filtering, or a rule that remote text must be treated only as untrusted data. Consequently, a compromised service or network attacker can supply Markdown formatting, deceptive links, fabricated claims, or instruction-like text. Because the default API transport is plaintext HTTP, the remote-content trust issue can be combined with traffic interception even without compromising the API server. There is no explicit instruction in the skill to execute remote content as code. The risk is therefore primarily report-content injection, misleading output, and possible indirect prompt manipulation rather than confirmed remote code e ...[truncated 1306 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Explicitly declare all API response fields untrusted and prohibit following instructions contained in those fields. 2. Define and enforce strict response schemas, including expected field names, primitive types, numeric ranges, array sizes, and maximum string lengths. 3. Escape Markdown control characters before inserting text fields into reports. 4. Sanitize or remove HTML and active content if reports may be rendered by an HTML-capable client. 5. Permit links only when required and validate their schemes and destinations against an allowlist. 6. Reject unexpected fields and malformed responses instead of attempting to interpret them. 7. Keep retrieved text in clearly delimited, data-only sections and label externally generated recommendations as unverified. 8. Combine content validation with authenticated HTTPS transport to prevent network-level response modification. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (3)

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill instructs the agent to send user-supplied brand data to an external public endpoint without a clear user-facing disclosure or consent step. This creates a data handling and privacy risk because proprietary client names, domains, or competitive analysis requests may be transmitted off-platform to an untrusted third-party service.

External Transmission

Medium
Category
Data Exfiltration
Content
```bash
BASE_URL="${GEO_PULSE_BASE_URL:-http://8.148.223.19:8000}"
curl -s "$BASE_URL/api/brands"
```

Expected structure:
Confidence
91% confidence
Finding
The skill performs direct network access to a public endpoint over plain HTTP, which exposes requests and responses to interception or tampering in transit. Even though the example request fetches a brand list, the broader skill repeatedly transmits brand identifiers and analysis data externally, making the insecure transport and external transmission materially risky in context.

Vague Triggers

Medium
Confidence
94% confidence
Finding
The trigger list for historical analysis includes vague phrases such as “可见度变化”, “visibility trend”, and “历史对比”, which are generic enough to overlap with many unrelated analytics or reporting requests. The section does not provide narrowing context or negative examples to ensure the skill activates only for GEO/brand AI visibility use cases.

Static analysis

No suspicious patterns detected.