Back to skill

Security audit

Raysurfer Code Caching

Security checks across malware telemetry and agentic risk

Overview

Raysurfer has a coherent code-caching purpose, but it can send task text and full source files to a third-party service and run remotely retrieved code without enough user control.

Install only if you are comfortable sending task descriptions, workflow metadata, and selected source files to Raysurfer. Avoid using it on private, regulated, customer, or secret-bearing code unless you manually inspect exactly what will be uploaded and understand Raysurfer's retention and sharing model. Treat cached and public snippets as untrusted code and review them before writing or running them.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (26)

Tainted flow: 'req' from open (line 7, file read) → urllib.request.urlopen (network output)

High
Category
Data Flow
Content
}).encode(),
    headers={"Authorization": f"Bearer {os.environ['RAYSURFER_API_KEY']}", "Content-Type": "application/json"},
)
with urllib.request.urlopen(req) as resp:
    print(json.dumps(json.loads(resp.read()), indent=2))
Confidence
96% confidence
Finding
with urllib.request.urlopen(req) as resp:

Lp3

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding
The skill manifest advertises only tools, but the content clearly directs use of environment-backed secrets, outbound network requests, and shell execution. This creates a permission/behavior mismatch that can mislead users and reviewers about the skill's real capabilities, especially because it transmits data to an external service using a bearer token.

Context-Inappropriate Capability

Medium
Confidence
89% confidence
Finding
The skill instructs the agent to run retrieved or newly generated code as part of a caching workflow, even though cache lookup and reuse do not inherently require execution. Running third-party cached code substantially increases the attack surface by turning a retrieval feature into an execution pathway for untrusted code.

Context-Inappropriate Capability

Medium
Confidence
97% confidence
Finding
The upload step sends full file contents from the current project to an external API, which is a clear data exfiltration capability beyond a simple local caching helper. This can expose proprietary source code, embedded secrets, internal paths, or regulated data if the generated file contains sensitive content.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The README explicitly instructs users to upload recently generated code to a remote cache, but it does not warn that uploaded code may contain proprietary source, secrets, credentials, internal URLs, or other sensitive data. In an agent skill context, this is more dangerous because users may invoke upload as part of an automated workflow and unintentionally exfiltrate private code or embedded secrets to a third-party service.

Missing User Warnings

High
Confidence
98% confidence
Finding
The skill directs automatic upload of full generated code to a remote service without a prominent user-facing privacy warning or consent checkpoint. Because code often contains business logic, credentials, tokens, or sensitive implementation details, silent transmission to a third party poses a significant confidentiality risk.

Missing User Warnings

Medium
Confidence
90% confidence
Finding
The search workflow sends task descriptions to an external API and may include enough context to reveal confidential project goals, customer names, vulnerabilities, or internal architecture. The optional inclusion of public snippets also encourages broader remote interaction without first warning the user that their prompts and coding context leave the local environment.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The API reference explicitly instructs clients to upload full file contents to a remote third-party service, which can expose proprietary code, secrets, credentials, or sensitive business logic if users follow the guidance blindly. In an agent skill context, this is especially risky because generated or edited files may contain tokens, internal paths, or customer data, and the documentation provides no warning, consent requirement, redaction guidance, or data-classification limits.

Missing User Warnings

Low
Confidence
85% confidence
Finding
The cache-usage endpoint sends code block identifiers, descriptions, task text, and success/failure metadata to a remote service without warning users that execution context and workflow metadata are being shared externally. While less severe than full source upload, task descriptions and code metadata can still reveal sensitive project details, internal goals, or proprietary implementation context.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The script sends a user-supplied task string to an external service and authenticates with a bearer token from the environment, but provides no disclosure, consent, or data-handling guardrails. In an agent-skill context, task descriptions can contain sensitive prompts, code, file paths, or customer data, so silent transmission to a third party creates a real confidentiality risk.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The script transmits the user's task description to a third-party service and authenticates with an API key, but it provides no disclosure, consent prompt, or data-classification guardrail. In an agent skill context, task prompts may contain proprietary code, secrets, or sensitive operational details, so silent exfiltration to an external vendor creates a real confidentiality risk.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
This script sends user-supplied task text to a third-party service and authenticates with an API key, but it provides no warning, consent flow, or safeguards around what may be transmitted. In an agent-skill context, task descriptions can contain sensitive prompts, internal code context, secrets, or proprietary data, so silent exfiltration to an external API creates a real confidentiality risk.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The code is explicitly designed to transmit local file contents and task metadata to a third-party API, but it provides no in-code warning, consent prompt, or safety gating. In a reusable agent skill, that lack of disclosure increases the risk of silent data exfiltration from prior executions, especially when handling proprietary code or confidential prompts.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The script reads the full contents of a local file and a task description, then silently uploads both to a third-party API. In an agent-skill context, this can exfiltrate source code, secrets embedded in files, or sensitive prompt/task data without meaningful user disclosure or consent at the point of execution.

Missing User Warnings

Low
Confidence
87% confidence
Finding
The script uses an API bearer token from the environment to authenticate a remote upload, but provides no warning that credentials will be used to send local data off-host. This increases the risk of unauthorized or unexpected data sharing under the user's identity/account and reduces transparency around networked behavior.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The script reads an arbitrary local file specified on the command line and transmits its full contents to a remote API, with no validation, redaction, confirmation, or warning about the data leaving the local environment. In an agent-skill context, this is risky because generated code files can contain secrets, proprietary source, prompts, or embedded tokens, and the skill is explicitly designed to upload successful outputs to an external cache.

External Transmission

