T05 · Unauthorized Access and Privilege Escalation
- Location
server/api/main.py:77- Finding
Unauthenticated Administration and Spoofable Agent Identity
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This todo-list skill is purpose-aligned, but its bundled server has serious access-control and UI-safety problems that should be reviewed before installation.
Use this only on a trusted local or tightly controlled internal network until authentication, HTTPS guidance, and UI escaping are fixed. Do not store secrets, credentials, private conversation excerpts, or sensitive personal data in task notes, and treat anyone who can reach the API/UI as potentially able to read or change tasks and agent records.
server/api/main.py:77Unauthenticated Administration and Spoofable Agent Identity
server/ui/index.html:575Stored Cross-Site Scripting Through Untrusted API Data
SKILL.md:12Potentially Sensitive Conversation Data Can Be Sent Over Cleartext or to an Unrestricted Endpoint
The trigger phrases are extremely broad and overlap with common conversational language such as "todo," "my tasks," and especially "the list." This increases the chance of accidental invocation in unrelated conversations, which can cause unintended reads or writes against the remote task API and create an unnecessary prompt-injection and action-trigger surface.
The skill exposes destructive API operations such as DELETE /lists/{id} without any described validation, ownership verification beyond a header, or user confirmation safeguards. If the agent is induced to supply an attacker-chosen or mistaken list ID, it could delete user data or act on the wrong resource.
All requests require header `X-Agent-Id: {AGENT_ID}`. Base URL from `CLAW_LIST_URL`.
Lists: `GET /lists` · `POST /lists {"name":"..."}` · `DELETE /lists/{id}`
Items: `GET /lists/{id}/items` · `POST /lists/{id}/items` · `PUT /items/{id}` · `DELETE /items/{id}`
The item endpoints include PUT and DELETE by raw item ID, enabling direct modification or deletion of tasks if the agent is manipulated into using an incorrect or attacker-influenced identifier. In a natural-language skill with broad triggers, this creates a meaningful risk of unintended state changes and data loss.
Lists: `GET /lists` · `POST /lists {"name":"..."}` · `DELETE /lists/{id}`
Items: `GET /lists/{id}/items` · `POST /lists/{id}/items` · `PUT /items/{id}` · `DELETE /items/{id}`
Item fields: `title` (required on create), `notes`, `priority` (1–5), `due_date`, `category`, `done`.
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
DELETE /lists/{id}
Cascades to all items in the list. 403 if not owner.
Tool parameters are crafted to achieve unintended or unsafe behavior. Parameter abuse can bypass intended safety checks (e.g. shell=True, --force, dangerous glob patterns).
DELETE /items/{id}
403 if list belongs to another agent.
The admin endpoints are documented as requiring no X-Agent-Id and being intended for human/UI use, but no alternative authentication requirement is stated. Exposing DELETE /admin/agents/{agent_id} without documented authentication strongly suggests an unauthenticated or under-specified administrative capability that could let an attacker remove agent identities or disrupt service.
GET /admin/agents # list all agents POST /admin/agents # register agent (same as self-reg above) PUT /admin/agents/{agent_id} # update display_name and/or scope DELETE /admin/agents/{agent_id} # remove agent (does not delete their lists)
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
See server/README.md for full setup instructions. Quick summary:
cp server/.env.example server/.env
# Set POSTGRES_PASSWORD (required), CLAW_LIST_URL (informational)
# Bundled Postgres:
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
cp .env.example .env
Edit .env:
Package name closely resembles a popular package, suggesting possible typosquatting. Attackers publish malicious packages with similar names to trick developers into installing them.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
# Claw-List
Manage todo lists via a central API. Trigger on: "the list", "show me the list", "todo", "add task", "add to my list", "mark done", "mark complete", "what's due", "my tasks", "create a list".
## Config
The documentation explicitly recommends storing 'conversation context' in the free-text notes field without warning about privacy, minimization, or secrets handling. In an agent setting, conversation context can contain sensitive user data, credentials, internal prompts, or personal information, so this guidance increases the likelihood of inappropriate data retention and later disclosure.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
Self-hosted todo/task management for OpenClaw agents. Agents manage tasks via a REST API using `web_fetch` — no direct database access, no credentials in agent context. A web UI provides human oversight across all agents and lists.
This is a full rewrite of v1, which had agents writing directly to PostgreSQL via a Python CLI bundled with the skill.
---
The trigger phrases are broad enough to activate on common conversational language such as 'todo' or 'my tasks', which can cause the skill to run unexpectedly. Because the skill can create or modify task records and store conversation-derived content, accidental invocation may result in unintended data transmission or persistence.
The overview states that agents may store conversation context, links, or references in the notes field, but it does not present this as a clear user-facing warning about data persistence and transmission. This creates a privacy risk because users may reveal sensitive information believing it remains ephemeral, when it may instead be stored in the backend and exposed through the UI to authorized viewers.
The README explicitly instructs users to bind both the API and UI to 0.0.0.0, making them reachable from the network, but does not warn about the exposure or require authentication, firewalling, or TLS. In a system intended for agent connectivity and human oversight, this can lead operators to unintentionally publish administrative or sensitive services beyond localhost, increasing the attack surface.
The UI selects an all-scope agent if available, but otherwise falls back to any registered agent and then uses that agent's X-Agent-Id to request /lists. In an admin-style interface that manages multiple agents and their scopes, this can enable unauthorized cross-agent data access if the backend trusts the supplied agent context or exposes all lists through that endpoint, making the UI logic inconsistent with the stated permission model.
The document declares lang="en", which fixes the interface language to English. Under the stated policy, forcing a specific language without user opt-in or documented regional justification is a natural-language policy concern.
toLocaleDateString('en-GB', ...) explicitly forces British English date formatting for all users. This is a locale policy violation unless the skill offers user opt-in or clearly documents a justified region-specific constraint.
No suspicious patterns detected.