Back to skill

Security audit

ProofAI

Security checks for vulnerabilities and agentic risk

Overview

The skill is purpose-aligned, but it can upload full AI prompts and responses to external services and create durable proof records without clear privacy controls or user consent.

Review carefully before installing. Use only with prompts and responses you are authorized to send to ProofAI/Supabase-backed services and to include in durable proof records. Do not submit secrets, regulated personal data, confidential source code, contracts, or customer data unless your organization has approved the service, retention terms, and blockchain anchoring model. Pin the npm package version, avoid unreviewed npx -y execution, and do not set PROOFAI_API_URL to an untrusted endpoint.

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 (3)

T09 · Insecure Skill Coding Practices

Error
Location
src/index.ts:12
Finding

Raw AI Prompts and Responses Are Transmitted to a Remote Service Without Adequate Privacy Controls

Content
View full analysis

Vulnerability Details

File Location: src/index.ts:12-25, src/index.ts:45-100, and src/index.ts:137-179
Vulnerability Type: Uncontrolled transmission of potentially sensitive AI interaction data
Risk Level: High

Vulnerable Code

ts
async function callAPI(path: string, body: Record<string, unknown>): Promise<unknown> {
  const headers: Record<string, string> = { "Content-Type": "application/json" };
  if (API_KEY.startsWith("pk_live_")) {
    headers["x-api-key"] = API_KEY;
  }
  if (ANON_KEY) {
    headers["Authorization"] = `Bearer ${ANON_KEY}`;
  }

  const res = await fetch(`${API_BASE}/${path}`, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
  });
  if (!res.ok) {
    const text = await res.text();
    throw new Error(`ProofAI API error ${res.status}: ${text}`);
  }
  return res.json();
}

The certification workflow submits the complete prompt and generated response:

ts
const compressed = (await callAPI("compress", {
  prompt,
  options: { compressionLevel: "medium" }
})) as { id: string; compressedDsl: string };

const analysis = (await callAPI("analyze", {
  executionId: execution.id,
  analysisText: execution.output,
})) as {
  id: string;
  cognitiveHash: string;
  metrics: { nodeCount: number; consistencyScore: number };
};

const signature = (await callAPI("sign", {
  executionId: execution.id,
  rawOutput: execution.output,
  modelProvider: execution.metadata.provider,
  modelId: execution.metadata.model,
  modelVersion: "latest",
  modelParameters: { temperature },
  executionMetrics: { tokens: execution.metadata.tokens.total },
  requesterInfo: { source: "mcp-server" },
  timestamps: { request_received: new Date().toISOString() },
})) as { signatureId: string };