Medium
Category
Data Exfiltration
Content
task = sys.argv[1] if len(sys.argv) > 1 else "Parse a CSV file and generate a bar chart"
req = urllib.request.Request(
    "https://api.raysurfer.com/api/retrieve/search",
    data=json.dumps({"task": task, "top_k": 5, "min_verdict_score": 0.3}).encode(),
    headers={"Authorization": f"Bearer {os.environ['RAYSURFER_API_KEY']}", "Content-Type": "application/json"},
)
Confidence
84% confidence
Finding
https://api.raysurfer.com/

External Transmission

Medium
Category
Data Exfiltration
Content
#!/usr/bin/env bash
# Search Raysurfer cache. Usage: bash search.sh "task description"
TASK="${1:-Parse a CSV file and generate a bar chart}"
curl -s -X POST https://api.raysurfer.com/api/retrieve/search \
  -H "Authorization: Bearer $RAYSURFER_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"task\": \"$TASK\", \"top_k\": 5, \"min_verdict_score\": 0.3}" | python3 -m json.tool 2>/dev/null
Confidence
94% confidence
Finding
curl -s -X POST https://api.raysurfer.com/api/retrieve/search \ -H "Authorization: Bearer $RAYSURFER_API_KEY" \ -H "Content-Type: application/json" \ -d

External Transmission

Medium
Category
Data Exfiltration
Content
#!/usr/bin/env bash
# Search Raysurfer cache. Usage: bash search.sh "task description"
TASK="${1:-Parse a CSV file and generate a bar chart}"
curl -s -X POST https://api.raysurfer.com/api/retrieve/search \
  -H "Authorization: Bearer $RAYSURFER_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"task\": \"$TASK\", \"top_k\": 5, \"min_verdict_score\": 0.3}" | python3 -m json.tool 2>/dev/null
Confidence
94% confidence
Finding
https://api.raysurfer.com/

External Transmission

Medium
Category
Data Exfiltration
Content
// Search Raysurfer cache. Usage: bun search.ts "task description"
const task = process.argv[2] ?? "Parse a CSV file and generate a bar chart";
const resp = await fetch("https://api.raysurfer.com/api/retrieve/search", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.RAYSURFER_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({ task, top_k: 5, min_verdict_score: 0.3 }),
Confidence
87% confidence
Finding
fetch("https://api.raysurfer.com/api/retrieve/search", { method: "POST"

External Transmission

Medium
Category
Data Exfiltration
Content
// Search Raysurfer cache. Usage: bun search.ts "task description"
const task = process.argv[2] ?? "Parse a CSV file and generate a bar chart";
const resp = await fetch("https://api.raysurfer.com/api/retrieve/search", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.RAYSURFER_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({ task, top_k: 5, min_verdict_score: 0.3 }),
Confidence
87% confidence
Finding
https://api.raysurfer.com/

External Transmission

Medium
Category
Data Exfiltration
Content
task, filepath = sys.argv[1], sys.argv[2]
content = open(filepath).read()
req = urllib.request.Request(
    "https://api.raysurfer.com/api/store/execution-result",
    data=json.dumps({
        "task": task,
        "file_written": {"path": os.path.basename(filepath), "content": content},
Confidence
91% confidence
Finding
https://api.raysurfer.com/

External Transmission

Medium
Category
Data Exfiltration
Content
TASK="${1:?Usage: upload.sh <task> <file>}"
FILE="${2:?Usage: upload.sh <task> <file>}"
CONTENT=$(cat "$FILE" | python3 -c "import sys,json; print(json.dumps(sys.stdin.read()))")
curl -s -X POST https://api.raysurfer.com/api/store/execution-result \
  -H "Authorization: Bearer $RAYSURFER_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"task\": \"$TASK\", \"file_written\": {\"path\": \"$(basename "$FILE")\", \"content\": $CONTENT}, \"succeeded\": true, \"auto_vote\": true}" | python3 -m json.tool 2>/dev/null
Confidence
93% confidence
Finding
curl -s -X POST https://api.raysurfer.com/api/store/execution-result \ -H "Authorization: Bearer $RAYSURFER_API_KEY" \ -H "Content-Type: application/json" \ -d

External Transmission

Medium
Category
Data Exfiltration
Content
TASK="${1:?Usage: upload.sh <task> <file>}"
FILE="${2:?Usage: upload.sh <task> <file>}"
CONTENT=$(cat "$FILE" | python3 -c "import sys,json; print(json.dumps(sys.stdin.read()))")
curl -s -X POST https://api.raysurfer.com/api/store/execution-result \
  -H "Authorization: Bearer $RAYSURFER_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"task\": \"$TASK\", \"file_written\": {\"path\": \"$(basename "$FILE")\", \"content\": $CONTENT}, \"succeeded\": true, \"auto_vote\": true}" | python3 -m json.tool 2>/dev/null
Confidence
93% confidence
Finding
https://api.raysurfer.com/

External Transmission

Medium
Category
Data Exfiltration
Content
const [task, filepath] = [process.argv[2], process.argv[3]];
if (!task || !filepath) { console.error("Usage: bun upload.ts <task> <file>"); process.exit(1); }
const content = readFileSync(filepath, "utf-8");
const resp = await fetch("https://api.raysurfer.com/api/store/execution-result", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.RAYSURFER_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({ task, file_written: { path: basename(filepath), content }, succeeded: true, auto_vote: true }),
Confidence
94% confidence
Finding
fetch("https://api.raysurfer.com/api/store/execution-result", { method: "POST"

VirusTotal

65/65 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

Detected: suspicious.env_credential_access

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
search.ts:5

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
upload.ts:10