Back to skill

Security audit

Gemini Tavily Search

Security checks for vulnerabilities and agentic risk

Overview

The skill largely performs the advertised web-search routing, but it should be reviewed because installation is mutable and user queries may be automatically sent to multiple external providers.

Install only from a pinned, reviewed version or commit, preferably as an unprivileged user. Do not send secrets, personal data, internal project names, or regulated information in queries unless you are comfortable sharing them with Gemini/Google and Tavily, including automatic fallback cases.

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
README.md:94
Finding
Unpinned Third-Party Installer and Mutable Skill Source## Vulnerability Details **File Location**: `README.md:94` **Vulnerability Type**: Unpinned third-party dependency execution **Risk Level**: Medium ### Vulnerable Code ```bash npx skills add JoseArroyave/agent-skills --skill gemini-tavily-search ``` ### Technical Analysis The documented installation command invokes the third-party `skills` package through `npx` without specifying a reviewed package version or integrity hash. Depending on the local environment, `npx` can retrieve and execute the currently published package from the configured npm registry. The referenced `JoseArroyave/agent-skills` source is also not pinned to an immutable commit or verified release artifact. Consequently, both the installer and the installed source can change after this project has been audited. This creates a time-of-review versus time-of-installation discrepancy and exposes users to upstream account compromise, malicious package releases, registry compromise, or unauthorized repository changes. No evidence was found that the currently reviewed scripts contain a malicious payload. The issue is the installation process's reliance on mutable, externally controlled components. ### Attack Path 1. An attacker compromises the npm package, its maintainer account, the configured package registry, or the referenced upstream repository. 2. The attacker publishes a modified installer release or replaces the repository content selected by the unpinned reference. 3. A user follows the documented installation command. 4. `npx` downloads and executes the mutable installer package, which then retrieves or installs the mutable Skill content. 5. Attacker-controlled installer code executes with the privileges of the user running the command, or malicious files are placed into the user's Agent Skill environment. 6. The malicious installation may access files and credentials available to that user or affect later Agent runs. ### Impact Assessment Su ...[truncated 492 chars]
Remediation
## Remediation Suggestions - Pin the `skills` npm package to a specific reviewed version rather than allowing `npx` to resolve the latest available release. - Pin `JoseArroyave/agent-skills` to an immutable commit hash or a cryptographically signed release tag. - Publish and verify a checksum or signature for the expected Skill artifact before installation. - Use `npx --no-install` when the installer is expected to be installed and reviewed locally, preventing implicit network retrieval. - Prefer downloading a versioned release artifact, verifying its signature or checksum, inspecting its contents, and then installing it locally. - Document that installation should be performed as an unprivileged user in an isolated environment with only the minimum required filesystem and credential access. - Add automated dependency provenance and integrity verification to the release process.
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
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (17)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
This is a significant integrity and security issue because the documented behavior claims Gemini-based classification, Google grounding, normalization, and controlled fallback, while the implementation reportedly performs only direct Tavily search. Such mismatches can bypass user expectations, policy review, logging assumptions, and privacy/security controls tied to the declared provider flow.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
### Linux (Debian / Ubuntu)

```bash
sudo apt update
sudo apt install curl jq -y
```
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
### Linux (Debian / Ubuntu)

```bash
sudo apt update
sudo apt install curl jq -y
```
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
### Linux (Debian / Ubuntu)

```bash
sudo apt update
sudo apt install curl jq -y
```
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
### Linux (Debian / Ubuntu)

```bash
sudo apt update
sudo apt install curl jq -y
```
Confidence
70% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Rp1

Medium
Category
MCP Rug Pull
Confidence
91% confidence
Finding
The README instructs users to run `npx skills add ...` without pinning a specific package version. This can cause execution of an unexpected or newly published package version at install time, increasing supply-chain risk if the upstream package is compromised or changes behavior.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The README describes sending user queries to Gemini and Tavily but does not prominently warn users that search inputs, and possibly related metadata, are transmitted to third-party providers. In a search skill handling real-time questions, users may unknowingly submit sensitive prompts, creating privacy and data-handling risk.

