T01 · Skill Instruction Hijacking
- Location
SKILL.md:553- Finding
Imported Widget Instructions Are Automatically Executed by Tool-Enabled Subagents
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This dashboard skill has a coherent purpose, but it gives agents broad scheduled command execution and credential reuse paths that need careful review before installation.
Install only if you want OpenClaw to manage an always-on local dashboard and you are comfortable granting it scheduled local command execution and access to selected credentials. Prefer manual or verified installation over curl-to-bash, do not paste broad personal access tokens into chat, use least-privilege read-only tokens, review imported widget packages before enabling refresh schedules, and disable background services or cron refreshes you do not need.
SKILL.md:553Imported Widget Instructions Are Automatically Executed by Tool-Enabled Subagents
README.md:45Mutable Remote Installation Scripts Are Piped Directly into a Shell
SKILL.md:70Dashboard Installation Creates an Automatically Restarting Login Service
README.md:207Agent-Held Credentials Are Reused and Copied Without Explicit Per-Secret Authorization
The agent_refresh workflow explicitly instructs the agent to spawn subagents and execute local shell commands, then push results back to the service. This turns a widget-management skill into a general-purpose host execution and automation pathway, enabling indirect command execution and persistence-like behavior through recurring refresh tasks.
The README recommends piping a remotely fetched script directly into bash, which prevents inspection and gives the remote host immediate code execution on the user's machine. In a skill ecosystem where users may trust agent-provided setup steps, this materially increases supply-chain and remote compromise risk if the server, DNS, or distribution path is tampered with.
curl -fsSL https://openglance.dev/install.sh | bash
This will:
The command chaining of a network fetch directly into a shell is dangerous because it turns untrusted remote content into immediate executable input with no validation step. This is especially risky in AI-agent contexts where commands may be repeated automatically or suggested to less technical users without scrutiny.
curl -fsSL https://openglance.dev/install.sh | bash
This will:
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
npm install
# Configure environment
cp .env.example .env.local
# Edit .env.local with your settings
# Start development server
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
npm install
# Configure environment
cp .env.example .env.local
# Edit .env.local with your settings
# Start development server
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
{
"id": "github",
"type": "api_key",
"name": "GitHub Personal Access Token",
"description": "Token with repo scope",
"obtain_url": "https://github.com/settings/tokens"
}
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
{
"id": "github",
"type": "api_key",
"name": "GitHub Personal Access Token",
"description": "Token with repo scope",
"obtain_url": "https://github.com/settings/tokens"
}
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
{
"id": "github",
"type": "api_key",
"name": "GitHub Personal Access Token",
"description": "Token with repo scope",
"obtain_url": "https://github.com/settings/tokens"
}
The skill instructs the agent to issue a DELETE request to mark refresh requests as processed using a slug parameter that originates from workflow state. Without strong validation and authorization boundaries, such state-changing tool calls can be abused to clear or manipulate work items, especially when paired with broad invocation and DB-driven instructions.
7. **credentials is REQUIRED** — use empty array `[]` if no credentials needed
8. **Don't wrap in Card** — the framework provides the outer card, you render content only
9. **Use Haiku for refresh subagents** — mechanical data collection doesn't need Opus
10. **Mark refresh requests as processed** — `DELETE /api/widgets/{slug}/refresh` after handling
11. **Spawn subagents for refreshes** — don't block main session with PTY/long-running work
## Environment Variables
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).
- [GET /api/dashboard](#get-apidashboard)
- [POST /api/dashboard](#post-apidashboard)
- [PATCH /api/dashboard/:instanceId](#patch-apidashboardinstanceid)
- [DELETE /api/dashboard/:instanceId](#delete-apidashboardinstanceid)
- [PUT /api/dashboard/layout](#put-apidashboardlayout)
- [Grid System](#grid-system)
- [Auto-Placement](#auto-placement)
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 /api/dashboard/:instanceId
Remove a widget from the dashboard.
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).
"Are you sure you want to delete the weather widget?"
2. DELETE WIDGET INSTANCE (removes from dashboard)
DELETE /api/widgets/instances/:id
→ Returns { "success": true }
3. OPTIONALLY DELETE WIDGET DEFINITION (removes the code)
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).
"Are you sure you want to delete the weather widget?"
2. DELETE WIDGET INSTANCE (removes from dashboard)
DELETE /api/widgets/instances/:id
→ Returns { "success": true }
3. OPTIONALLY DELETE WIDGET DEFINITION (removes the code)
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).
→ Returns { "success": true }
3. OPTIONALLY DELETE WIDGET DEFINITION (removes the code)
DELETE /api/widgets/:slug
→ Returns { "success": true, "deleted_id": "cw_xxx" }
4. CONFIRM
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).
→ Returns { "success": true }
3. OPTIONALLY DELETE WIDGET DEFINITION (removes the code)
DELETE /api/widgets/:slug
→ Returns { "success": true, "deleted_id": "cw_xxx" }
4. CONFIRM
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).
→ Returns { "success": true }
3. OPTIONALLY DELETE WIDGET DEFINITION (removes the code)
DELETE /api/widgets/:slug
→ Returns { "success": true, "deleted_id": "cw_xxx" }
4. CONFIRM
The skill asks for a GitHub personal access token and instructs the agent to collect it via conversation. Requesting and then storing powerful credentials materially raises the risk of secret exposure and unauthorized downstream API access if the chat channel, logs, or prompt context are compromised.
→ Check if provider "github" exists in credentials list
2. EXPLAIN TO USER
"I need a GitHub personal access token to show your PRs.
You can create one at https://github.com/settings/tokens
with the 'repo' scope. Paste it here when ready."
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 /api/credentials/:id
Authorization: Bearer <token>
This section expands the skill from dashboard/widget management into agent-machine capability checks and use of local CLI authentication. That creates a privilege boundary crossing: a user request about widgets can induce the agent to inspect or depend on host-side tools and auth state, which is substantially more dangerous than normal API-only widget operations.
This guidance normalizes requesting a GitHub token directly from the user when a check fails. In the context of an AI agent, that encourages credential acquisition through an unsafe channel and can train users to divulge secrets conversationally.
if (!status.github?.configured) { // Prompt user for GitHub token throw new Error( "GitHub token required. Please provide your GitHub personal access token.", ); }
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
- Make authenticated API calls without exposing credentials to the browser
- Process or transform data before sending to the client
- Access credentials securely via `getCredential()`
### Writing Server Code
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.
<div className="text-center">
<p className="font-medium">GitHub token required</p>
<p className="text-sm text-muted-foreground">
Add your GitHub personal access token in Settings → Credentials
</p>
</div>
</CardContent>
The integration guide asks the user to paste a personal access token into chat and promises to store it securely. Even if storage is secure, the collection channel is not, creating risk of transcript leakage, prompt retention, or accidental re-exposure by the agent.
If a required credential is missing, ask the user to provide it:
Agent: "I need a GitHub personal access token to show PR data.
You can create one at https://github.com/settings/tokens with 'repo' scope.
Once you have it, just paste it here and I'll store it securely."
The import flow directs the agent to register cron jobs and operational automations on the agent side after widget import. That introduces durable background execution from imported content, so a shared widget package can cause ongoing agent activity beyond the immediate user request.
The skill is presented as natural-language driven with no clear activation guardrails, encouraging an agent to infer use from loosely related requests. Because the skill manages dashboard state and sensitive integrations, unconstrained invocation can lead to unintended API calls, widget creation, or storage of secrets.
No suspicious patterns detected.