Back to skill

Security audit

Safe Multisig Skill

Security checks for vulnerabilities and agentic risk

Overview

This looks like a real Safe multisig CLI, but it handles owner keys and signatures and can send sensitive transaction data to arbitrary configured service URLs.

Review this carefully before installing. Use it only with low-privilege or testnet signer keys first, prefer official Safe Transaction Service URLs, do not pass --tx-service-url unless you control and trust the endpoint, and update/install dependencies with an immutable lockfile workflow before running commands that sign, approve, deploy, or execute transactions.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (2)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/safe_lib.ts:76
Finding

<![CDATA[Sensitive API Credentials and Safe Signatures Can Be Transmitted to Arbitrary Endpoints]]>

Content
View full analysis
', 'Safe tx-service chain slug (e.g. base, base-sepolia, mainnet)') .option('--tx-service-url ', 'Override tx-service base URL') .option('--rpc-url ', 'RPC URL (required for signing/executing)', process.env.RPC_URL) .option('--api-key ', 'Safe Transaction Service API key', process.env.SAFE_TX_SERVICE_API_KEY) .option('--debug', 'Verbose logging'); } ``` ```ts // scripts/safe_lib.ts:84-104 export function resolveTxServiceUrl(opts: CommonOptions): string { if (opts.txServiceUrl) return opts.txServiceUrl.replace(/\/$/, ''); if (!opts.chain) throw new Error('Missing --chain or --tx-service-url'); const slug = opts.chain.toLowerCase(); const shortName = CHAIN_SHORT_NAMES[slug]; if (!shortName) { throw new Error( `Unknown chain slug "${opts.chain}" for Safe Transaction Service. ` + `Known: ${Object.keys(CHAIN_SHORT_NAMES).join(', ')}` ); } // FIX SM-001: Use api.safe.global gateway with /api suffix // The per-chain subdomains (safe-transaction-{slug}.safe.global) are deprecated. // The unified gateway at api.safe.global is the current standard. return `https://api.safe.global/tx-service/${shortName}/api`; } ``` ```ts // scripts/approve-tx.ts:47-57 // Sign the tx hash const sig = await safeSdk.signHash(opts.safeTxHash!); const apiKitConfig: { chainId: bigint; txServiceUrl: string; apiKey?: string } = { chainId, txServiceUrl }; if (opts.apiKey) apiKitConfig.apiKey = opts.apiKey; const apiKit = new SafeApiKit(apiKitConfig); await apiKit.confirmTransact ...[truncated 3365 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
scripts/bootstrap.sh:11
Finding

<![CDATA[Bootstrap Does Not Enforce Immutable Lockfile-Based Dependency Installation]]>

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (80)

Known Vulnerable Dependency: vitest==4.0.18 — 2 advisory(ies): CVE-2026-47429 (When Vitest UI server is listening, arbitrary file can be read and executed); CVE-2026-84373 (Vitest: Path Traversal / Arbitrary File Read via @vitest/mocker Redirect Mock)

Critical
Category
Supply Chain
Confidence
90% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: vitest==4.0.18 — 2 advisory(ies): CVE-2026-47429 (When Vitest UI server is listening, arbitrary file can be read and executed); CVE-2026-84373 (Vitest: Path Traversal / Arbitrary File Read via @vitest/mocker Redirect Mock)

Critical
Category
Supply Chain
Confidence
98% confidence
Finding

The manifest resolves to vitest 4.0.18, which is reported as affected by critical advisories enabling arbitrary file read and possible code execution/path traversal in testing components. Although Vitest is a devDependency, the risk is still significant in developer workstations and CI, especially because this skill handles multisig and blockchain operations where secrets, RPC credentials, and transaction artifacts may be present in the environment.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description presents a full-featured Safe multisig operational skill centered on Safe{Core} SDK actions and transaction lifecycle management. The supplied code instead is a small Bash utility that maps chain names to Safe Transaction Service gateway slugs and queries the service's /v1/about/ endpoint. This is related to Safe infrastructure, but it does not implement the core declared capabilities such as Safe creation, state inspection, pending transaction listing, proposal, confirmation, execution, or nonce/signature troubleshooting. The code's primary purpose is service endpoint discovery/health/info retrieval, which is materially narrower and different from the declared behavior.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The description advertises a full Safe multisig operations skill built on Safe{Core} SDK, but the provided code chunk is only a test suite for generic support helpers. Those helpers are related to Safe tooling infrastructure—such as validating addresses and hashes, resolving known Safe transaction service URLs and RPC URLs, reading a signer private key from environment variables, warning about missing API keys, wrapping fetch, and configuring CLI options—but they do not demonstrate the core declared behaviors. There is no visible use of Safe{Core} SDK to create or predict a Safe, retrieve Safe metadata, list pending multisig transactions, build/propose transactions, collect confirmations, or execute onchain transactions. This is therefore a material description-behavior mismatch: the actual code shown is narrower and primarily test/support logic rather than the end-user Safe multisig functionality claimed.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

