Back to skill

Security audit

hybrids3

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent self-hosted storage skill, but its setup and authentication guidance could expose powerful storage keys if followed for remote deployments.

Install only if you trust the hybrids3 image source and the endpoint you configure. Prefer a pinned image digest, loopback or HTTPS-only access, private buckets for sensitive data, short-lived presigned URLs, bucket-scoped keys instead of the master key, and avoid ?auth= URLs because credentials can leak into logs and history.

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/hybrids3.sh:39
Finding

Bucket and Master Credentials Can Be Transmitted over Plaintext HTTP or Exposed in URL Query Parameters

Content
View full analysis
`, or (for clients that can't set headers) as `?auth=` on the URL. ``` ```bash claude mcp add --transport http hybrids3 "$HYBRIDS3_URL/mcp/" \ --header "Authorization: Bearer $HYBRIDS3_MASTER_KEY" ``` From `references/setup.md`: ```nginx location /storage { proxy_pass http://hybrids3:8080; # NO trailing slash — forwards full path proxy_set_header Host $http_host; # $http_host, NOT $host — keeps the port for SigV4 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } ``` ```markdown Then clients use the prefixed URL: `HYBRIDS3_URL=http://yourdomain/storage`, boto3 `endpoint_url="http://yourdomain/storage"`, MCP `http://yourdomain/storage/mcp/`. ``` ### Technical Analysis The helper constructs an `Authorization: Bearer` header from `HYBRIDS3_KEY` and passes it to `curl` without enforcing HTTPS. Although the default endpoint is loopback-only, `HYBRIDS3_URL` is user ...[truncated 2669 chars]
Remediation
View remediation
` authentication guidance. Require Authorization headers for MCP endpoint authentication. 5. Replace all externally reachable examples with `https://` URLs and document TLS termination at the reverse proxy. 6. Clearly distinguish S3 SigV4 behavior from Bearer authentication: the S3 secret is not directly transmitted, while an HTTP/MCP Bearer key is transmitted and must be protected by TLS. 7. Prefer per-bucket keys over the master key and use the master key only for operations that genuinely require cross-bucket authority. 8. Ensure reverse proxies redact Authorization headers and query strings from logs. Rotate any key previously used in a query parameter or over an untrusted plaintext connection. ]]>

T08 · Insecure Dependencies

Warning
Location
references/setup.md:25
Finding

Installation Instructions Execute an Unpinned Third-Party Container Image

