Back to skill

Security audit

Tavily Search Pro

Security checks for vulnerabilities and agentic risk

Overview

This Tavily search skill appears purpose-aligned, but it sends user queries and URLs to an external API and installs an unpinned dependency into the shared Python environment.

Review this before installing if you may search confidential topics or internal URLs: those inputs are sent to Tavily's external service. Prefer using it only with non-sensitive queries, and install the dependency in an isolated virtual environment with a pinned version rather than running the provided system-level pip install path.

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

T08 · Insecure Dependencies

Warning
Location
install.sh:9
Finding

Unpinned Dependency Installed into the System Python Environment

Content
View full analysis

Vulnerability Details

File Location: install.sh:9-15
Vulnerability Type: T08: Insecure Dependencies
Risk Level: Medium

bash
pip install --break-system-packages --quiet tavily-python 2>/dev/null || {
    echo "⚠️  pip install failed, trying without --break-system-packages..."
    pip install --quiet tavily-python 2>/dev/null || {
        echo "❌ Failed to install tavily-python. Install manually: pip install tavily-python"
        exit 1
    }
}

Technical Analysis

The installer retrieves tavily-python without pinning a reviewed version or verifying package integrity with hashes. Consequently, the code installed by this Skill can change after the Skill itself has been audited.

The initial installation attempt also uses --break-system-packages, bypassing Python's externally managed environment protection. This permits pip to modify the shared system Python environment rather than isolating the dependency. Although the dependency is relevant to the declared Tavily functionality, installing an unpinned package into a shared environment exceeds the minimum package-management privileges needed for the Skill.

The same unpinned dependency is declared in SKILL.md:10:

yaml
metadata: {"clawdbot":{"emoji":"🔎","requires":{"env":["TAVILY_API_KEY"]},"primaryEnv":"TAVILY_API_KEY","install":[{"id":"pip","kind":"pip","package":"tavily-python","label":"Install dependencies (pip)"}]}}

Attack Path

  1. An attacker compromises the upstream package publisher account, package distribution process, or package-index resolution path.
  2. The attacker publishes or causes resolution to a malicious or compromised tavily-python release.
  3. A user executes install.sh.
  4. Pip automatically resolves the mutable package name to the affected release because no version or hash is enforced.
  5. Package build or installation hooks execute with the privileges of the user running the installer.

...[truncated 1011 chars]

Remediation
View remediation

Remediation Suggestions

  1. Pin tavily-python to a specifically reviewed version in both install.sh and SKILL.md.
  2. Use a lock file or requirements file with cryptographic hashes, and install with pip install --require-hashes.
  3. Create a dedicated virtual environment for the Skill rather than modifying the shared system Python environment.
  4. Remove --break-system-packages; fail safely with instructions for creating an isolated environment.
  5. Review pinned dependency releases and their transitive dependencies before updates.
  6. Preserve visible pip error output or log it securely so integrity and package-resolution failures can be investigated.

Example hardened approach:

bash
python3 -m venv "$SCRIPT_DIR/.venv"
"$SCRIPT_DIR/.venv/bin/python" -m pip install \
    --require-hashes \
    -r "$SCRIPT_DIR/requirements.lock"

The lock file should specify an exact reviewed version and hashes for every resolved distribution.

Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (4)

Lp1

High
Category
MCP Least Privilege
Confidence
98% confidence
Finding

The skill performs outbound HTTPS requests to api.tavily.com, but that network capability is not covered by declared permissions. Undeclared network access is dangerous because it can exfiltrate user data or retrieved content to external services without governance, auditability, or user consent enforced by the platform.

Content

No source excerpt is available for this finding.

Lp1

High
Category
MCP Least Privilege
Confidence
98% confidence
Finding

The skill performs outbound HTTPS requests to api.tavily.com, but that network capability is not covered by declared permissions. Undeclared network access is dangerous because it can exfiltrate user data or retrieved content to external services without governance, auditability, or user consent enforced by the platform.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill exposes search, extraction, crawling, mapping, and research features backed by an external Tavily API, but the user-facing description does not warn that user-supplied queries, URLs, and potentially sensitive targets will be transmitted to a third-party service. This can lead users to unknowingly disclose confidential prompts, internal URLs, or proprietary research topics outside the local environment, creating a real privacy and data-governance risk.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The skill sends user queries, URLs, crawl targets, and potentially extracted/crawled web content to an external Tavily API, but it does not present a clear user-facing privacy warning at the point of use. In this skill's context, external transmission is core functionality, which makes the behavior expected, but still risky because users may provide sensitive internal URLs, proprietary research prompts, or regulated data without realizing it leaves the local environment.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.