Back to skill

Security audit

Fleet Embeddings

Security checks for vulnerabilities and agentic risk

Overview

This skill appears to be a coherent guide for using a local Ollama fleet embeddings router, with manageable risks around installing an unpinned Python package and routing text through your device fleet.

Install in a virtual environment, pin or review the `ollama-herd` package before use, do not run install commands with elevated privileges, and only send documents or prompts to the fleet if every node that may process them is trusted. Confirm any model pull or delete action before allowing an agent to run it.

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
SKILL.md:31
Finding
Unpinned Third-Party Package Installation<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, line 31 **Vulnerability Type**: Unpinned dependency installation from a mutable package registry **Risk Level**: Medium ### Vulnerable Code ```bash pip install ollama-herd ``` ### Technical Analysis The installation instruction retrieves `ollama-herd` from PyPI without specifying an audited version or verifying a cryptographic hash. Consequently, the package selected during installation may differ from the version reviewed when this Skill was published. Python packages can execute package-controlled build or installation logic. If the package's publisher account, release process, or distribution channel is compromised, a malicious release could execute code with the privileges of the user running `pip`. The referenced PyPI package and GitHub repository are consistent with the Skill's declared project. No evidence of current package compromise, dependency confusion, or deliberate malicious behavior was found in the audited file. The risk arises from trusting mutable, unverified third-party content. ### Attack Path 1. An attacker compromises the package publisher account, release pipeline, or another component of the package distribution channel. 2. The attacker publishes a malicious or backdoored release under the legitimate `ollama-herd` package name. 3. A user follows the Skill's unpinned `pip install ollama-herd` instruction. 4. `pip` downloads the attacker-controlled release and processes its package metadata, build backend, or installation content. 5. Malicious code executes with the installing user's privileges or is installed for later execution when `herd` or `herd-node` is invoked. ### Impact Assessment Successful exploitation could provide arbitrary code execution under the account that performs the installation. The attacker could potentially access, modify, or delete files available to that account, read application configuration and credentials, make network requests, or alte ...[truncated 574 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin the dependency to a specifically reviewed release: ```bash python3 -m pip install "ollama-herd==1.0.1" ``` 2. Distribute a requirements or lock file containing approved cryptographic hashes, and enforce verification: ```bash python3 -m pip install --require-hashes -r requirements.txt ``` 3. Install the package in a dedicated virtual environment rather than the system Python environment: ```bash python3 -m venv .venv . .venv/bin/activate python3 -m pip install --require-hashes -r requirements.txt ``` 4. Review the selected release, its transitive dependencies, and its package provenance before updating the pinned version. 5. Avoid running installation commands with `sudo`, as root, or from another privileged account unless explicitly required and independently justified. 6. Consider documenting a trusted package index and using controls such as attestations, signed releases, or an internally mirrored and reviewed artifact repository. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (14)

External Script Fetching

High
Category
Supply Chain
Content
### Ollama format (curl)

```bash
curl http://localhost:11435/api/embeddings -d '{
  "model": "nomic-embed-text",
  "prompt": "The fleet manages all inference routing"
}'
Confidence
90% confidence
Finding
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

External Script Fetching

High
Category
Supply Chain
Content
Pull a model if needed:

```bash
curl -X POST http://localhost:11435/dashboard/api/pull \
  -H "Content-Type: application/json" \
  -d '{"model": "nomic-embed-text", "node_id": "your-node-id"}'
```
Confidence
90% confidence
Finding
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

External Script Fetching

High
Category
Supply Chain
Content
```bash
# Fleet health and model recommendations
curl -s http://localhost:11435/dashboard/api/health | python3 -m json.tool

# Per-app usage (see which projects use the most tokens)
curl -s http://localhost:11435/dashboard/api/apps | python3 -m json.tool
Confidence
90% confidence
Finding
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

External Script Fetching

High
Category
Supply Chain
Content
curl -s http://localhost:11435/dashboard/api/health | python3 -m json.tool

# Per-app usage (see which projects use the most tokens)
curl -s http://localhost:11435/dashboard/api/apps | python3 -m json.tool
```

Dashboard at `http://localhost:11435/dashboard` — embedding requests flow through the same queues as LLM requests.
Confidence
90% confidence
Finding
Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Session Persistence