const bundle = (await callAPI("bundle", {
  promptId: compressed.id,
  executionId: execution.id,
  analysisI
...[truncated 3584 chars]
Remediation
View remediation

Remediation Suggestions

  1. Clearly disclose, in both README.md and SKILL.md, every category of data sent remotely, the destination, subprocessors, storage location, retention period, and deletion procedure.
  2. Require explicit informed confirmation before transmitting raw prompts or responses, particularly when a tool is invoked automatically by an Agent.
  3. Implement client-side secret detection and configurable redaction for credentials, tokens, personal data, and other sensitive patterns.
  4. Compute evidence hashes and signatures locally where possible, and transmit only cryptographic digests and minimum necessary metadata for blockchain anchoring.
  5. Provide a local-only or hash-only certification mode.
  6. Allow organizations to configure data classification policies that prevent restricted content from being submitted.
  7. Avoid sending the same raw response separately to analysis, signing, and bundling endpoints unless each transmission is strictly necessary.
  8. Add request-size limits and structured validation to reduce unintended bulk disclosure.
  9. Document whether blockchain transactions contain only hashes and ensure that raw prompts and responses can never be placed on a public ledger.

T09 · Insecure Skill Coding Practices

Error
Location
src/index.ts:7
Finding

Configurable API Endpoint Can Receive ProofAI Credentials and Confidential AI Content

Content
View full analysis

Vulnerability Details

File Location: src/index.ts:7-24
Vulnerability Type: Credential and sensitive-data forwarding to an unrestricted destination
Risk Level: High

Vulnerable Code

ts
const API_BASE = process.env.PROOFAI_API_URL ||
  "https://apzgbajvwzykygrxxrwm.supabase.co/functions/v1";
const API_KEY = process.env.PROOFAI_API_KEY || "";
const ANON_KEY = process.env.PROOFAI_ANON_KEY || "";

async function callAPI(path: string, body: Record<string, unknown>): Promise<unknown> {
  const headers: Record<string, string> = { "Content-Type": "application/json" };
  if (API_KEY.startsWith("pk_live_")) {
    headers["x-api-key"] = API_KEY;
  }
  if (ANON_KEY) {
    headers["Authorization"] = `Bearer ${ANON_KEY}`;
  }

  const res = await fetch(`${API_BASE}/${path}`, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
  });
  if (!res.ok) {
    const text = await res.text();
    throw new Error(`ProofAI API error ${res.status}: ${text}`);
  }
  return res.json();
}

Technical Analysis

PROOFAI_API_URL can replace the trusted service URL with an arbitrary destination. The implementation does not enforce HTTPS, validate the destination hostname, restrict ports, reject embedded URL credentials, or establish an allowlist of trusted origins.

The same generic request function automatically attaches PROOFAI_API_KEY and PROOFAI_ANON_KEY to requests sent to the selected endpoint. Request bodies may also contain complete prompts and responses. Therefore, control of the process environment or MCP launch configuration is sufficient to redirect both authentication material and sensitive user data.

Environment-based endpoint selection can be legitimate for development or self-hosting, but production credentials should not be forwarded automatically to an arbitrary custom origin. Custom endpoints should use separate credentials and require explic ...[truncated 1697 chars]

Remediation
View remediation

Remediation Suggestions

  1. Enforce HTTPS for every production API request.
  2. Allow production credentials to be sent only to an explicit allowlist of trusted hostnames and expected ports.
  3. Parse the endpoint with the standard URL class and reject malformed URLs, embedded usernames or passwords, fragments, unsupported schemes, unexpected ports, and local or link-local destinations.
  4. Disable cross-origin redirects or verify that every redirect target remains on the approved origin.
  5. Do not attach ProofAI production credentials when PROOFAI_API_URL points to a custom origin.
  6. Require separate, endpoint-specific credentials for development or self-hosted deployments.
  7. Emit a clear startup warning and require explicit opt-in when a non-default endpoint is configured.
  8. Consider certificate pinning or other service-identity controls where the deployment threat model warrants it.
  9. Use narrowly scoped, revocable, short-lived credentials so that endpoint redirection has limited impact.
  10. Add automated tests confirming that credentials cannot be forwarded to HTTP, localhost, link-local, or unapproved external endpoints.

T08 · Insecure Dependencies

Warning
Location
SKILL.md:48
Finding

Documentation Recommends Unpinned Automatic Package Download and Execution

Content
View full analysis

Vulnerability Details

File Location: SKILL.md:48-55
Vulnerability Type: Unpinned package execution and supply-chain exposure
Risk Level: Medium

Vulnerable Code

json
{
  "mcpServers": {
    "proofai": {
      "command": "npx",
      "args": ["-y", "@proofai/mcp-server"],
      "env": {
        "PROOFAI_API_KEY": "pk_live_xxx",
        "PROOFAI_ANON_KEY": "your-supabase-anon-key"
      }
    }
  }
}

Technical Analysis

The recommended configuration invokes npx with -y and a package name that has no exact version. This allows the package resolver to download and execute a package release that may differ from the artifact reviewed during this audit.

The -y option suppresses interactive confirmation. Consequently, a future malicious release, compromised maintainer account, registry compromise, or other package supply-chain event could cause unreviewed JavaScript to run automatically when the MCP server starts.

The inspected package-lock.json resolves dependencies from the standard npm registry and no malicious dependency source was identified in the reviewed artifact. The risk arises from the deployment guidance bypassing a fixed, reviewed artifact rather than from a confirmed malicious package currently present in the lockfile.

Attack Path

  1. A user copies the recommended MCP configuration.
  2. A malicious or compromised version of @proofai/mcp-server is published under the same package name.
  3. The MCP client starts the configured server.
  4. npx -y resolves and downloads the unpinned package without interactive approval.
  5. The downloaded package executes with the permissions of the user running the MCP client.
  6. Malicious package code can access resources available to that user and any environment variables supplied to the MCP process, including the ProofAI credentials shown in the configuration.

Impact Assessment

A compromised package could e ...[truncated 491 chars]

Remediation
View remediation

Remediation Suggestions

  1. Pin the package to an exact reviewed version, such as @proofai/mcp-server@1.0.0, rather than relying on an unversioned package reference.
  2. Prefer installation through a committed lockfile and execute the verified local binary.
  3. Avoid npx -y for persistent, security-sensitive MCP server configuration.
  4. Verify package integrity using npm lockfile integrity hashes, package signatures, provenance attestations, or an organizational artifact registry.
  5. Review dependency changes before upgrading and use automated supply-chain scanning.
  6. Run the MCP server with minimal filesystem, environment, and network permissions.
  7. Pass only the environment variables required by the process and use narrowly scoped credentials.
  8. Publish reproducible build instructions so users can confirm that the distributed executable matches the reviewed source.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
Findings (18)

Known Vulnerable Dependency: fast-uri==3.1.0 — 7 advisory(ies): CVE-2026-13676 (fast-uri vulnerable to host confusion via failed IDN canonicalization); CVE-2026-18446 (fast-uri vulnerable to host confusion via backslash authority introducer); CVE-2026-75975 (fast-uri vulnerable to server-side request forgery via malformed IPv6 normalizat) +4 more

High
Category
Supply Chain
Confidence
89% confidence
Finding

fast-uri 3.1.0 is reported with multiple high-severity URI parsing issues including host confusion and SSRF-relevant normalization flaws. URI parser inconsistencies are dangerous in server software because they can undermine allowlists, origin checks, and outbound request protections if the library is used for validation or routing decisions.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: hono==4.12.9 — 16 advisory(ies): CVE-2026-56762 (Hono missing validation of cookie name on write path in setCookie()); CVE-2026-47676 (Hono: app.mount() strips mount prefix using undecoded path, causing incorrect ro); CVE-2026-47675 (Hono: Cookie helper does not sanitize sameSite and priority, allowing Set-Cookie) +13 more

High
Category
Supply Chain
Confidence
93% confidence
Finding

hono 4.12.9 is a known vulnerable version with numerous advisories affecting cookie handling, routing, and path processing. In an MCP server context, a vulnerable web framework increases risk because request parsing and routing are part of the attack surface exposed to remote clients.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: ip-address==10.1.0 — 2 advisory(ies): CVE-2026-69192 (ip-address: Address4 decodes leading-zero octets as decimal while resolvers deco); CVE-2026-42338 (ip-address has XSS in Address6 HTML-emitting methods)

High
Category
Supply Chain
Confidence
84% confidence
Finding

ip-address 10.1.0 has advisories for leading-zero parsing ambiguity and XSS in HTML-emitting methods. The parsing ambiguity is the more relevant server-side issue because inconsistent IP normalization can break access controls, rate limiting, or SSRF protections if this library is used to classify client or target addresses.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The README shows long-lived API keys placed in a local config example but does not warn users to protect those credentials or avoid committing them to source control. This can normalize insecure handling of secrets and increase the likelihood of credential leakage through dotfiles, screenshots, shared configs, or repositories.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The README encourages use of proofai_certify and proofai_log on user analyses, prompts, and responses without warning that this content may be transmitted to an external service. In a coding and compliance workflow, users may submit sensitive contract text, proprietary source code, or regulated data, creating a real risk of unintended data disclosure.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill explicitly states that it signs prompts/responses, sends data to external services, and anchors hashes/evidence to Polygon, but the usage description does not present a prominent privacy and data-disclosure warning to the end user at the point of tool use. This can lead users to submit sensitive prompts, model outputs, or regulated data without understanding that metadata or derived evidence may be transmitted off-platform and partially made publicly verifiable on-chain.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The proofai_certify workflow sends the user's prompt and the model's generated response to a remote API for compression, execution, analysis, signing, bundling, anchoring, and verification, but this file provides no explicit user-facing notice or consent gate before transmitting that potentially sensitive content off-host. In an MCP/server skill context, users may reasonably assume local handling unless clearly told otherwise, so prompts can unintentionally disclose secrets, personal data, or proprietary information to a third party.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The proofai_log workflow uploads both the provided prompt and response to external endpoints for compression, analysis, signing, bundling, and optional anchoring without any explicit warning in code-visible user messaging. Because this path is specifically for logging prior AI interactions, it may capture highly sensitive historical prompts/responses, making silent remote exfiltration more dangerous in privacy- or compliance-sensitive environments.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The tool transmits user prompts and AI responses to a remote third-party API across multiple endpoints, but the tool descriptions and behavior provide no explicit disclosure that potentially sensitive content leaves the local MCP environment. In an agent-tool setting, users may reasonably assume their data is processed locally unless warned, so this creates a real privacy and consent risk rather than a purely informational issue.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The logging flow accepts arbitrary prompt/response content, sends it to remote services, and then creates a signed bundle that is anchored to Polygon, implying durable and potentially irreversible persistence of sensitive material or its derivatives. Because the tool description emphasizes certification and anchoring but does not clearly warn about persistence, users may unknowingly submit confidential, regulated, or personal data into a tamper-evident long-lived record.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: @hono/node-server==1.19.11 — 2 advisory(ies): CVE-2026-39406 (@hono/node-server: Middleware bypass via repeated slashes in serveStatic); GHSA-frvp-7c67-39w9 (Node.js Adapter for Hono: Path traversal in `serve-static` on Windows via encode)

Low
Category
Supply Chain
Confidence
91% confidence
Finding

The lockfile pins @hono/node-server 1.19.11, and the listed advisories describe concrete path-handling flaws such as middleware bypass on repeated slashes and Windows path traversal in serve-static. Even though this file alone does not prove the vulnerable code paths are exercised, including a known vulnerable version in a server package is a real supply-chain risk because the dependency is transitively brought in by the MCP SDK.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: body-parser==2.2.2 — 1 advisory(ies): CVE-2026-12590 (body-parser vulnerable to denial of service when invalid limit value silently di)

Low
Category
Supply Chain
Confidence
78% confidence
Finding

body-parser 2.2.2 is flagged for a denial-of-service issue around invalid limit handling. This is a genuine vulnerable dependency finding, although the practical impact depends on whether request body parsing is exposed to untrusted clients through the deployed service.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: qs==6.15.0 — 3 advisory(ies): CVE-2026-82417 (qs: Denial of Service via Attacker Controlled isBuffer); CVE-2026-8723 (qs has a remotely triggerable DoS: qs.stringify crashes with TypeError on null/u); CVE-2026-82562 (qs array-limit bypass via bracket-key comma parsing)

Low
Category
Supply Chain
Confidence
79% confidence
Finding

qs 6.15.0 is flagged for several denial-of-service and parsing-bypass issues. This is a valid vulnerable dependency finding, but impact is limited unless the application accepts attacker-controlled query strings or relies on qs parsing limits for security decisions.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
94% confidence
Finding

The dependency uses a caret range (^1.0.0), which permits automatic installation of newer compatible versions. This increases supply-chain risk because a compromised or vulnerable upstream release could be pulled into builds without explicit review or lockstep version control.

Content

Scanner excerpt · package.json (reported line 16)May include surrounding context.

json
"author": "HIRAM",
  "license": "MIT",
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.0.0",
    "zod": "^4.3.6"
  },
  "devDependencies": {

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
94% confidence
Finding

The zod dependency is specified with a caret range, allowing future package versions to be resolved implicitly. In an MCP server context, dependency drift can introduce unexpected behavior or vulnerable code into tooling that may process sensitive user inputs.

Content

Scanner excerpt · package.json (reported line 17)May include surrounding context.

json
"license": "MIT",
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.0.0",
    "zod": "^4.3.6"
  },
  "devDependencies": {
    "@types/node": "^22.0.0",

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
88% confidence
Finding

The development dependency @types/node is also unpinned, which can affect build reproducibility and may introduce breakage or malicious upstream content during development environments. Although devDependencies are generally less exposed at runtime, they still participate in the software supply chain.

Content

Scanner excerpt · package.json (reported line 20)May include surrounding context.

json
"zod": "^4.3.6"
  },
  "devDependencies": {
    "@types/node": "^22.0.0",
    "typescript": "^5.8.0"
  }
}

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
90% confidence
Finding

The TypeScript devDependency is specified with a caret range, allowing compiler changes to enter builds without explicit approval. This can affect build integrity and, in the worst case, expose the project to supply-chain compromise through a malicious or vulnerable release.

Content

Scanner excerpt · package.json (reported line 21)May include surrounding context.

json
},
  "devDependencies": {
    "@types/node": "^22.0.0",
    "typescript": "^5.8.0"
  }
}

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The file reads API credentials from environment variables and attaches them to outbound requests, but there is no user-facing disclosure in code comments, prompts, or runtime output about this authenticated external communication. This matters because the skill uses secret-backed network access while presenting tool behavior primarily in functional terms.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.env_credential_access

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
dist/index.js:7

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
src/index.ts:7