Back to skill

Security audit

Limesurvey Openclaw Skill

Security checks for vulnerabilities and agentic risk

Overview

The skill does what it says, but it can handle sensitive survey data and send or change live survey content with weak guardrails.

Review this carefully before installing. Use only a dedicated least-privilege LimeSurvey service account, require an HTTPS RemoteControl endpoint, avoid copying the admin examples, and treat response exports and participant files as sensitive data. Confirm survey IDs and recipient scopes before activation, deletion, invitations, or reminders.

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
scripts/limesurvey_client.py:31
Finding
Sensitive credentials and survey data may be transmitted without enforced TLS<![CDATA[ ## Vulnerability Details **File Location**: `scripts/limesurvey_client.py:31-71` and `scripts/limesurvey_client.py:94` **Vulnerability Type**: Cleartext transmission of sensitive information due to missing HTTPS enforcement **Risk Level**: Medium ### Vulnerable Code ```python def __init__(self, url): """ Initialize the LimeSurvey client Args: url: Full URL to the RemoteControl endpoint Example: https://example.com/index.php/admin/remotecontrol """ self.url = url self.request_id = 0 def call(self, method, *params): """ Call a RemoteControl API method """ self.request_id += 1 payload = { "jsonrpc": "2.0", "method": method, "params": list(params), "id": self.request_id } data = json.dumps(payload).encode('utf-8') req = urllib_request.Request( self.url, data=data, headers={ 'Content-Type': 'application/json', 'Connection': 'Keep-Alive' } ) try: with urllib_request.urlopen(req) as response: result = json.loads(response.read().decode('utf-8')) ``` Authentication credentials are passed through the same unrestricted request method: ```python result = self.call('get_session_key', username, password, plugin) ``` ### Technical Analysis The client accepts the endpoint URL without validating its scheme or requiring HTTPS. The `call()` method serializes every JSON-RPC parameter and sends it directly to that endpoint. For `get_session_key`, those parameters include the LimeSurvey username and password. Subsequent requests can contain session keys, participant names and email addresses, participant tokens, survey responses, imported survey contents, and administrative modification requests. If `LIMESURVEY_URL` uses `http://`, these values can travel across the network without transport encryption. Base64 processing shown elsewhere in the project is part of LimeSu ...[truncated 2202 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Parse and validate the configured endpoint before storing or using it: ```python from urllib.parse import urlparse parsed = urlparse(url) if parsed.scheme != "https": raise ValueError("LimeSurvey endpoint must use HTTPS") if not parsed.hostname: raise ValueError("LimeSurvey endpoint must include a valid hostname") if parsed.username or parsed.password: raise ValueError("Credentials must not be embedded in the endpoint URL") ``` 2. If cleartext HTTP is required for isolated local development, reject it by default and require an explicit insecure option restricted to loopback addresses. Display a prominent warning when that option is enabled. 3. Prevent HTTPS-to-HTTP downgrade redirects. Use a redirect handler that rejects any redirect whose destination is not HTTPS. 4. Add a finite connection and response timeout to avoid indefinite blocking: ```python with urllib_request.urlopen(req, timeout=30) as response: ... ``` 5. Continue using the platform's default certificate validation. Do not add an unverified SSL context or disable hostname verification. 6. Replace documentation examples that use `admin` with a dedicated service-account name. Require the account to have only the survey and API permissions necessary for the intended command set. 7. Restrict the RemoteControl endpoint through network controls where possible, rotate exposed credentials, and invalidate existing sessions if HTTP transmission may already have occurred. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (22)

Credential Access

High
Category
Privilege Escalation
Content
p_add = subparsers.add_parser('add-participants', help='Add participants to survey')
    p_add.add_argument('survey_id', type=int, help='Survey ID')
    p_add.add_argument('--file', help='JSON file with participant data (default: stdin)')
    p_add.add_argument('--create-token', action='store_true', default=True, help='Create access tokens')
    p_add.set_defaults(func=cmd_add_participants)
    
    # invite-participants
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

External Transmission

Medium
Category
Data Exfiltration
Content
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![OpenClaw](https://img.shields.io/badge/OpenClaw-Skill-blue)](https://openclaw.ai)
[![LimeSurvey API](https://img.shields.io/badge/LimeSurvey-RemoteControl%202-green)](https://api.limesurvey.org/)

## Features
Confidence
50% 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
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![OpenClaw](https://img.shields.io/badge/OpenClaw-Skill-blue)](https://openclaw.ai)
[![LimeSurvey API](https://img.shields.io/badge/LimeSurvey-RemoteControl%202-green)](https://api.limesurvey.org/)

## Features
Confidence
50% 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
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![OpenClaw](https://img.shields.io/badge/OpenClaw-Skill-blue)](https://openclaw.ai)
[![LimeSurvey API](https://img.shields.io/badge/LimeSurvey-RemoteControl%202-green)](https://api.limesurvey.org/)

## Features
Confidence
50% 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
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![OpenClaw](https://img.shields.io/badge/OpenClaw-Skill-blue)](https://openclaw.ai)
[![LimeSurvey API](https://img.shields.io/badge/LimeSurvey-RemoteControl%202-green)](https://api.limesurvey.org/)

## Features
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The README advertises destructive and privacy-impacting capabilities such as deleting/importing surveys, sending invitations/reminders, and exporting responses without clear warnings, approval expectations, or data-handling cautions. In an agent skill context, this can lead operators to invoke high-impact actions without appreciating the consequences for participant privacy, survey integrity, or accidental bulk messaging.

Intent-Code Divergence

Medium
Confidence
98% confidence
Finding
The README explicitly instructs users to set LIMESURVEY_USER='admin' and a password, which contradicts the stated least-privilege requirement in the skill metadata. In a skill that can export responses, delete/copy/import surveys, and send participant communications, encouraging full admin credentials materially increases blast radius if the skill is misused, compromised, or invoked on the wrong target.

Intent-Code Divergence

Medium
Confidence
97% confidence
Finding
The Python API examples again normalize use of an 'admin' account and password in code snippets, reinforcing insecure operational practice. Because this skill automates sensitive survey, participant, and response operations, examples are likely to be copied directly into production workflows, resulting in unnecessary privileged access and increased risk of data exposure or destructive changes.

Lp3

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding
The skill requires environment access, network access, and local file read/write behavior, but it does not declare any explicit tool scope such as permissions or allowed-tools. In an agent environment, that omission weakens least-privilege controls and makes it easier for the skill to be invoked with broader capabilities than users expect.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
Using admin credentials in the quick-start materially increases the danger of all subsequent survey, participant, and response operations. In this skill's context, broad API access can expose sensitive response data, alter live surveys, send participant communications, or delete records if the account is misused or compromised.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The invitation and reminder examples can trigger real outbound communications to survey participants, but the documentation does not warn about user-consent, production-vs-test separation, or accidental bulk sends. This creates operational and privacy risk, especially if run against live surveys with broad permissions.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The skill demonstrates exporting survey responses and writing them to a local file without warning that survey responses may contain sensitive personal or research data. In practice, this can lead to unintended local persistence, insecure sharing, or mishandling of regulated data.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
This markdown file documents permanently destructive actions such as deleting a survey, but it does not include any warning about data loss, irreversibility, or the need to verify the target before execution. Under the markdown-file criteria, descriptions should warn about behaviors that could affect user data or system integrity.

Missing User Warnings

Medium
Confidence
83% confidence
Finding
The documentation describes exporting survey responses, which can expose respondent data, but it does not warn readers about privacy, access control, or careful handling of exported files. For markdown documentation, data-affecting behaviors should include warnings when they may impact privacy or user data.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The participant-management examples process email addresses, names, custom attributes, and invitation workflows without warning about privacy obligations or the operational risk of bulk email actions. Because these snippets normalize importing participant data and sending invitations/reminders, users may perform mass outreach or expose participant data without proper authorization, notice, or rate limiting.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
These examples export potentially sensitive survey responses and persist them to local files without any warning about personal data, consent, retention, access controls, or secure storage. In a survey automation skill, response exports are expected functionality, but documenting them without privacy guardrails can lead users to mishandle PII or confidential research data.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
This code submits participant records loaded from a file or stdin to a network API, which can include personal data such as email addresses. Although the function name implies adding participants, there is no confirmation prompt, visible disclosure, or warning in surrounding output/comments that user data will be transmitted to the server.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
Inviting participants is an externally visible and potentially irreversible action because it causes emails to be sent. The code performs the API call and only prints the result afterward, with no prior confirmation prompt, warning, or explanatory notice about the impact.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
Activating a survey changes remote system state and may make the survey live to respondents, which can have significant operational impact. The code executes the activation directly and only reports status afterward, without a pre-execution warning, confirmation, or comment documenting the risk.

Intent-Code Divergence

Low
Confidence
97% confidence
Finding
The quick-start instructions tell users to set LIMESURVEY_USER to 'admin', directly contradicting the earlier least-privilege guidance. This encourages unsafe deployment patterns and increases the blast radius if the credential is exposed or the skill is misused.

Intent-Code Divergence

Low
Confidence
96% confidence
Finding
The Python example authenticates as 'admin' with a plaintext password placeholder, normalizing use of highly privileged credentials in code snippets. Even as sample code, this can lead users to copy insecure patterns into automation and operational scripts.

Missing User Warnings

Low
Confidence
72% confidence
Finding
The file documents invitation and reminder email functions, which can contact real participants and affect user experience, but it provides no warning about verifying recipient scope or avoiding unintended bulk sends. In markdown skill documentation, externally impactful behaviors should be disclosed when they can affect users or operations.

Static analysis

No suspicious patterns detected.