Back to skill

Security audit

Ambient Ride

Security checks across malware telemetry and agentic risk

Overview

The skill matches its ride-hailing purpose, but it needs review because it can book rides, charge cards or wallets, move USDC, store sensitive local state, and relay ride data with several consent and privacy gaps.

Review this before installing if you will connect real payment cards, a Privy wallet, or live ride accounts. Use host-level confirmation gates for every ride request, tip, card charge, deposit, withdrawal, and bridge transfer; treat ~/.amb as sensitive wallet and movement-history state; and avoid sharing debug zips unless you have reviewed them for ride, wallet, account, and location details.

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
  • YARA SignaturesMalware Match, Webshell Match, Cryptominer Match
Findings (14)

Lp3

Medium
Category
MCP Least Privilege
Confidence
84% confidence
Finding
The skill declares no permissions while explicitly relying on environment variables and host-level state such as PATH and local directories. This creates a transparency and least-privilege problem: users and harnesses may underestimate what the skill can access or modify, increasing the risk of unsafe execution or policy bypass.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding
The skill presents itself as a ride-booking workflow, but the instructions also cover installing global binaries, modifying ~/.local/bin and ~/.amb, managing symlinks, invoking external tools, resolving chat sessions, and running detached relay processes. This mismatch is dangerous because it hides materially broader system and messaging capabilities than the declared purpose suggests, which can lead to unexpected persistence, data exposure, or privilege misuse.

Context-Inappropriate Capability

Medium
Confidence
81% confidence
Finding
The debug command packages diagnostic artifacts, logs, process locks, cursors, and summaries into a zip for sharing. In the context of a ride and wallet skill, that bundle can easily contain sensitive local state, ride history, identifiers, or operational metadata that exceed the minimum necessary for normal service use.

Intent-Code Divergence

Medium
Confidence
96% confidence
Finding
The document states the skill 'only talks to TADA-operated servers,' but elsewhere explicitly says it uses Privy for wallet creation/signing. This is a security-relevant documentation inconsistency because it can mislead users about where sensitive authentication and wallet-related data is sent, undermining informed consent and risk assessment.

Missing User Warnings

Medium
Confidence
84% confidence
Finding
The skill instructs the agent to request precise current latitude/longitude to improve place search, but does not require a user-facing privacy notice or explain that the data is optional and sensitive. Precise location is highly sensitive personal data; collecting it without clear minimization and disclosure increases privacy risk and can expose users to tracking or over-collection beyond what they expect.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The skill describes persisting frequent destinations and origins locally in SQLite without requiring the agent to warn the user or obtain consent. Saved places can reveal home, work, medical, or other sensitive movement patterns, so undisclosed local retention materially increases privacy risk if the host or profile is shared or later compromised.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The documented tip flow proceeds from amount selection directly to `amb tip <ride_id> <amount>` without requiring an explicit final user confirmation immediately before charging a saved card or wallet. In an agent-driven payment skill, this creates a real risk of unintended financial transactions from ambiguous, mistaken, or manipulated conversational input, especially because the same command auto-dispatches between card and crypto payment modes.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The guide acknowledges that the agent may autonomously request rides and settle fares without explicit per-step confirmation, but this warning is buried in the FAQ instead of being presented prominently before setup/use. In a skill that can trigger transportation bookings and on-chain payments, insufficiently prominent disclosure materially increases the risk of unauthorized or accidental spending.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The relay forwards ride prompts and ride-status content to an external CLI target (`openclaw agent --message ...`), which may in turn transmit that data to external services or channels. Even if intended, this creates a privacy and data-sharing risk because ride metadata, driver chat, status text, and links can leave the local process boundary without explicit consent or minimization in this code path.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
Then `amb bridge-usdc-quote <wallet> <shortfall> --fast`. If it reports `below_min: true`, raise the amount to `min_usdc` — that is the smallest transfer the bridge accepts, so it is not a discretionary increase. If it reports `sufficient: false`, the source cannot cover even the shortfall: report that and stop, rather than retrying at a smaller amount that would not fix anything.

If the quote reports `preauthorized: true`, run the Fast bridge **without asking** (~40 s, blocking) and report the amount and the actual fee afterwards. If `preauthorized` is `false`, ask — and offer the free 20-minute option alongside.

**The CLI backs this up.** `bridge-usdc --fast` refuses with `BRIDGE_FEE_NOT_AUTHORIZED` when the fee it computes is not covered by a standing approval, so skipping the quote does not skip the ceiling, and a fee that grew since you quoted is refused rather than spent. Standard is unaffected — its fee is zero.
Confidence
97% confidence
Finding
without asking