Medium
Category
Rogue Agent
Content
---
name: fleet-embeddings
description: Embeddings with nomic-embed-text, mxbai-embed, and snowflake-arctic-embed across your device fleet. Fleet-routed via Ollama for RAG, semantic search, and vector similarity. Batch embed thousands of documents across nodes instead of bottlenecking on one machine. Use when the user needs to create embeddings, build a knowledge base, or set up semantic search.
version: 1.0.1
homepage: https://github.com/geeks-accelerator/ollama-herd
metadata: {"openclaw":{"emoji":"search","requires":{"anyBins":["curl","wget"],"optionalBins":["python3","pip"]},"configPaths":["~/.fleet-manager/latency.db","~/.fleet-manager/logs/herd.jsonl"],"os":["darwin","linux","windows"]}}
Confidence
60% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

External Transmission

Medium
Category
Data Exfiltration
Content
### Ollama format (curl)

```bash
curl http://localhost:11435/api/embeddings -d '{
  "model": "nomic-embed-text",
  "prompt": "The fleet manages all inference routing"
}'
Confidence
60% 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
import httpx

def embed(text, model="nomic-embed-text"):
    resp = httpx.post(
        "http://localhost:11435/api/embeddings",
        json={"model": model, "prompt": text},
        timeout=30.0,
Confidence
60% 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
import httpx

def embed(text, model="nomic-embed-text"):
    resp = httpx.post(
        "http://localhost:11435/api/embeddings",
        json={"model": model, "prompt": text},
        timeout=30.0,
Confidence
60% 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
import httpx

def embed(text, model="nomic-embed-text"):
    resp = httpx.post(
        "http://localhost:11435/api/embeddings",
        json={"model": model, "prompt": text},
        timeout=30.0,
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Internal Network Request

Medium
Category
Server-Side Request Forgery
Content
import httpx

def embed(text, model="nomic-embed-text"):
    resp = httpx.post(
        "http://localhost:11435/api/embeddings",
        json={"model": model, "prompt": text},
        timeout=30.0,
Confidence
70% confidence
Finding
Code issues a request to a loopback, link-local, or private-range host. This can reach internal services not meant to be exposed and is a common SSRF pivot.

Internal Network Request

Medium
Category
Server-Side Request Forgery
Content
import httpx

def embed(text, model="nomic-embed-text"):
    resp = httpx.post(
        "http://localhost:11435/api/embeddings",
        json={"model": model, "prompt": text},
        timeout=30.0,
Confidence
70% confidence
Finding
Code issues a request to a loopback, link-local, or private-range host. This can reach internal services not meant to be exposed and is a common SSRF pivot.

Internal Network Request

Medium
Category
Server-Side Request Forgery
Content
import httpx

def embed(text, model="nomic-embed-text"):
    resp = httpx.post(
        "http://localhost:11435/api/embeddings",
        json={"model": model, "prompt": text},
        timeout=30.0,
Confidence
70% confidence
Finding
Code issues a request to a loopback, link-local, or private-range host. This can reach internal services not meant to be exposed and is a common SSRF pivot.

External Transmission

Medium
Category
Data Exfiltration
Content
Pull a model if needed:

```bash
curl -X POST http://localhost:11435/dashboard/api/pull \
  -H "Content-Type: application/json" \
  -d '{"model": "nomic-embed-text", "node_id": "your-node-id"}'
```
Confidence
91% confidence
Finding
This example performs a state-changing action by pulling a model onto a specified node through a dashboard API. Even though the skill later says not to pull models without user confirmation, including a ready-to-run mutation endpoint in the main workflow increases the risk that an agent or user triggers resource consumption or unauthorized model deployment on internal nodes.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The skill is advertised as an embeddings-focused capability, but the documentation also instructs on unrelated high-capability operations including chat completions, image generation, speech-to-text, health monitoring, and usage analytics. This scope expansion increases the attack surface and may cause an agent or user to invoke privileged or privacy-sensitive endpoints that were not expected from the skill’s declared purpose.

Static analysis

No suspicious patterns detected.