Back to skill

Security audit

Grupo Venus

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent astrology integration, but it persistently stores and externally sends detailed birth profiles without enough consent, deletion, or retention controls.

Install only if you are comfortable storing birth profiles locally and sending them to the unofficial third-party site grupovenus.com. Prefer aliases over full names, avoid entering other people without permission, and manually remove ~/.openclaw/workspace/memory/grupo-venus.json when you no longer want profiles retained.

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

T09 · Insecure Skill Coding Practices

Warning
Location
skill.md:22
Finding
Persistent Plaintext Storage of Sensitive Personal Data<![CDATA[ ## Vulnerability Details **File Location**: `skill.md:22-44` **Vulnerability Type**: Sensitive data stored in plaintext without access-control, consent, or retention safeguards **Risk Level**: Medium ### Vulnerable Code ```markdown All person data lives in your memory file. Load it before any operation: ``` ~/.openclaw/workspace/memory/grupo-venus.json ``` Structure (we use Luis Alberto Spinetta as the example throughout this skill — because he's from another planet): ```json { "people": { "spinetta": { "name": "Luis Alberto Spinetta", "birthdate": "1/23/1950 4:35:00 PM", "city": "Buenos Aires", "country": "Argentina", "sex": "H", "tz_offset": "3", "lat_dms": "34S35", "lon_dms": "58W22", "lat_decimal": -34.5833, "lon_decimal": 58.3667, "style": "deep" } } } ``` ``` The persistence requirement is reinforced at `skill.md:604-611`: ```markdown After the user provides their birth data, register them (see Adding a Person), save to memory. Before generating any reading, **ask for their preferred style** if it's not already set: > "How would you like me to read your chart? > - **Casual** — like a friend who knows astrology, no technical jargon > - **Deep** — full aspects, houses, and timing > - **Practical** — straight to the point: what to do and when" Save the chosen style to their record in memory, then immediately: ``` ### Technical Analysis The skill directs the agent to persist names, exact birth dates and times, sex, birth locations, coordinates, and preferences in a plaintext JSON file. In combination, these fields constitute sensitive and potentially identifying personal information. No instructions require restrictive file permissions, encryption, data minimization, explicit consent for cross-session retention, expiration, deletion, or isolation from other skills. The instruction to load the file before every operation may also expose records unrelated to the c ...[truncated 1494 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Ask for explicit consent before storing any profile across sessions and clearly identify the fields being retained. 2. Default to session-only processing unless the user affirmatively requests persistent storage. 3. Create the storage directory and file with restrictive permissions, such as directory mode `0700` and file mode `0600`. 4. Store only fields necessary for requested functionality; avoid retaining sex, exact coordinates, or full birth details when they are not needed. 5. Load only the requested profile rather than exposing the complete people database to every operation. 6. Provide commands to list, export, update, and permanently delete stored profiles. 7. Define a retention period and automatically remove stale records. 8. Where supported, encrypt sensitive records using credentials managed outside the project and outside the plaintext workspace. 9. Explain that profile data is also transmitted to `grupovenus.com` and obtain consent before that transmission. ]]>

T09 · Insecure Skill Coding Practices

Note
Location
skill.md:79
Finding
Session Cookie Jar Is Not Removed After Registration<![CDATA[ ## Vulnerability Details **File Location**: `skill.md:79-103` **Vulnerability Type**: Unsafe temporary-file lifecycle and residual session-cookie exposure **Risk Level**: Low ### Vulnerable Code ```bash COOKIEJAR=$(mktemp) # 2a. Establish session curl -s -c "$COOKIEJAR" -b "$COOKIEJAR" "https://grupovenus.com/info.asp" \ -H "User-Agent: Mozilla/5.0" > /dev/null # 2b. Load the registration form (sets server-side session state) curl -s -c "$COOKIEJAR" -b "$COOKIEJAR" "https://grupovenus.com/personas.asp?nue" \ -H "User-Agent: Mozilla/5.0" \ -H "Referer: https://grupovenus.com/info.asp" > /dev/null # 2c. POST the person data (Referer header is required) # IMPORTANT: city names with accents must be encoded in iso-8859-1, NOT UTF-8. # e.g. "Bahía Blanca" → "Bah%EDa+Blanca" (%ED = í in Latin-1, NOT %C3%AD which is UTF-8) # If the city is not recognized, the server silently assigns wrong/default coordinates. # Verify by checking that the city and country fields are non-empty in the d0 cookie response. curl -s -c "$COOKIEJAR" -b "$COOKIEJAR" -X POST "https://grupovenus.com/ciuda.asp" \ -H "Content-Type: application/x-www-form-urlencoded" \ -H "User-Agent: Mozilla/5.0" \ -H "Referer: https://grupovenus.com/personas.asp?nue" \ --data "urldestino=personas.asp%3Fok&nombre=NAME&DIA=DD&MES=MM&ANO=YYYY&HORA=HH&MINU=MM&08CIUDAD=CITY&14PAIS=COUNTRY&SEXO=H" > /dev/null # 2d. Follow redirect to personas.asp?ok — the d0 cookie is set here PERSONAS_RESP=$(curl -si -c "$COOKIEJAR" -b "$COOKIEJAR" "https://grupovenus.com/personas.asp?ok" \ -H "User-Agent: Mozilla/5.0" \ -H "Referer: https://grupovenus.com/ciuda.asp") ``` The example creates a temporary cookie jar and repeatedly writes ASP session cookies to it, but the documented workflow contains no cleanup trap or explicit removal. The same pattern is repeated at `skill.md:672-693`. ### Technical Analysis `mktemp` safely creates a uniquely named file and normally applies restrictive permissions, ...[truncated 1690 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Install an exit trap immediately after creating the cookie jar: ```bash COOKIEJAR=$(mktemp) || exit 1 trap 'rm -f -- "$COOKIEJAR"' EXIT HUP INT TERM ``` 2. Remove the cookie jar explicitly after the final response has been processed: ```bash rm -f -- "$COOKIEJAR" trap - EXIT HUP INT TERM ``` 3. Verify that the file is owned by the current user and has mode `0600` before writing cookies: ```bash chmod 600 "$COOKIEJAR" ``` 4. Avoid printing the cookie jar path or cookie contents in logs. 5. Ensure error paths perform the same cleanup as successful paths. 6. Apply the same correction to the repeated example at `skill.md:672-693`. 7. Prefer an isolated private temporary directory when the runtime supports it, and remove the directory recursively after use. ]]>
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 (9)

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The README explicitly states that person data is stored across sessions in a local file, but it does not warn users about retention, sensitivity, or who can access that file on a shared system. Because this skill handles birth-related and relationship data, the stored information can be privacy-sensitive and may expose personal details if the workspace or host is accessible to other users, backups, or logs.

Vague Triggers

Medium
Confidence
97% confidence
Finding
The trigger list includes generic phrases such as "horoscope," "astrology," "transits," and "birth chart" that are common user intents rather than unique invocations. This can cause the platform to route broad, unrelated astrology requests to this third-party skill unexpectedly, increasing the chance of unauthorized handling of user queries and any personal birth-data the skill may collect across sessions.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill explicitly instructs storing birth profiles locally and sending them to a third-party astrology service, including name, birth date/time, location, sex, timezone, and coordinates. This is sensitive personal data and the skill does not require an explicit user consent/privacy warning before persistence and external transmission, creating a real privacy risk.

External Transmission

Medium
Category
Data Exfiltration
Content
### Step 1 — Look up the city coordinates

```bash
curl -s "https://grupovenus.com/buscaciudjson.asp?q=CITY&pais=COUNTRY"
```

Example:
Confidence
88% confidence
Finding
This request sends user-supplied city and country data to an external domain. In context, the skill's purpose depends on external lookups, but it still constitutes a real data exfiltration/privacy boundary crossing because user location information is disclosed to a third party without an explicit warning or consent step.

External Transmission

Medium
Category
Data Exfiltration
Content
"Luis Alberto Spinetta;1/23/1950 4:35:00 PM;Buenos Aires;Argentina;H;;3;34S35;58W22"
```

To URL-encode it for a POST body in curl use `--data-urlencode`:
```bash
--data-urlencode "nombre=Luis Alberto Spinetta;1/23/1950 4:35:00 PM;Buenos Aires;Argentina;H;;3;34S35;58W22"
```
Confidence
97% confidence
Finding
The skill constructs a semicolon-delimited `nombre` value containing full identity and highly sensitive birth-profile data, intended for transmission to the third-party service. This is a true external transmission of personal data and increases privacy exposure because it aggregates multiple identifiers into a single payload.

External Transmission

Medium
Category
Data Exfiltration
Content
**POST to `informes3.asp`** to get a 1-year forecast with all slow-planet transits:

```bash
curl -s -X POST "https://grupovenus.com/informes3.asp" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -H "User-Agent: Mozilla/5.0" \
  --data-urlencode "nombre=Luis Alberto Spinetta;1/23/1950 4:35:00 PM;Buenos Aires;Argentina;H;;3;34S35;58W22" \
Confidence
97% confidence
Finding
This POST sends the full encoded birth profile to `informes3.asp` for report generation. Because the data includes name, exact birth timestamp, sex, and location-derived coordinates, the privacy impact is substantial even if the transfer is functionally required by the skill.

External Transmission

Medium
Category
Data Exfiltration
Content
```bash
# 1. Look up city
curl -s "https://grupovenus.com/buscaciudjson.asp?q=Rosario&pais=Argentina"

# 2. Register person with cookie jar (3-step flow required)
COOKIEJAR=$(mktemp)
Confidence
88% confidence
Finding
This example again performs an external lookup of city/country against grupovenus.com. While expected for functionality, it remains a real privacy-relevant disclosure of user-provided location data to a third party and therefore should not be treated as a false positive.

External Transmission

Medium
Category
Data Exfiltration
Content
# → Maria  ;3/15/1992 2:30:00 PM;Rosario;Argentina;V;;3;32S57;60W40

# 4. Fetch 1-year transit graph (no session needed for reports)
curl -s -X POST "https://grupovenus.com/informes3.asp" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -H "User-Agent: Mozilla/5.0" \
  --data-urlencode "nombre=Maria;3/15/1992 2:30:00 PM;Rosario;Argentina;V;;3;32S57;60W40" \
Confidence
97% confidence
Finding
This example POST transmits a full personal birth profile to the external report endpoint. The context makes the transmission intentional and functional, but not harmless: it exposes a sensitive bundle of personal and inferential data to a third-party service.

External Transmission

Medium
Category
Data Exfiltration
Content
| sort -t' ' -k2 -n

# 6. Fetch natal chart PNG
curl -s "https://grupovenus.com/dibujo.aspx" \
  --get \
  --data-urlencode "fec=3/15/1992 2:30:00 PM" \
  --data-urlencode "aju=3" \
Confidence
94% confidence
Finding
This request sends birth date/time, timezone, city, country, coordinates, and name to an external image-generation endpoint. Even though it returns a chart image, the request still leaks sensitive personal data and should be treated as a real privacy/security issue in the absence of explicit consent and warning.

Static analysis

No suspicious patterns detected.