Is chloepark85/errand-ai safe?
https://github.com/openclaw/skills/tree/main/skills/chloepark85/errand-ai
ErrandAI is a legitimate gig economy task management skill with clean installation behavior, no malicious code, and no evidence of credential theft or prompt injection in its static content. However, the skill introduces meaningful operational risk through three vectors: its ability to approve irreversible USDC cryptocurrency payments that could be triggered by agent manipulation or indirect prompt injection via third-party API responses; a configurable API URL that creates a persistent credential-harvesting attack surface post-install; and the transmission of user identity and channel metadata to a third-party service without explicit disclosure. The skill is safe to install in low-trust or read-only configurations but carries significant risk in autonomous agent deployments with live USDC wallets.
Category Scores
Findings (8)
HIGH Irreversible USDC Payment Approvals Triggerable via Agent Manipulation -30 ▶
The reviewSubmission() function releases cryptocurrency payments to gig workers when the agent calls it with approved:true. The natural language pattern '/approve\s+submission\s+(\w+)/i' means any conversational phrase containing 'approve submission
HIGH Configurable API URL Creates Credential and Data Harvesting Attack Surface -15 ▶
ERRANDAI_API_URL defaults to api.errand.be but is fully overridable via environment variable or OpenClaw config yaml. An attacker with write access to the OpenClaw config file (which is in the user's home directory) could redirect all API calls to an attacker-controlled HTTPS server. Every subsequent API call would transmit the ERRANDAI_API_KEY in plaintext X-API-Key headers, plus all errand content, user identifiers, and channel metadata. This is a persistent post-install attack surface that survives the initial audit.
MEDIUM Unsanitized Third-Party API Response Content Injected into Agent Context -12 ▶
errand.title, errand.status, submission.status, and submission.validation_score fields from the errand.be API are string-interpolated directly into markdown response messages that are returned to the agent. If errand.be (or a malicious server pointed to by a modified ERRANDAI_API_URL) returns errand/submission text containing LLM prompt injection payloads (e.g., 'IGNORE PREVIOUS INSTRUCTIONS...'), those instructions would be executed in the agent's context. This is an indirect prompt injection via third-party data.
MEDIUM User Identity and Channel Context Transmitted to Third-Party Service -7 ▶
The postErrand() function includes user.id (the agent's user identifier) and context.channel (the channel/interface being used) in the metadata object sent to api.errand.be with every errand creation request. This enables the errand.be platform to build a profile of when and how the user is interacting with their AI agent, which channel they use, and how often they post errands. No disclosure of this data collection is presented to the user.
MEDIUM No Confirmation Gate Before Financial or External Actions -10 ▶
All four skill commands (postErrand, checkErrand, listErrands, reviewSubmission) execute external API calls immediately upon intent detection with no user confirmation step. For errand posting (which spends USDC) and submission review (which releases USDC), a misunderstood or misinterpreted command could cause unintended financial expenditure. The skill's own JavaScript has no built-in rate limiting or daily spend cap.
LOW Runtime JavaScript Execution Requires Unbundled External Dependency -15 ▶
errandai.skill.js requires the axios npm package at runtime via CommonJS require(). The skill does not bundle axios or pin a specific version. If the host environment has a compromised or outdated axios version (e.g., via a supply chain attack on npm), the skill's HTTP calls could be intercepted or modified. No package-lock.json or integrity hash is included with the skill.
LOW Install from Monorepo HEAD Without Commit Hash Pinning -12 ▶
The install process clones the monorepo main branch at HEAD and checks out the skill subdirectory. While the _meta.json references a specific commit hash (2b92afd1c2848b88b25d2d7f4ce8fe140d19f6f1), the install script does not verify the checkout matches this hash. A monorepo maintainer could push malicious changes to the skill path and any subsequent reinstall would silently pick them up.
INFO Canary Files Read Twice — Both Accesses Attributable to Audit Framework -8 ▶
Honeypot files (.env, .ssh/id_rsa, .aws/credentials, .npmrc, .docker/config.json, .config/gcloud/application_default_credentials.json) appear in file access syscalls at two timestamps: 1771737223 (pre-install baseline scan) and 1771737239 (post-install integrity verification). Both access windows are consistent with audit framework operation and occur outside the install window (1771737228-1771737235). The skill's JavaScript was not executed during the audit. All canary files confirmed intact with no modifications.