Back to skill

Security audit

rentahuman

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly a real RentAHuman marketplace helper, but it can initiate funded real-world hiring actions with insufficient confirmation and exposes broader account/payment capabilities than the main description suggests.

Install only if you are comfortable giving the agent access to a RentAHuman API key that can affect real-world work and money. Require the agent to preview bounty cost, show the exact total and worker/task details, and get explicit confirmation before posting, accepting, paying, creating webhooks, changing API keys, or using wallet features. Avoid putting home addresses, access codes, government IDs, payment details, or sensitive schedules into task descriptions unless strictly necessary.

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

Error
Location
scripts/rentahuman.mjs:184
Finding

Authenticated bounty creation bypasses the documented preview and confirmation gate

Content
View full analysis

Vulnerability Details

File Location: scripts/rentahuman.mjs:184-195
Supporting Locations: SKILL.md:26-30, SKILL.md:82-86, references/API.md:325
Vulnerability Type: Missing authorization confirmation for a financial action
Risk Level: High

Vulnerable Code

scripts/rentahuman.mjs:184-195:

javascript
async 'create-bounty'(args) {
  const params = JSON.parse(args[0]);
  const id = loadIdentity();
  const verification = agentVerification(id, 'create_bounty');
  const body = {
    ...params,
    agentType: params.agentType || 'other',
    agentId: id.agentId,
    agentVerification: verification,
  };
  console.log(JSON.stringify(await authPost('/bounties', body), null, 2));
},

The primary invocation documented at SKILL.md:26-30 also omits a preview or confirmation step:

markdown
### 2. Post a bounty (requires API key)

```bash
RENTAHUMAN_API_KEY=rah_your_key node {baseDir}/scripts/rentahuman.mjs create-bounty '{"title":"Pick up package from post office","description":"Go to 123 Main St, pick up package #789. Must have valid ID.","priceType":"fixed","price":35,"estimatedHours":1}'
text

In contrast, `references/API.md:325` explicitly requires the following workflow:

```markdown
**IMPORTANT: Always call with dryRun=true first** to preview the bounty. A preview never creates a bounty, reserves funds, or starts a checkout. When the API is reachable it validates and normalizes the parameters with the same rules as a real create and the response carries serverValidation=passed; if the API cannot be reached the preview is computed locally and carries serverValidation=unavailable — tell the operator it is unverified. Dry-run `preview.fundingTotal` is the total funding requirement before any existing wallet balance is applied. Show that estimate to the operator before posting. Show the preview to the user and ask 'Here's your bounty — would you like to edit anythi
...[truncated 2966 chars]
Remediation
View remediation

Remediation Suggestions

  1. Change create-bounty so its first invocation always forces dryRun: true, regardless of the supplied JSON.
  2. Display the server-normalized bounty details and preview.fundingTotal to the user before allowing creation.
  3. Require a separate, explicit confirmation invocation before sending dryRun: false. Prefer a short-lived, server-issued preview identifier bound to the normalized parameters and authenticated account.
  4. Reject direct creation when no valid preview identifier or explicit confirmation proof is present.
  5. Ensure confirmation is invalidated whenever financially relevant fields change, including price, priceType, estimatedHours, or spotsAvailable.
  6. Add an idempotency key to confirmed creation requests to prevent duplicate commitments caused by retries.
  7. Update every SKILL.md bounty example to show the complete two-stage workflow: preview, display of the total, explicit user approval, and final creation.
  8. Add automated tests proving that direct creation, changed parameters after preview, and creation without confirmation are rejected.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (13)

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The API surface goes far beyond the skill's declared purpose of hiring humans for physical-world tasks and includes broad money movement, wallet custody, direct transfers, withdrawals, refunds, customer checkout creation, and other business-payment operations. In an agent setting, this kind of capability overexpansion is dangerous because a caller expecting a task-marketplace skill could unknowingly grant authority for irreversible financial actions outside the expected workflow.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

API key creation and revocation are privileged administrative functions that can expand, rotate, or destroy account access. In a skill presented as a human-task marketplace tool, these operations are context-inappropriate and dangerous because compromise or misuse could create persistent unauthorized access or deny legitimate access by revoking keys.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The x402 signup capability can create entirely new platform accounts using a blockchain private key, which is unrelated to the ordinary task-hiring workflow described to users. This materially expands the skill from operating within an existing account to spawning new accounts and credentials, creating abuse potential, hidden resource creation, and difficult-to-audit identity sprawl.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill instructs use of an environment variable (RENTAHUMAN_API_KEY) and authenticated actions, but it does not declare tool scope or permissions boundaries. That omission can cause an agent framework to invoke the skill without clearly signaling that secrets or code/execution capabilities are needed, increasing the chance of unintended secret exposure or unauthorized external actions.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The invocation description is very broad and encourages use for many ordinary real-world requests, which can cause over-triggering in unrelated contexts. Because this skill can coordinate physical-world tasks and external communications, accidental invocation could expose user intent, location, schedules, or lead to real-world actions being initiated without sufficiently specific user consent.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill promotes sharing task descriptions, pickup details, meeting logistics, and profile/review browsing on an external marketplace, but it does not warn against disclosing sensitive personal, location, identity, or access information. In this context, users may post addresses, package identifiers, schedules, or other private details to third parties, creating privacy, stalking, social engineering, and physical safety risks.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill exposes identity lifecycle operations and cryptographic credential context that are not reflected in the marketplace-focused description. That mismatch increases the chance an orchestrator or user will trust the skill with broader account and identity authority than intended, enabling identity switching, creation, or deletion in contexts where only task coordination was expected.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The API reference hard-codes languageProficiencyRequirement to { language: 'en', ... }, requiring applicants to pass an English speaking-proficiency check. This imposes a specific language policy without offering a user choice or documenting a region-specific necessity, which matches the natural-language policy violation criteria.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The update_bounty documentation again defines languageProficiencyRequirement only for language: 'en', preserving an English-only restriction in ongoing use. Because the file does not offer opt-in language selection or a clear justification for the locale constraint, this is a policy concern.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

Webhook management and Slack account-linking are integration/admin capabilities outside the narrow user expectation set by the skill description. These features can extend data exfiltration and account-linking reach beyond simple hiring tasks, especially if an agent can register external endpoints or trigger linking flows without the operator understanding that scope.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

Webhook endpoint management allows the skill to establish outbound event delivery to arbitrary HTTPS destinations, which is more powerful than the manifest's basic marketplace framing suggests. That can be abused to route sensitive operational events to attacker-controlled infrastructure or create stealthy persistence/integration channels.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script generates and stores an Ed25519 private key on disk automatically in ~/.rentahuman-identities without any explicit disclosure, consent, or lifecycle guidance. Although file mode 0600 reduces exposure, silent persistence of authentication material can surprise users, increase the chance of unintended long-term credential retention, and create risk on shared or backed-up systems.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The start-conversation and send-message commands send user-supplied subject/content and related metadata to the remote API using HTTPS. While network transmission is central to the tool's purpose, the command implementations themselves provide no runtime disclosure or reminder that message contents and metadata are being sent to an external service.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.