Lp3

Medium
Category
MCP Least Privilege
Confidence
77% confidence
Finding
The skill advertises behavior that relies on external services and detected shell-capable execution, but it does not declare any explicit tool scope or permission boundaries. Missing scope declarations increase the chance that the runtime grants broader capabilities than intended, making misuse or accidental command execution harder to govern and audit.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The skill is designed to send user queries to third-party search providers, but the user-facing description does not clearly warn about that data disclosure. This can expose sensitive prompts, internal terms, or personal data to external services without informed consent, which is especially risky for a web-search skill handling arbitrary user text.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
2. If web search is NOT required → answer directly via Gemini without tools.
3. If web search IS required → call Gemini with `google_search` tool enabled.
4. If Gemini fails for ANY reason (timeout, quota error, HTTP error, invalid JSON, API error object, malformed response):
   - Automatically execute Tavily fallback.
5. Normalize provider output into unified JSON schema.
6. Always return valid structured JSON.
Confidence
80% confidence
Finding
Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The script sends the user’s query to Gemini for classification and, later, possibly for search/answering, but this script itself provides no explicit user-facing disclosure or consent mechanism before transmitting query contents to a third-party service. Even with basic redaction of emails/phones/key-like strings, arbitrary sensitive text may still be sent externally, creating a privacy and data handling risk.

External Transmission

Medium
Category
Data Exfiltration
Content
local resp_with_code http body curl_code
  set +e
  resp_with_code="$(
      curl -sS --fail-with-body --proto '=https' --tlsv1.2 \
      --connect-timeout 5 --max-time "$timeout" \
      -H "x-goog-api-key: $GEMINI_API_KEY" \
      -H "Content-Type: application/json" \
Confidence
88% confidence
Finding
This curl call transmits the user query to Gemini during the web-necessity classification step, creating an external data exposure path. In this skill’s context, the whole feature is web-enabled, so transmission is expected, but the risk remains because the classifier receives user content before any explicit consent or robust sensitive-data filtering.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
On Gemini failure, the script automatically falls back to Tavily and forwards the query without any explicit user-facing notice that a different external provider will receive the data. This changes the data recipient and trust boundary silently, which is risky for privacy, compliance, and user expectations.

External Transmission

Medium
Category
Data Exfiltration
Content
# Call Gemini with strict timeout, capture both body and HTTP status
set +e
GEMINI_RESP_WITH_CODE="$(
    curl -sS --fail-with-body --proto '=https' --tlsv1.2 \
    --connect-timeout 5 --max-time "$GEMINI_TIMEOUT_SECONDS" \
    -H "x-goog-api-key: $GEMINI_API_KEY" \
    -H "Content-Type: application/json" \
Confidence
90% confidence
Finding
This main Gemini request sends user-supplied query content to an external API, potentially with Google Search grounding enabled, which expands data exposure to web-connected processing. The skill context makes external transmission functionally necessary, but it is still a real privacy/security concern when not paired with explicit disclosure, consent, and strict handling rules for sensitive queries.

External Transmission

Medium
Category
Data Exfiltration
Content
# Call Tavily REST API
RESP="$(
     curl -sS --fail-with-body --proto '=https' --tlsv1.2 \
     --connect-timeout 5 --max-time 25 \
     -X POST "https://api.tavily.com/search" \
     -H "Content-Type: application/json" \
Confidence
70% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
RESP="$(
     curl -sS --fail-with-body --proto '=https' --tlsv1.2 \
     --connect-timeout 5 --max-time 25 \
     -X POST "https://api.tavily.com/search" \
     -H "Content-Type: application/json" \
     -d "$PAYLOAD"
 )"
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Natural-Language Policy Violations

Low
Confidence
81% confidence
Finding
Several comments and natural-language strings in the file are written in Spanish, such as 'heurístico, no perfecto' and 'Decide si la pregunta requiere info actual'. This imposes a language assumption in developer-facing instructions without any explicit language choice or justification for a locale-specific audience.

Static analysis

No suspicious patterns detected.