Back to skill

Security audit

Make PDF safe

Security checks for vulnerabilities and agentic risk

Overview

The skill is coherent and disclosed as cloud PDF processing, but it needs Review because an unvalidated endpoint override could send both PDFs and the API key to an unintended server.

Review this before installing. Use it only for PDFs you are comfortable sending to the Cross-Service-Solutions API, and avoid confidential or regulated documents unless that provider is approved for your use case. Prefer SOLUTIONS_API_KEY over --api-key, do not set --base-url or SOLUTIONS_BASE_URL unless you fully trust the exact HTTPS endpoint, and ask the publisher to remove or strictly validate endpoint overrides, add explicit upload confirmation, and pin dependencies.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/make-pdf-safe.py:187
Finding

Arbitrary API Endpoint Override Exposes PDF Content and Bearer Credentials

Content
View full analysis
Dict[str, str]: return {"Authorization": f"Bearer {api_key}"} ``` ```python url = base_url.rstrip("/") + CREATE_PATH headers = make_headers(api_key) with open(pdf_path, "rb") as f: files = {"file": (os.path.basename(pdf_path), f, "application/pdf")} resp = requests.post(url, headers=headers, files=files, timeout=timeout_s) ``` ```python url = base_url.rstrip("/") + f"/api/{job_id}" headers = make_headers(api_key) resp = requests.get(url, headers=headers, timeout=timeout_s) ``` ```python ap.add_argument( "--base-url", default=os.getenv("SOLUTIONS_BASE_URL", DEFAULT_BASE_URL), help="Base URL override", ) ``` ### Technical Analysis The script permits the API destination to be overridden through either the `--base-url` argument or the `SOLUTIONS_BASE_URL` environment variable. It does not validate the URL scheme, hostname, port, or path before attaching the Bearer credential and uploading the complete PDF. The declared functionality only requires communication with the documented Solutions API host. Allowing an unrestricted destination therefore exceeds the minimum network privilege necessary for the Skill. An attacker who can influence command arguments, environment variables, a wrapper script, or deployment configuration can redirect requests to an attacker-controlled endpoint. That endpoint receives: - The complete PDF document in a multipart upload. - The Solutions API Bearer credential in the `Authorization` header. - Subsequen ...[truncated 1579 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/make-pdf-safe.py:185
Finding

API Key Can Be Exposed Through Command-Line Arguments

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

Lp1

High
Category
MCP Least Privilege
Confidence
96% confidence
Finding

The code has active network capability via requests.post and requests.get, yet the finding indicates that network use is not covered by declared permissions. In an agent skill, undeclared network access is dangerous because it enables silent transmission of user files and metadata to remote systems outside expected policy enforcement.

Content

No source excerpt is available for this finding.

Lp1

High
Category
MCP Least Privilege
Confidence
96% confidence
Finding

The code has active network capability via requests.post and requests.get, yet the finding indicates that network use is not covered by declared permissions. In an agent skill, undeclared network access is dangerous because it enables silent transmission of user files and metadata to remote systems outside expected policy enforcement.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
96% confidence
Finding

The skill explicitly requires uploading the user's PDF to an external third-party API, which is a real data exfiltration/privacy risk because PDFs often contain sensitive business or personal information. In this context the transmission is core functionality rather than covert malware behavior, but it is still dangerous because the document leaves the local trust boundary and is processed by a remote service outside the user's control.

Content

Scanner excerpt · README.md (reported line 30)May include surrounding context.

md
## How it works
1) Upload PDF to:
   `POST https://api.xss-cross-service-solutions.com/solutions/solutions/api/41`
2) Poll:
   `GET  https://api.xss-cross-service-solutions.com/solutions/solutions/api/<job_id>`
3) Return `output.files[0].path` as the download URL

External Transmission

Medium
Category
Data Exfiltration
Confidence
95% confidence
Finding

Polling the external API and returning output.files[0].path continues the same external-service trust issue: the workflow depends on a remote system for document handling and then returns a remote download URL, which may expose users to unvetted storage locations or leaked access URLs. This is especially sensitive because the skill markets the output as 'safe,' which could cause users to upload confidential PDFs with reduced skepticism.

Content

Scanner excerpt · README.md (reported line 32)May include surrounding context.

md
1) Upload PDF to:
   `POST https://api.xss-cross-service-solutions.com/solutions/solutions/api/41`
2) Poll:
   `GET  https://api.xss-cross-service-solutions.com/solutions/solutions/api/<job_id>`
3) Return `output.files[0].path` as the download URL

## Script (CLI)

External Transmission

Medium
Category
Data Exfiltration
Confidence
91% confidence
Finding

The skill is explicitly designed to upload user-supplied PDFs to an external third-party API, which is a real data exfiltration boundary and creates confidentiality, privacy, and compliance risk for potentially sensitive documents. Although this transmission is central to the skill’s stated purpose and appears disclosed rather than covert, sending documents off-platform is still security-relevant because users may assume a 'make safe' operation is local or inherently trustworthy.

Content

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

md
## API endpoints
Base URL:
- `https://api.xss-cross-service-solutions.com/solutions/solutions`

Create make-safe job:
- `POST /api/41`

External Transmission

Medium
Category
Data Exfiltration
Confidence
88% confidence
Finding

The hardcoded external endpoint shows that the skill transmits data to an internet-hosted service. In this skill's context, external transmission is core functionality, but it still materially increases risk because the uploaded document and resulting download URL depend on a third-party service and because the base URL can be overridden to alternate destinations.

Content

Scanner excerpt · scripts/make-pdf-safe.py (reported line 30)May include surrounding context.

python
import requests


DEFAULT_BASE_URL = "https://api.xss-cross-service-solutions.com/solutions/solutions"
CREATE_PATH = "/api/41"

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script uploads the user's PDF to a remote API during normal operation, but it does not present an explicit runtime warning or consent step at the point of execution. This is risky because PDFs can contain sensitive business or personal information, and users may assume 'safe' processing is local when it is actually sent to a third party.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
97% confidence
Finding

The dependency is specified as requests>=2.32.0, which allows future releases to be installed without review and prevents reproducible builds. In a security-sensitive skill that uploads user-provided PDFs to a remote API, this increases supply-chain risk and makes it harder to ensure the installed version is not affected by newly introduced vulnerabilities or breaking security changes.

Content

Scanner excerpt · requirements.txt (reported line 1)May include surrounding context.

text
requests>=2.32.0

Unverifiable Dependency: requests has 16 known advisory(ies) (CVE-2014-1830 (Exposure of Sensitive Information to an Unauthorized Actor in Requests); CVE-2024-47081 (Requests vulnerable to .netrc credentials leak via malicious URLs); CVE-2024-35195 (Requests `Session` object does not verify requests after making first request wi) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
93% confidence
Finding

Because requests is not pinned, it is impossible to verify from this manifest whether the installed version is affected by known advisories. This skill performs network operations against an external API and likely handles URLs, polling, and possibly authentication, so ambiguity around the exact requests version leaves open the possibility of exposure to known library flaws such as credential leakage or transport/security issues.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.