T08 · Insecure Dependencies
- Location
SKILL.md:65- Finding
Unpinned External Dependencies Enable Supply-Chain Code Substitution
- Content
View full analysis
Vulnerability Details
File Location:
SKILL.md, lines 65-70
Vulnerability Type: Unpinned and mutable executable dependencies
Risk Level: HighVulnerable Code
bash mm --version || npm install -g @metamask/agent-wallet@latest npx skills add SELAT-AI/selat-metamask-skillsThe retrieved project is subsequently trusted as the source of executable scripts:
bash python3 skills/selat-purchasing/scripts/run_manifest.py \ skills/stock-direction-signals/manifest.json \ --param ticker=NVDA --dry-runbash python3 skills/selat-purchasing/scripts/eco_fund.py <usdc-amount>The document itself states that the upstream project is not hardened:
The upstream repo is a prototype from a live 2026-08 integration spike — proven on mainnet, not yet hardened; review before large budgets.
Technical Analysis
The Skill installs
@metamask/agent-wallet@latestglobally and retrieves a GitHub-hosted Skill repository without pinning either dependency to a reviewed immutable version or commit. No checksum, package signature, lockfile, or source-integrity verification is specified.The effective implementation is not contained in the audited artifact. After retrieval, Python scripts from the mutable upstream repository are executed for manifest processing, wallet funding, paid purchases, and spending reports. Consequently, the behavior reviewed in
SKILL.mdcan differ from the behavior executed later if the npm release, GitHub branch, repository account, package publication process, or dependency-resolution infrastructure changes or is compromised.Although the document claims that the upstream scripts do not access key material and that signatures remain in the wallet CLI, those claims cannot be independently verified from this artifact because the relevant scripts and manifest are absent.
Attack Path
- An attacker compromises the npm package, its publisher account, the ...[truncated 1757 chars]
- Remediation
View remediation
Remediation Suggestions
- Replace
@latestwith an exact, reviewed package version. Use a lockfile and verify npm registry integrity metadata before installation. - Pin the GitHub dependency to a reviewed immutable commit hash rather than a mutable branch or repository default.
- Verify downloaded artifacts using published cryptographic hashes or signed release attestations before executing them.
- Vendor the required manifest and Python scripts into the Skill package so that the audited implementation is the implementation that runs.
- Audit all retrieved scripts, including
run_manifest.py,eco_fund.py, andspend_report.py, before authorizing wallet funding or paid execution. - Avoid global package installation where possible. Run the tooling in a dedicated, minimally privileged environment with restricted filesystem and network access.
- Require explicit user confirmation after displaying the exact wallet address, network, transaction recipient, token, amount, per-step prices, total cost, and immutable dependency versions.
- Independently enforce wallet-level allowlists and conservative spending limits rather than relying exclusively on controls implemented by downloaded scripts.
- Revalidate expired quotes and reject any transaction whose signed parameters differ from the values previously shown to the user.
- Replace