Content
View full analysis
Remediation
View remediation
@sha256:`. 2. Pin `config.example.yaml` to an immutable commit rather than the `master` branch. 3. Publish and verify a SHA-256 checksum for downloaded configuration and release artifacts. 4. Use signed container images and document verification with an appropriate mechanism such as Cosign before execution. 5. Configure automated dependency monitoring to propose digest updates, but require review and testing before changing the pinned digest. 6. Harden the container with `--cap-drop=ALL`, `no-new-privileges`, a read-only root filesystem where supported, resource limits, and narrowly scoped writable mounts. 7. Back up the persistent data volume and rotate all application keys if an untrusted image may have been executed. 8. Document the exact image source, expected publisher identity, release version, digest, and verification commands in the setup guide. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (16)

Lp1

High
Category
MCP Least Privilege
Confidence
75% confidence
Finding

The skill uses 'shell' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.

Content

No source excerpt is available for this finding.

Unsafe Defaults

Medium
Category
Tool Misuse
Confidence
95% confidence
Finding

The documented support for public: true buckets means data can be world-readable to anyone who can reach the service, which can easily expose sensitive files if misconfigured. The risk is amplified because the same document also notes that default port publishing can make the service reachable on the network, so an operator mistake can lead directly to broad data disclosure.

Content

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

md
## Security & safety

- **Public buckets are world-readable.** A bucket with `public: true` serves `GET`/`HEAD`/`LIST` to anyone who can reach the port — no auth at all. Only store data there that's meant to be openly readable; keep sensitive data in a `public: false` bucket.
- **Bind loopback, not all interfaces.** The container listens on `8080`. Publishing it as `-p 8080:8080` / compose `"8080:8080"` makes it reachable from the network by default. Use `-p 127.0.0.1:8080:8080` (loopback) unless remote access is intentionally required, and for real deployments put the service on an internal Docker network behind a reverse proxy instead of exposing the port directly — see [references/setup.md](references/setup.md#quick-install) and [Behind a Reverse Proxy](references/setup.md#behind-a-reverse-proxy).
- **`DELETE`, presigned `PUT`, and MCP `delete_object` are destructive & irreversible.** There's no undo, no versioning, no recycle bin — a deleted object (or one overwritten via `PUT`) is gone. An agent must NEVER call `DELETE` / `delete_object`, or generate/use a presigned `PUT` that overwrites, unless the user explicitly asked for that exact key to be removed or replaced; confirm the specific bucket + key first, never enumerate-then-bulk-delete, and treat bulk cleanup as requiring explicit per-object user confirmation.
- **Bucket keys, master key, and presigned URLs are bearer credentials.** Whoever holds a bucket's private `key` or the `master_key` (or a live presigned URL) can act as that bucket/master until the credential is rotated or the URL expires — there's no per-caller revocation. Never paste these into shared prompts, logs, or presigned URLs handed to untrusted parties beyond the one object they're meant to grant.

Cloud Storage Exfiltration

Medium
Category
Data Exfiltration
Confidence
55% confidence
Finding

Data is uploaded to cloud storage (S3 / GCS / Azure Blob). This may be a legitimate backup or exfiltration to an external bucket. Manual review is recommended.

Content

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

md
config=Config(signature_version="s3v4"),
)

s3.put_object(Bucket="uploads", Key="file.txt", Body=b"hello")
s3.get_object(Bucket="uploads", Key="file.txt")["Body"].read()
s3.head_object(Bucket="uploads", Key="file.txt")
s3.list_objects_v2(Bucket="uploads", Prefix="images/")

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

bash
# upload
curl -X PUT "$HYBRIDS3_URL/uploads/file.txt" \
  -H "Authorization: Bearer $HYBRIDS3_KEY" \
  --data-binary @file.txt

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

bash
# list all buckets — needs the master key
curl "$HYBRIDS3_URL/" -H "Authorization: Bearer $HYBRIDS3_MASTER_KEY"

# a bucket key lists only its own bucket
curl "$HYBRIDS3_URL/" -H "Authorization: Bearer $HYBRIDS3_KEY"

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

bash
# tools/list
curl -s "$HYBRIDS3_URL/mcp/" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

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

export HYBRIDS3_URL=http://localhost:8080 export HYBRIDS3_KEY=

curl -X PUT "$HYBRIDS3_URL/uploads/report.pdf"
-H "Authorization: Bearer $HYBRIDS3_KEY" --data-binary @report.pdf curl -sO "$HYBRIDS3_URL/uploads/report.pdf" # public bucket → no auth on read

text

External Transmission

Medium
Category
Data Exfiltration
Confidence
75% confidence
Finding

The skill encourages generating and handing out presigned PUT URLs that let any holder upload or overwrite a specific object until expiry. If agents generate these for predictable keys or share them too broadly, they can enable unauthorized content injection or replacement without further authentication.

Content

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

you generate it (needs a key); they upload with no credentials

curl -X POST "$HYBRIDS3_URL/presign/uploads/inbox/theirs.zip?method=PUT&expires=600"
-H "Authorization: Bearer $HYBRIDS3_KEY" | jq -r .url

→ hand the URL over; recipient: curl -X PUT "" --data-binary @theirs.zip

text

### Drop-in boto3 against your own endpoint

Rp1

Medium
Category
MCP Rug Pull
Confidence
96% confidence
Finding

The documentation runs psyb0t/hybrids3 without a fixed tag or digest, so deployments will pull whatever image is current at execution time. This creates a supply-chain and reproducibility risk: a later image change, compromise, or accidental breaking update could alter the deployed service without any config change by the operator.

Content

No source excerpt is available for this finding.

Unsafe Defaults

Medium
Category
Tool Misuse
Confidence
70% confidence
Finding

Tool defaults are unsafe or overly permissive (e.g. disabled TLS verification, no authentication, world-writable permissions). Unsafe defaults widen the attack surface.

Content

Scanner excerpt · references/setup.md (reported line 62)May include surrounding context.

md
**`"127.0.0.1:8080:8080"` binds loopback-only.** Use `"8080:8080"` only if remote access is intentionally required, matching the fleet convention above. For a real deployment where other hosts or services need to reach it, put hybrids3 on an internal Docker network and front it with a reverse proxy (see [Behind a Reverse Proxy](#behind-a-reverse-proxy)) rather than publishing the port on all interfaces.

**Uploads to a `public: true` bucket are world-readable.** Any bucket with `public: true` serves GET/HEAD/LIST with no authentication at all — anyone who can reach the port can read anything stored there. Don't put sensitive data in a public bucket, and keep the port bound to loopback (or behind an authenticating proxy) unless that's the intended exposure.

## Configuration

Rp1

Medium
Category
MCP Rug Pull
Confidence
75% confidence
Finding

Docker image references without a specific tag (:latest is implicit) or digest (@sha256:...) can be silently replaced by a malicious image.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
95% confidence
Finding

docker pull psyb0t/hybrids3 fetches the latest image without a tag or digest, which exposes operators to mutable-image supply-chain risk. An attacker who compromises the registry account or a maintainer who publishes a bad update could cause users to pull and run unexpected code.

Content

No source excerpt is available for this finding.

Session Persistence

Medium
Category
Rogue Agent
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.

Content

Scanner excerpt · references/setup.md (reported line 184)May include surrounding context.

bash
export HYBRIDS3_URL=http://localhost:8080
export HYBRIDS3_KEY=<bucket-private-key>        # only if you'll write / read private buckets
export HYBRIDS3_MASTER_KEY=<master-key>         # only for cross-bucket / list-all

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The request() documentation says non-2xx responses print the body to stderr and return EXIT_HTTP_FAIL, implying a consistent HTTP-failure contract. However, cmd_get's out-file path at L117-L123 bypasses request(), deletes the output file, and calls die, which exits with the usage-error code instead of EXIT_HTTP_FAIL and does not print the server response body. This is an active contradiction in documented behavior, not mere incompleteness.

Content

No source excerpt is available for this finding.

Lp4

Low
Category
MCP Least Privilege
Confidence
65% confidence
Finding

Declared permissions with no matching code capability may indicate removed functionality or pre-staging for future abuse.

Content

No source excerpt is available for this finding.

Lp4

Low
Category
MCP Least Privilege
Confidence
65% confidence
Finding

Declared permissions with no matching code capability may indicate removed functionality or pre-staging for future abuse.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.exposed_secret_literal

File appears to expose a hardcoded API secret or token.

Critical
Code
suspicious.exposed_secret_literal
Location
SKILL.md:91