There is a clear mismatch between the declared purpose and the supplied code. The description claims extensive Safe multisig functionality across multiple blockchain networks using Safe{Core} SDK, but the actual code chunk is only a generic Vitest configuration file for running tests. This code does not access blockchain resources, interact with Safe smart accounts, use the referenced SDKs, or expose any of the described transaction-management capabilities. The primary purpose of the code is test configuration, which is materially different from the declared Safe operations skill.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 29)May include surrounding context.

md
| `safe-info.ts` | Fetch Safe info (owners/threshold/nonce) |

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 54)May include surrounding context.

md
| `safe-info.ts` | Fetch Safe info (owners/threshold/nonce) |

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 30)May include surrounding context.

md
| `list-pending.ts` | List pending (queued) multisig transactions |

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 60)May include surrounding context.

md
| `list-pending.ts` | List pending (queued) multisig transactions |

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 31)May include surrounding context.

md
| `safe_txs_list.ts` | List all multisig transactions (queued + executed) |

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 32)May include surrounding context.

md
| `propose-tx.ts` | Create + propose a multisig tx |

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 70)May include surrounding context.

md
| `propose-tx.ts` | Create + propose a multisig tx |

Known Vulnerable Dependency: nanoid==3.3.11 — 3 advisory(ies): CVE-2026-67214 (nanoid: non-secure generators can loop indefinitely with negative size); CVE-2026-67213 (nanoid: custom generators can loop indefinitely when size is zero); CVE-2026-73086 (nanoid: Integer Overflow or Wraparound)

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: picomatch==4.0.3 — 2 advisory(ies): CVE-2026-33672 (Picomatch: Method Injection in POSIX Character Classes causes incorrect Glob Mat); CVE-2026-33671 (Picomatch has a ReDoS vulnerability via extglob quantifiers)

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: postcss==8.5.6 — 4 advisory(ies): CVE-2026-45623 (PostCSS: Arbitrary file read and information disclosure via attacker-controlled ); CVE-2026-69153 (PostCSS: incomplete fix of GHSA-6g55-p6wh-862q — attacker-controlled sourceMappi); CVE-2026-41305 (PostCSS has XSS via Unescaped </style> in its CSS Stringify Output) +1 more

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: rollup==4.57.1 — 1 advisory(ies): CVE-2026-27606 (Rollup 4 has Arbitrary File Write via Path Traversal)

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: ws==8.18.3 — 2 advisory(ies): CVE-2026-45736 (ws: Uninitialized memory disclosure); CVE-2026-48779 (ws: Memory exhaustion DoS from tiny fragments and data chunks)

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: vite==7.3.1 — 5 advisory(ies): CVE-2026-39365 (Vite Vulnerable to Path Traversal in Optimized Deps `.map` Handling); CVE-2026-53571 (vite: `server.fs.deny` bypass on Windows alternate paths); CVE-2026-39363 (Vite Vulnerable to Arbitrary File Read via Vite Dev Server WebSocket) +2 more

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: ws==8.17.1 — 2 advisory(ies): CVE-2026-45736 (ws: Uninitialized memory disclosure); CVE-2026-48779 (ws: Memory exhaustion DoS from tiny fragments and data chunks)

High
Category
Supply Chain
Confidence
80% confidence
Finding

Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This README documents deployment and on-chain execution flows for a Safe multisig without an explicit, prominent warning that these operations can irreversibly move funds, alter contract state, and incur gas costs. In the context of a wallet-operation skill, omission of such warnings increases the chance of operator error, signing on the wrong chain/Safe/nonce, or unintentionally broadcasting a real transaction rather than a dry run.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill advertises scripts that use shell, network access, and environment variables, including private-key-based signing, but it does not declare any tool scope or permissions boundaries. In an agent setting, missing scope metadata can cause over-broad tool access and make it easier for the skill to trigger sensitive operations or secret exposure without clear policy enforcement.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
87% confidence
Finding

Using npx tsx without pinning an exact package version introduces supply-chain risk because package resolution may fetch unexpected code at runtime. In a wallet-management skill, that risk is amplified because the scripts are intended to run with environment variables like private keys and with network access to blockchain infrastructure.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
87% confidence
Finding

Using npx tsx without pinning an exact package version introduces supply-chain risk because package resolution may fetch unexpected code at runtime. In a wallet-management skill, that risk is amplified because the scripts are intended to run with environment variables like private keys and with network access to blockchain infrastructure.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
87% confidence
Finding

Using npx tsx without pinning an exact package version introduces supply-chain risk because package resolution may fetch unexpected code at runtime. In a wallet-management skill, that risk is amplified because the scripts are intended to run with environment variables like private keys and with network access to blockchain infrastructure.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
87% confidence
Finding

Using npx tsx without pinning an exact package version introduces supply-chain risk because package resolution may fetch unexpected code at runtime. In a wallet-management skill, that risk is amplified because the scripts are intended to run with environment variables like private keys and with network access to blockchain infrastructure.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.env_credential_access

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
scripts/safe_lib.ts:77