Back to skill

Security audit

Local Approvals

Security checks across malware telemetry and agentic risk

Overview

This is a local approval-management tool, but its persistent category-based auto-approval can let future agent requests skip human review too broadly.

Install only if approval commands are controlled by a trusted user or trusted wrapper. Do not let the agents being governed run approve or approve --learn themselves. Use learned categories only for narrow, low-risk actions, review categories and pending/history files regularly, and reset approvals after mistakes or suspicious behavior.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (14)

Lp3

Medium
Category
MCP Least Privilege
Confidence
68% confidence
Finding
The skill documentation describes a CLI that reads and writes local state files and references underlying code capabilities, but the skill metadata does not declare any permissions. Missing permission declarations weaken reviewability and can cause operators to underestimate the file, write, or possible network access the implementation may require.

Missing User Warnings

Medium
Confidence
84% confidence
Finding
The `approve <id> --learn` option persistently adds a category to an auto-approve list, allowing future requests in that category to bypass per-request review. Although the doc mentions this behavior, it does not foreground the security consequence strongly enough, which can lead users to grant durable trust too broadly.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
---
name: local-approvals
description: Local approval system for managing agent permissions. Use CLI to approve/deny requests, view history, and manage auto-approved categories.
---

# Local Approvals Skill
Confidence
78% confidence
Finding
The skill explicitly supports auto-approval, which is a form of autonomous decision-making over future permission requests. In a permission-management context this is inherently sensitive because a mistaken or overly broad category can silently authorize later actions without human review.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
# Local Approvals Skill

A local approval system that manages agent permissions with auto-approve lists and approval history tracking.

## Quick Start
Confidence
78% confidence
Finding
The description highlights 'auto-approve lists,' confirming the skill is designed to make future permission decisions automatically. This increases risk because trust persists beyond the original approval event and may be applied to later operations with different safety characteristics.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
The skill maintains two JSON files in the state directory:

- **state.json**: Auto-approve lists and approval history
- **pending.json**: Pending approval requests

Location: `~/.openclaw/skills/local-approvals/`
Confidence
74% confidence
Finding
Storing auto-approve lists in `state.json` makes the autonomous approval policy persistent across sessions. Persistent policy state can magnify the effect of a bad approval decision and, if tampered with, could silently expand what the agent may do.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
The `core.py` module provides the underlying functionality:

- `check_auto_approve(agent, category)` - Check if a category is auto-approved
- `submit_request(agent, category, operation, reasoning)` - Submit a pending request
- `learn_category(agent, category)` - Add category to auto-approve list
- `get_request(request_id)` - Retrieve a request by ID
Confidence
79% confidence
Finding
The same function block also documents categories as 'auto-approved,' reinforcing that the system can independently authorize requests after prior learning. This is contextually risky because the skill's purpose is to gate potentially sensitive agent operations.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
The `core.py` module provides the underlying functionality:

- `check_auto_approve(agent, category)` - Check if a category is auto-approved
- `submit_request(agent, category, operation, reasoning)` - Submit a pending request
- `learn_category(agent, category)` - Add category to auto-approve list
- `get_request(request_id)` - Retrieve a request by ID
Confidence
79% confidence
Finding
The same function block also documents categories as 'auto-approved,' reinforcing that the system can independently authorize requests after prior learning. This is contextually risky because the skill's purpose is to gate potentially sensitive agent operations.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
- `check_auto_approve(agent, category)` - Check if a category is auto-approved
- `submit_request(agent, category, operation, reasoning)` - Submit a pending request
- `learn_category(agent, category)` - Add category to auto-approve list
- `get_request(request_id)` - Retrieve a request by ID
- `update_request(request_id, decision, reviewer)` - Update request with decision
- `list_pending(agent)` - List pending requests
Confidence
83% confidence
Finding
`learn_category(agent, category)` turns a one-time approval into a standing authorization rule. If a user approves a misleading request or an attacker engineers an innocuous-looking category, subsequent actions in that category may proceed without further scrutiny.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
- `get_request(request_id)` - Retrieve a request by ID
- `update_request(request_id, decision, reviewer)` - Update request with decision
- `list_pending(agent)` - List pending requests
- `get_agent_approvals(agent)` - Get agent's auto-approved categories

## Best Practices
Confidence
72% confidence
Finding
`get_agent_approvals(agent)` exposes stored auto-approved categories, confirming that persistent autonomous policy exists per agent. In context this is less a hidden backdoor than a risky feature, but it still increases the chance of silent over-authorization if not tightly controlled.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
## Best Practices

1. **Review before approving**: Always check the operation and reasoning before approving
2. **Use auto-learn carefully**: Only use `--learn` for trusted categories that you want to auto-approve
3. **Check history regularly**: Review `history` to understand approval patterns
4. **Reset when needed**: Use `reset` to clear an agent's auto-approve list if you suspect issues
Confidence
76% confidence
Finding
The best-practices section advises careful use of auto-learn, implicitly acknowledging that the feature can grant future automatic approvals. This is not malicious, but it confirms a sensitive workflow where human error can create durable authorization bypass.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
1. **Review before approving**: Always check the operation and reasoning before approving
2. **Use auto-learn carefully**: Only use `--learn` for trusted categories that you want to auto-approve
3. **Check history regularly**: Review `history` to understand approval patterns
4. **Reset when needed**: Use `reset` to clear an agent's auto-approve list if you suspect issues

## Examples
Confidence
76% confidence
Finding
The guidance to reset auto-approve lists 'if you suspect issues' shows the authors recognize policy persistence can become unsafe. That persistence is the danger: once enabled, broad approvals may continue until manually revoked, allowing inappropriate future actions.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
# Auto-learn the category if requested
        if auto_learn:
            learn_category(updated['agent'], updated['category'])
            print(f"   📚 Category '{updated['category']}' added to auto-approve for agent '{updated['agent']}'")
        
        return True
Confidence
81% confidence
Finding
After a single manual approval, the CLI can automatically add that category to the agent's auto-approve list via '--learn'. In an approval-management skill, this expands future trust based only on category labels, which can allow later requests in the same category to bypass human review if categories are overly broad or attacker-influenced.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
state = _load_state()
    
    # Get the auto-approve list for this agent
    agent_approvals = state.get("auto_approve", {}).get(agent, [])
    
    # Check if category is in the list
    return category in agent_approvals
Confidence
78% confidence
Finding
The code returns a simple membership check to auto-approve operations solely based on agent and category, with no additional validation of the specific operation, resource scope, requester authenticity, or risk level. In an agent-permission skill, this can weaken approval boundaries and allow overly broad approval reuse if categories are coarse or attacker-influenced.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
state["auto_approve"][agent] = []
    
    # Add category if not already present
    if category not in state["auto_approve"][agent]:
        state["auto_approve"][agent].append(category)
        _save_state(state)
        return True
Confidence
86% confidence
Finding
This line appends a category to an agent's auto-approve list without any in-function verification that the learning event resulted from a trusted human approval, that the category is safe to generalize, or that the scope is sufficiently narrow. In this skill context, persistent learning of broad categories can silently expand future agent privileges and turn one approval into durable permission escalation.

VirusTotal

64/64 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

No suspicious patterns detected.