Back to skill

Security audit

umami-setup

Security checks for vulnerabilities and agentic risk

Overview

The skill openly helps configure analytics to evade ad blockers, and its setup examples use Umami admin credentials in a risky shell pattern.

Review before installing or using. Only use this on sites where analytics tracking, privacy notices, and consent handling are already approved. Avoid using the documented inline password command; prefer a no-echo prompt, scoped token, or other safer credential flow, and clear temporary tokens after setup.

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:27
Finding
Umami Administrator Password Exposed in Shell Command Arguments and History<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, lines 27–30 **Vulnerability Type**: Plaintext credential exposure **Risk Level**: Medium ```bash TOKEN=$(curl -s -X POST "https://<UMAMI_HOST>/api/auth/login" \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"<PASSWORD>"}' \ | python3 -c "import json,sys; print(json.load(sys.stdin)['token'])") ``` ### Technical Analysis The instructions encourage the operator to substitute the Umami administrator password directly into a command-line argument. If entered literally, the credential may be retained in the user's shell history. While the command is executing, the password may also be visible through operating-system process inspection interfaces to other sufficiently privileged local users or processes. The resulting bearer token is stored in the `TOKEN` shell variable and reused by subsequent API requests. This is functionally necessary for authentication, but it extends the lifetime of sensitive authentication material within the shell environment. No hardcoded real credential is included in the project; the risk arises from the documented credential-handling pattern. ### Attack Path 1. An operator replaces `<PASSWORD>` with the real Umami administrator password and runs the documented command. 2. The literal command is recorded in shell history or becomes temporarily available through local process-argument inspection. 3. A local attacker, malicious process, or another account with sufficient access reads the exposed credential. 4. The attacker authenticates to the configured Umami instance using the administrator credentials. 5. The attacker accesses or modifies websites and analytics data within the permissions granted to that administrator account. This attack requires access to the operator's local shell history, account, or process information; the documentation does not independently transmit the credential to an unrelated third party. ### Impact Ass ...[truncated 633 chars]
Remediation
<![CDATA[ ## Remediation Suggestions - Do not place the administrator password literally in an interactive command. - Prompt for the password without terminal echo, for example with `read -r -s`, and construct the request body without exposing the secret as a command-line argument. - Prefer reading the JSON request body from standard input or a securely permissioned temporary descriptor rather than passing it through `curl -d`. - Avoid insecure temporary files. If a temporary file is unavoidable, create it with restrictive permissions, ensure exclusive creation, and delete it immediately after use. - Use a narrowly scoped API credential instead of an administrator password if the Umami deployment supports scoped tokens or service accounts. - Disable command-history recording for the sensitive operation or ensure that no secret appears in the command text. - Clear sensitive shell state after completing the operation, such as with `unset PASSWORD TOKEN`. - Document token expiration, revocation, and rotation procedures. - Run the setup from a trusted workstation and ensure that access to process information and shell-history files is appropriately restricted. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (5)

External Script Fetching

High
Category
Supply Chain
Content
```bash
# Login
TOKEN=$(curl -s -X POST "https://<UMAMI_HOST>/api/auth/login" \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"<PASSWORD>"}' \
  | python3 -c "import json,sys; print(json.load(sys.stdin)['token'])")
Confidence
90% confidence
Finding
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

External Script Fetching

High
Category
Supply Chain
Content
| python3 -c "import json,sys; print(json.load(sys.stdin)['token'])")

# Create website
curl -s -X POST "https://<UMAMI_HOST>/api/websites" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"<SITE_NAME>","domain":"<DOMAIN>"}' | python3 -m json.tool
Confidence
90% confidence
Finding
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The skill explicitly instructs operators to deploy proxy-based analytics 'to bypass adblockers' and gives no warning about user consent, privacy disclosures, or legal compliance. This is dangerous because it enables covert tracking that may evade user intent and create regulatory, contractual, or reputational exposure, especially in jurisdictions requiring consent for analytics cookies or tracking.

External Transmission

Medium
Category
Data Exfiltration
Content
```bash
# Login
TOKEN=$(curl -s -X POST "https://<UMAMI_HOST>/api/auth/login" \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"<PASSWORD>"}' \
  | python3 -c "import json,sys; print(json.load(sys.stdin)['token'])")
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
| python3 -c "import json,sys; print(json.load(sys.stdin)['token'])")

# Create website
curl -s -X POST "https://<UMAMI_HOST>/api/websites" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"<SITE_NAME>","domain":"<DOMAIN>"}' | python3 -m json.tool
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Static analysis

No suspicious patterns detected.