Credential Access

High
Category
Privilege Escalation
Content
~/.amb/
├── data/
│   ├── ambient-ride.db    SQLite (wallet metadata, ride state, dedup, ...)
│   └── .env                  AMB_RIDE_PASSPHRASE (created/preserved by install.js)
└── keys/
    └── <wallet_id>_private.enc, <wallet_id>_public.pem
                              Encrypted Privy keys (decryptable only with the passphrase)
Confidence
90% confidence
Finding
.env

Tool Parameter Abuse

High
Category
Tool Misuse
Content
- If the prebuilt binary cannot be downloaded, build from source: install `apt install build-essential python3` on Linux, Xcode Command Line Tools on macOS, or Visual Studio Build Tools on Windows, then re-run `install.js`.
- Or set an internal mirror: `npm config set better_sqlite3_binary_host_mirror <internal_mirror>` then retry.

For ABI mismatch (`Error: ... NODE_MODULE_VERSION`): make sure Node ≥ 18 is active (`node --version`), then `rm -rf ~/.amb/cli && node <SKILL_DIR>/scripts/install.js` (re-clone + re-install).

If `npm i -g @ambprotocol/ride-cli` fails with `EACCES`, npm's global prefix is not writable by your user. Do **not** re-run it under `sudo`: the CLI deliberately skips state initialisation when it detects a sudo invocation (it reports `status: "skipped_sudo"`), because root-owned `~/.amb` state would lock you out of your wallet keys. Point npm at a user-writable prefix instead (`npm config set prefix ~/.local`) and make sure that prefix's `bin` directory is on your `$PATH`.
Confidence
84% confidence
Finding
rm -rf ~

Tool Parameter Abuse

High
Category
Tool Misuse
Content
- If the prebuilt binary cannot be downloaded, build from source: install `apt install build-essential python3` on Linux, Xcode Command Line Tools on macOS, or Visual Studio Build Tools on Windows, then re-run `install.js`.
- Or set an internal mirror: `npm config set better_sqlite3_binary_host_mirror <internal_mirror>` then retry.

For ABI mismatch (`Error: ... NODE_MODULE_VERSION`): make sure Node ≥ 18 is active (`node --version`), then `rm -rf ~/.amb/cli && node <SKILL_DIR>/scripts/install.js` (re-clone + re-install).

If `npm i -g @ambprotocol/ride-cli` fails with `EACCES`, npm's global prefix is not writable by your user. Do **not** re-run it under `sudo`: the CLI deliberately skips state initialisation when it detects a sudo invocation (it reports `status: "skipped_sudo"`), because root-owned `~/.amb` state would lock you out of your wallet keys. Point npm at a user-writable prefix instead (`npm config set prefix ~/.local`) and make sure that prefix's `bin` directory is on your `$PATH`.
Confidence
84% confidence
Finding
rm -rf ~/.amb/cli && node <SKILL_DIR>/scripts/

YARA rule 'agent_skill_destructive_autonomous_actions': Autonomous destructive filesystem, shell history, or repository actions in AI agent skills [agent_skills]

High
Category
YARA Match
Content
- If the prebuilt binary cannot be downloaded, build from source: install `apt install build-essential python3` on Linux, Xcode Command Line Tools on macOS, or Visual Studio Build Tools on Windows, then re-run `install.js`.
- Or set an internal mirror: `npm config set better_sqlite3_binary_host_mirror <internal_mirror>` then retry.

For ABI mismatch (`Error: ... NODE_MODULE_VERSION`): make sure Node ≥ 18 is active (`node --version`), then `rm -rf ~/.amb/cli && node <SKILL_DIR>/scripts/install.js` (re-clone + re-install).

If `npm i -g @ambprotocol/ride-cli` fails with `EACCES`, npm's global prefix is not writable by your user. Do **not** re-run it under `sudo`: the CLI deliberately skips state initialisation when it detects a sudo invocation (it reports `status: "skipped_sudo"`), because root-owned `~/.amb` state would lock you out of your wallet keys. Point npm at a user-writable prefix instead (`npm config set prefix ~/.local`) and make sure that prefix's `bin` directory is on your `$PATH`.
Confidence
80% confidence
Finding
rm -rf ~/; non-interactive; non-interactive

VirusTotal

VirusTotal findings are pending for this skill version.

View on VirusTotal

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
scripts/ride-relay.js:171