Back to skill

Security audit

48-zodiac-cyber-reader

Security checks for vulnerabilities and agentic risk

Overview

The skill appears to be a normal zodiac lookup tool, but its command templates may allow unsafe local command execution if the runner invokes them through a shell.

Review before installing. The skill does not show intent to persist, exfiltrate, or access credentials, but it should only be used with a runner that passes arguments safely without a shell or after the publisher adds strict input validation and structured command arguments.

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

Error
Location
metadata.json:11
Finding
Command Injection Through Unquoted Tool Parameters## Vulnerability Details **File Location**: `metadata.json`, lines 11–16 **Vulnerability Type**: Command injection through unsafe command-template interpolation **Risk Level**: High ### Vulnerable Code ```json "command": "python zodiac_api.py zone {{sign}}" }, { "name": "get_pairing_details", "description": "Fetch in-depth destiny-style romantic compatibility report, score, and relationship guide for two 48 Zodiac signs. Parameters 'sign1' and 'sign2' accept either 48-Zodiac IDs or birthdate strings (e.g., '05-09', '5/9'). The API resolves them automatically.", "command": "python zodiac_api.py pairing {{sign1}} {{sign2}}" ``` ### Technical Analysis The tool definitions directly interpolate the user-controlled `sign`, `sign1`, and `sign2` parameters into command strings without validation, shell escaping, or an argument-array execution mechanism. If the Skill framework executes these templates through a command shell, shell metacharacters embedded in a parameter can alter the intended command structure. For example, an attacker could supply a value containing a command separator such as `;`, causing the shell to execute an additional command rather than treating the entire value as a zodiac identifier. The URL encoding in `zodiac_api.py` does not mitigate this issue. Shell parsing occurs before Python receives the arguments, whereas URL encoding is only applied after the Python process starts. ### Attack Path 1. An attacker supplies a crafted zodiac parameter containing shell syntax through `sign`, `sign1`, or `sign2`. 2. The Skill framework substitutes the value directly into the corresponding `command` template. 3. If the framework invokes the resulting string through a shell, the shell interprets the injected metacharacters. 4. The intended Python command runs, and the injected command is executed separately with the privileges of the Agent or Skill runner. 5. The injected command may access local file ...[truncated 1116 chars]
Remediation
## Remediation Suggestions 1. Replace string-based command execution with a structured argument-array interface that does not invoke a shell, for example: ```json { "executable": "python", "args": ["zodiac_api.py", "zone", "{{sign}}"] } ``` Apply the equivalent structure to the pairing command. 2. Validate every parameter before execution. Permit only explicitly supported formats, such as: - Zone IDs: a tightly constrained allowlist or pattern such as lowercase zodiac names followed by an expected zone number. - Dates: numeric month-day formats with valid calendar ranges. 3. Reject whitespace, control characters, command separators, redirection operators, substitutions, and other unexpected characters. 4. If the framework only supports command strings, use its documented native argument-escaping mechanism. Simple manual quoting is not sufficient across all shells and platforms. 5. Add tests containing shell metacharacters and malformed values to confirm that inputs are either rejected or passed as one literal argument. 6. Run the Skill under a restricted account with minimal filesystem access, a sanitized environment, and outbound network access limited to the declared zodiac API endpoint.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (4)

Natural-Language Policy Violations

Medium
Confidence
91% confidence
Finding
The skill description strongly centers a Chinese-language persona and usage flow without explicitly offering language choice or opt-in, which can override user expectations and reduce usability or accessibility for non-Chinese-speaking users. While this is not a direct security exploit, it is a genuine policy/usability weakness in an agent skill because it can cause unintended behavior and make outputs less transparent to users.

Natural-Language Policy Violations

Medium
Confidence
93% confidence
Finding
These lines mandate that the skill must automatically detect the user's language and use that language for the entire interaction. The policy allows language behavior when the user is offered a choice or explicitly opts in, but here the language is forced based on detection alone.

Vague Triggers

Low
Confidence
80% confidence
Finding
This is a manifest/config file, so vague-trigger review applies. The description says inputs may be "birth-date strings" and are resolved server-side, but it does not narrowly constrain acceptable invocation scope beyond a few examples, which can make activation or tool-selection criteria ambiguous in systems that rely on manifest text.

Vague Triggers

Low
Confidence
84% confidence
Finding
The parameter accepts a "48 Zodiac ID or birthdate string" and gives examples, but does not define the full allowed set or disallowed variants. In manifest-like API specs, this can be too open-ended and may cause unintended matching of loosely formatted everyday date text.

Static analysis

No suspicious patterns detected.