Back to skill

Security audit

Monzo

Security checks across malware telemetry and agentic risk

Overview

The skill is mostly transparent about Monzo banking access, but it needs Review because it can keep ongoing bank access and perform account-changing actions without built-in confirmation.

Install only if you are comfortable giving an agent persistent Monzo API access. Use it on a machine you control, protect MONZO_KEYRING_PASSWORD, avoid putting real secrets in shell history or shared config, review Monzo connected apps regularly, and require your own explicit confirmation before any pot movement, receipt deletion, transaction annotation, feed notification, or webhook change.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (20)

Lp3

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding
The skill clearly instructs the agent to execute shell scripts, but the manifest does not declare any explicit permissions/capabilities beyond required binaries and environment variables. In an agent ecosystem, undeclared shell execution materially increases risk because users and reviewers may not realize the skill can run arbitrary local commands during banking operations.

Tp4

High
Category
MCP Tool Poisoning
Confidence
89% confidence
Finding
The top-level description says the skill is for balances, transactions, pots, and feed notifications, but the documentation exposes additional powerful behaviors including webhook management, receipt operations, account inspection, and local credential setup/storage. This mismatch can mislead users and orchestration systems into granting or invoking a broader financial capability set than expected.

Description-Behavior Mismatch

Medium
Confidence
88% confidence
Finding
The manifest description also omits webhook-management capability, which can send account event data to external endpoints. Because webhooks introduce ongoing external data transmission, failing to disclose them understates the privacy and security impact of the skill.

Description-Behavior Mismatch

Medium
Confidence
88% confidence
Finding
The manifest description also omits webhook-management capability, which can send account event data to external endpoints. Because webhooks introduce ongoing external data transmission, failing to disclose them understates the privacy and security impact of the skill.

Context-Inappropriate Capability

Medium
Confidence
85% confidence
Finding
Webhook creation/deletion is not obviously necessary for routine personal-finance queries and adds a persistent outbound integration path. In a banking context, that can expose transaction events or metadata to third-party infrastructure without the user appreciating the ongoing monitoring implications.

Vague Triggers

Medium
Confidence
84% confidence
Finding
The description is broad enough that an orchestrator might invoke the banking skill for generic personal-finance questions, even when Monzo account access is unnecessary. Over-broad routing increases unnecessary exposure of financial credentials and account data in situations that could be answered without touching the bank account.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The documentation describes depositing and withdrawing money from pots without any explicit confirmation, approval, or anti-mistake controls. In a banking skill, state-changing money movement without a confirmation step creates a high risk of accidental or unauthorized transfers caused by misinterpretation, prompt injection, or user ambiguity.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The advanced webhook commands are documented without warning that they can cause ongoing external transmission of account event data or alter system integrations. In a banking context, silent creation of webhooks can create durable privacy exposure well beyond the immediate session.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The delete path performs a destructive banking-adjacent action immediately once an external ID is supplied, with no confirmation prompt, dry-run mode, or explicit safeguard. In an agentic or automated context, a mistaken parameter, prompt injection, or unintended tool invocation could silently delete receipt data the user did not intend to remove.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The interactive flow reads the OAuth client secret with a normal echoed prompt, so the secret is displayed on screen and may be exposed to shoulder-surfing, screen recording, terminal logging, or shared-session capture. In a banking skill, disclosure of the client secret materially weakens the OAuth client and can enable unauthorized token issuance when combined with other stolen data.

Missing User Warnings

High
Confidence
99% confidence
Finding
The documented non-interactive usage requires passing the OAuth client secret and authorization code on the command line, which commonly exposes them via shell history, audit logs, CI logs, and process listings such as `ps`. For a banking integration, those values are highly sensitive because they can be used to obtain or facilitate access tokens tied to a financial account.

Credential Access

High
Category
Privilege Escalation
Content
The following are stored in the encrypted credentials file:
- OAuth Client ID and Client Secret
- Access Token and Refresh Token
- Default Account ID

### What This Skill Does NOT Protect Against
Confidence
76% confidence
Finding
Access Token

Credential Access

High
Category
Privilege Escalation
Content
"monzo": {
        enabled: true,
        env: {
          "MONZO_KEYRING_PASSWORD": "choose-a-secure-password-here"
        }
      }
    }
Confidence
78% confidence
Finding
KEYRING

Credential Access

High
Category
Privilege Escalation
Content
echo "$json" | openssl enc -aes-256-cbc \
    -salt -pbkdf2 -iter 100000 \
    -pass env:MONZO_KEYRING_PASSWORD \
    -out "$CREDENTIALS_FILE" 2>/dev/null
}
Confidence
83% confidence
Finding
KEYRING

Credential Access

High
Category
Privilege Escalation
Content
openssl enc -aes-256-cbc -d \
    -salt -pbkdf2 -iter 100000 \
    -pass env:MONZO_KEYRING_PASSWORD \
    -in "$CREDENTIALS_FILE" 2>/dev/null || {
      echo "Error: Failed to decrypt credentials (wrong password?)" >&2
      return 1
Confidence
84% confidence
Finding
KEYRING

Credential Access

High
Category
Privilege Escalation
Content
echo "$json" | openssl enc -aes-256-cbc \
    -salt -pbkdf2 -iter 100000 \
    -pass env:MONZO_KEYRING_PASSWORD \
    -out "$CREDENTIALS_FILE" 2>/dev/null

  chmod 600 "$CREDENTIALS_FILE"
Confidence
78% confidence
Finding
KEYRING

Credential Access

High
Category
Privilege Escalation
Content
openssl enc -aes-256-cbc -d \
    -salt -pbkdf2 -iter 100000 \
    -pass env:MONZO_KEYRING_PASSWORD \
    -in "$CREDENTIALS_FILE" 2>/dev/null
}
Confidence
78% confidence
Finding
KEYRING

Credential Access

High
Category
Privilege Escalation
Content
echo "This password is used to encrypt your Monzo credentials."
  echo "Add it to your shell environment or OpenClaw config:"
  echo ""
  echo "  export MONZO_KEYRING_PASSWORD='your-secure-password'"
  echo ""
  exit 1
fi
Confidence
84% confidence
Finding
KEYRING

Credential Access

High
Category
Privilege Escalation
Content
EXPIRES_IN=$(jq -r '.expires_in // 21600' <<< "$TOKEN_RESPONSE")

if [[ -z "$ACCESS_TOKEN" || "$ACCESS_TOKEN" == "null" ]]; then
  print_error "Failed to obtain access token"
  echo "Response: $TOKEN_RESPONSE"
  exit 1
fi
Confidence
88% confidence
Finding
access token

Tool Parameter Abuse

High
Category
Tool Misuse
Content
exit 1
  fi

  response=$(monzo_api_call DELETE "/transaction-receipts?external_id=$EXTERNAL_ID")

  echo "✓ Receipt deleted"
  exit 0
Confidence
83% confidence
Finding
DELETE "/transaction-receipts?external_id=$EXTERNAL_ID

VirusTotal

66/66 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

No suspicious patterns detected.