Back to skill

Security audit

Google Maps Reviews Api Skill

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to do what it advertises, but it unnecessarily tells users to provide an API key through chat and sends review queries to a third-party service.

Review before installing. Use this skill only if you are comfortable sending business/review search terms to BrowserAct and receiving public reviewer profile data. Configure BROWSERACT_API_KEY through a protected environment or secret manager, not by pasting the key into chat; rotate the key if it has already been shared conversationally.

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

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:25
Finding
API Credential Solicitation Through the Conversational Interface<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:25-28`; supporting behavior in `scripts/google_maps_reviews_api.py:91-98` **Vulnerability Type**: Credential exposure through insecure secret-handling instructions **Risk Level**: Medium ### Vulnerable Code Snippets `SKILL.md:25-28`: ```markdown ## 🔑 API Key Setup Before running, check the `BROWSERACT_API_KEY` environment variable. If not set, do not take other measures; ask and wait for the user to provide it. **Agent must inform the user**: > "Since you haven't configured the BrowserAct API Key, please visit the [BrowserAct Console](https://www.browseract.com/reception/integrations) to get your Key." ``` `scripts/google_maps_reviews_api.py:91-98`: ```python if not api_key: print("\n[!] ERROR: BrowserAct API Key is missing.", flush=True) print("Please follow these steps:", flush=True) print("1. Go to: https://www.browseract.com/reception/integrations", flush=True) print("2. Copy your API Key.", flush=True) print("3. Provide it to me or set it as an environment variable (BROWSERACT_API_KEY).", flush=True) sys.exit(1) ``` ### Technical Analysis The Skill explicitly instructs the Agent to ask the user for a BrowserAct API key and the script tells the user to “Provide it to me.” This encourages disclosure of a reusable credential through the conversational interface. The script itself only reads the credential from `BROWSERACT_API_KEY` and uses it as a Bearer token for the declared BrowserAct service: ```python headers = {"Authorization": f"Bearer {api_key}"} ``` Consequently, transmitting the key through chat is not technically necessary. The least-privilege approach is for the user to configure the credential directly in a protected local environment or secret manager without exposing its value to the Agent, conversation transcript, or surrounding logging infrastructure. The network requests to `https://api.browseract.com/v2/workflow` are consistent with the declar ...[truncated 2084 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the instruction to ask the user to provide the API key through the conversation. 2. Replace it with guidance requiring local secret configuration, for example: ```markdown If `BROWSERACT_API_KEY` is not configured, stop and instruct the user to set it through the runtime's protected secret manager or local environment. Never ask the user to paste the key into chat. ``` 3. Change the script’s missing-key message so it does not offer disclosure to the Agent: ```python if not api_key: print( "ERROR: BROWSERACT_API_KEY is not configured. " "Set it using your runtime's protected secret manager or environment configuration. " "Do not paste the key into chat or command-line arguments.", flush=True, ) sys.exit(1) ``` 4. Prefer a platform-provided secret store over plaintext shell configuration where available, and restrict secret access to this Skill’s process. 5. Ensure logs, exception messages, telemetry, and task output never print the `Authorization` header or API-key value. 6. Rotate the BrowserAct key if it has previously been disclosed through a conversation or other logged channel. 7. Apply the narrowest BrowserAct permissions, spending limits, and expiration supported by the service. 8. Separately harden the expected network operations with connection/read timeouts and a maximum polling duration to avoid indefinite execution. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (6)

Lp3

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding
The skill requires access to an environment variable and performs networked API activity, but it does not declare an explicit tool scope such as allowed tools or permissions. That mismatch weakens least-privilege controls and can cause the agent runtime to invoke code with broader capabilities than users or policy reviewers can easily verify.

Vague Triggers

Medium
Confidence
96% confidence
Finding
The description instructs the agent to proactively apply the skill across a very broad set of business-review and market-research requests, which increases the chance of unintended invocation without a clear user request for external data collection. In context, that can trigger network calls and third-party processing of business queries and reviewer data when the user may have expected only general advice or analysis.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The documented output includes reviewer identifiers and profile metadata such as author_name, author_profile_url, and author_image_url, but the skill provides no warning that it collects and may expose personal or profile-linked data. In this context, the omission is significant because the skill is explicitly marketed for automated extraction and downstream analysis, increasing privacy and compliance risk if agents surface or store unnecessary personal data.

External Transmission

Medium
Category
Data Exfiltration
Content
# API Configuration
TEMPLATE_ID = "77806855016940604"
API_BASE_URL = "https://api.browseract.com/v2/workflow"

def run_google_maps_reviews_task(api_key, keywords, language="en", country="us"):
    headers = {"Authorization": f"Bearer {api_key}"}
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# 1. Start Task
    print(f"Start Task", flush=True)
    try:
        response = requests.post(f"{API_BASE_URL}/run-task-by-template", json=payload, headers=headers)
        if response.status_code == 401:
             print(f"Error: Invalid authorization. Please check your API key.", flush=True)
             return None
Confidence
88% confidence
Finding
The script sends user-supplied keywords and locale parameters to a third-party service (BrowserAct) over the network. In this skill context, external transmission is expected, but it is still security-relevant because potentially sensitive search terms or business intelligence queries may be disclosed to an external provider without explicit consent, minimization, or policy checks.

Natural-Language Policy Violations

Low
Confidence
90% confidence
Finding
The function signature sets `language="en"` and `country="us"` as defaults, which imposes a specific language and locale when the user does not provide alternatives. This is a natural-language policy concern because the script silently assumes a locale rather than prompting for or documenting an explicit choice.

Static analysis

No suspicious patterns detected.