Back to skill

Security audit

Snapbyte Digest API

Security checks for vulnerabilities and agentic risk

Overview

The skill mostly matches its stated Snapbyte digest purpose, but its helper script can send the user's API key to an undocumented, arbitrary base URL if an environment variable is set.

Review this skill before installing. Only use it if you trust Snapbyte with the digest requests and API key, avoid setting SNAPBYTE_BASE_URL unless you fully control the endpoint, and prefer pinned/provenance-checked CLI installation where possible. Treat the optional cron example as persistent automation that will keep using the configured key on a schedule.

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/snapbyte_digest.py:12
Finding

Bearer API Credential Can Be Redirected to an Arbitrary Host

Content
View full analysis
str: base = BASE_URL.rstrip("/") if not query: return f"{base}{path}" filtered = {k: v for k, v in query.items() if v is not None} return f"{base}{path}?{urllib.parse.urlencode(filtered)}" def api_request(path: str, query: dict[str, Any] | None = None) -> Any: api_key = os.environ.get("SNAPBYTE_API_KEY") if not api_key: print("Missing SNAPBYTE_API_KEY", file=sys.stderr) sys.exit(2) request = urllib.request.Request(build_url(path, query), method="GET") request.add_header("Authorization", f"Bearer {api_key}") request.add_header("Accept", "application/json") try: with urllib.request.urlopen(request, timeout=20) as response: ``` ### Technical Analysis The Skill documentation declares `https://api.snapbyte.dev` as the API origin, but the implementation permits the origin to be replaced through the `SNAPBYTE_BASE_URL` environment variable. The code does not validate the resulting URL's scheme, hostname, port, or embedded user information before attaching the bearer credential. Consequently, any process, configuration layer, launcher, or attacker that can influence this environment variable can cause the helper to send `SNAPBYTE_API_KEY` to an unintended server. The override also accepts plaintext HTTP, which can expose the credential through network interception. Sending the bearer token to the genuine Snapbyte endpoint is necessary for the declared functionality. Allowing that token to be sent to arbitrary origins exceeds the minimum privileges required. ### Attack Path 1. An attacker gains the ability to influence the Skill process environment or i ...[truncated 1228 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
references/quickstart.md:5
Finding

Quickstart Installs an Unpinned Global npm Package

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • 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
Findings (4)

Direct Prompt Extraction

High
Category
System Prompt Leakage
Confidence
85% confidence
Finding

Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Content

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

python3 scripts/snapbyte_digest.py items --digest-id dst_abc123 --page 1 --limit 10

text

## Output rules

- Prefer formatted markdown output from script by default.
- If user asks for raw payload, pass `--raw`.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill requires environment access to SNAPBYTE_API_KEY and performs network operations against an external API, but it does not declare an explicit tool scope such as permissions or allowed-tools. That omission weakens least-privilege controls and makes it easier for an agent runtime to grant broader-than-necessary capabilities when handling secrets and outbound requests.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
76% confidence
Finding

This skill is explicitly designed to send user-scoped digest requests and an API bearer token to an external service at api.snapbyte.dev, which constitutes intentional data transmission outside the local environment. In context this is expected behavior, but it still creates a real trust boundary: user data, request parameters, and authentication material are exposed to a third-party API and should be treated as sensitive.

Content

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

md
---
name: snapbyte-digest-api
description: Fetch personalized developer news digests from Snapbyte External API with API-key auth. Use for Hacker News digest, Reddit digest, Lobsters digest, and DEV.to digest workflows.
homepage: https://api.snapbyte.dev/docs
metadata: {"openclaw":{"emoji":"📰","requires":{"bins":["python3","curl"],"env":["SNAPBYTE_API_KEY"]},"primaryEnv":"SNAPBYTE_API_KEY"}}
---

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The text says to set the Snapbyte API key using SNAPBYTE_API_KEY, which implies an environment/config variable of that exact name, but the immediately following JSON example instead uses an apiKey field under the skill entry. This is an active documentation contradiction about the intended configuration method, which can mislead users about how the skill is actually meant to be configured.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.