Back to skill

Security audit

NexSolve AI 需求广场

Security checks for vulnerabilities and agentic risk

Overview

The skill largely does what it advertises, but its GitHub token setup can push users toward granting broader account access than the skill needs.

Install only with a fine-grained GitHub token restricted to zxz0119/NexSolve-AI with Issues read/write permission, not a broad classic repo token. Treat anything submitted through the skill as public, avoid personal or confidential business details in the problem/contact fields, and treat retrieved GitHub issue text as untrusted content that should not override your agent's instructions.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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

Warning
Location
src/index.ts:82
Finding

Untrusted GitHub Issue Content Is Returned Directly to the Agent

Content
View full analysis

Vulnerability Details

File Location: src/index.ts, lines 82-88
Vulnerability Type: Indirect prompt injection through untrusted external content
Risk Level: Medium

ts
server.tool(
  "get_need_detail",
  { id: z.number() },
  async ({ id }: { id: number }) => {
    const octokit = getOctokit();
    const { data } = await octokit.issues.get({
      owner: REPO_OWNER, repo: REPO_NAME, issue_number: id
    });
    return { content: [{ type: "text", text: `Title: ${data.title}\nBody:\n${data.body}` }] };
  }
);

Technical Analysis

The get_need_detail tool retrieves a GitHub issue title and body and returns both verbatim as MCP tool content. GitHub issue content is externally controlled and may contain prompt-like instructions intended to manipulate the consuming Agent.

The tool does not:

  • Verify that the issue has the expected pain-point label.
  • Identify the returned fields as untrusted data.
  • Structure or delimit the content to help preserve the instruction/data boundary.
  • Warn the Agent not to execute instructions embedded in issue titles or bodies.

The accompanying Agent guidance encourages analysis of retrieved issue content but does not establish a trust boundary for that content. The vulnerability is therefore an indirect prompt-injection channel rather than direct local code execution.

Attack Path

  1. An attacker creates or modifies an issue in the target GitHub repository.
  2. The attacker places instruction-like content in the issue title or body, such as requests to ignore prior rules, disclose context, or invoke another available tool.
  3. A user or Agent calls get_need_detail with the attacker-controlled issue ID.
  4. The Skill returns the title and body verbatim in the MCP response.
  5. A susceptible consuming Agent interprets the untrusted issue content as instructions rather than data.
  6. The Agent may invoke tools or disclose information within the ...[truncated 610 chars]
Remediation
View remediation

Remediation Suggestions

  1. Verify that the requested issue has the expected pain-point label before returning it.
  2. Return structured fields rather than one combined free-form text block.
  3. Clearly delimit and identify the title and body as untrusted external data.
  4. Add explicit Agent instructions stating that GitHub content must never override system, developer, user, or Skill instructions.
  5. Require confirmation before taking actions derived from retrieved issue content.
  6. Where supported by the host, apply prompt-injection detection or content isolation to externally retrieved text.
  7. Consider returning only the fields necessary for analysis and limiting maximum field lengths.

T05 · Unauthorized Access and Privilege Escalation

Warning
Location
skill.json:14
Finding

Runtime Metadata Encourages an Overly Broad GitHub Token Scope

Content
View full analysis

Vulnerability Details

File Location: skill.json, lines 14-18
Vulnerability Type: Excessive credential permissions
Risk Level: Medium

json
"configDefinitions": {
  "GITHUB_TOKEN": {
    "type": "string",
    "description": "请输入你的 GitHub Token (需勾选 repo 权限)",
    "required": true
  }
}

The English meaning of the configuration description is: “Enter your GitHub token (repo permission required).”

Technical Analysis

The runtime metadata instructs users to provide a GitHub token with repo permission. For a classic personal access token, repo is broad and can authorize access to unrelated repositories available to the user.

The implementation only performs issue operations against the fixed repository zxz0119/NexSolve-AI. The broader repo scope is therefore unnecessary. This metadata also conflicts with SKILL.md, which more safely recommends a fine-grained token restricted to the single target repository with only Issues read/write permission.

The code does not deliberately use the token against other repositories, and no token exfiltration was identified. The risk is the unnecessarily large blast radius if the Skill process, runtime environment, or one of its dependencies is compromised.

Attack Path

  1. A user follows the skill.json configuration description.
  2. The user creates or supplies a classic GitHub personal access token with broad repo scope.
  3. OpenClaw exposes that token to the Skill process through GITHUB_TOKEN.
  4. A subsequent compromise of the process, runtime, or dependency gains access to the token.
  5. The exposed token can potentially be used against repositories beyond zxz0119/NexSolve-AI, subject to the token owner's GitHub privileges.

Impact Assessment

A compromised broadly scoped token may permit reading or modifying private repositories, source code, issues, pull requests, and other repository resources authorized by the repo scope ...[truncated 229 chars]

Remediation
View remediation

Remediation Suggestions

  1. Replace the repo permission guidance with an explicit requirement for a fine-grained personal access token.
  2. Restrict repository access to zxz0119/NexSolve-AI only.
  3. Grant only the GitHub Issues permissions required by the implementation:
    • Issues: Read and write.
    • All unrelated permissions: No access.
  4. Keep the metadata and SKILL.md permission instructions consistent.
  5. Mark the configuration field as secret or password-like if the Skill metadata format supports protected input.
  6. Document token rotation and immediate revocation procedures in case of suspected exposure.
  7. Consider supporting unauthenticated reads for public issue-listing and detail operations, reserving the write-capable token only for submission.
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 (15)

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
76% confidence
Finding

The agent instructions and required safety message are written as fixed Chinese-language directives, including a mandatory quoted warning phrase. This can amount to a language policy constraint if the skill expects outputs in Chinese without offering the user a language choice or documenting a justified locale restriction.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

This tool transmits user-supplied problem descriptions and optional contact information directly to a public GitHub issue, which can expose personal, confidential, or business-sensitive data. Although the issue body includes 'submission terms,' those terms are embedded in the created GitHub issue rather than presented as an explicit, user-facing consent and warning step before exfiltration occurs.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The manifest presents the skill name and description in Chinese, which imposes a specific language context on users without any opt-in or indication that the skill is intentionally region-specific. The stated behavior mentions bilingual submission support, but the metadata itself does not offer a user language choice or justify the locale constraint.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The tool forwards user-supplied industry, problem, and optional contact information directly into a public GitHub issue, which creates a real privacy and data-disclosure risk. Although the issue body contains submission terms, that notice is embedded in the payload sent to GitHub rather than presented as a user-facing consent or warning before transmission, so users may unknowingly publish sensitive business or personal information.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
71% confidence
Finding

Natural-language elements in the file, including tool comments and the issue title prefix, assume a Chinese locale rather than offering an explicit language choice. Because the policy requires avoiding forced language/locale constraints unless documented or optional, this is a minor locale-policy concern.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

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

json
"start": "node dist/index.js"
  },
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.27.1",
    "@octokit/rest": "^20.1.1",
    "dotenv": "^16.4.5",
    "zod": "^3.23.8"

Unverifiable Dependency: @modelcontextprotocol/sdk has 3 known advisory(ies) (CVE-2026-25536 (@modelcontextprotocol/sdk has cross-client data leak via shared server/transport); CVE-2026-0621 (Anthropic's MCP TypeScript SDK has a ReDoS vulnerability); CVE-2025-66414 (Model Context Protocol (MCP) TypeScript SDK does not enable DNS rebinding protec)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
84% confidence
Finding

The manifest allows a floating @modelcontextprotocol/sdk version and the package has multiple known advisories, including cross-client data leak, ReDoS, and missing DNS rebinding protections in some releases. Because the version is not pinned and no lockfile is provided here, it is impossible to verify that deployments avoid affected versions, creating credible supply-chain and runtime security exposure for an MCP-based skill.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

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

json
},
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.27.1",
    "@octokit/rest": "^20.1.1",
    "dotenv": "^16.4.5",
    "zod": "^3.23.8"
  },

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

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

json
"dependencies": {
    "@modelcontextprotocol/sdk": "^1.27.1",
    "@octokit/rest": "^20.1.1",
    "dotenv": "^16.4.5",
    "zod": "^3.23.8"
  },
  "devDependencies": {

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

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

json
"@modelcontextprotocol/sdk": "^1.27.1",
    "@octokit/rest": "^20.1.1",
    "dotenv": "^16.4.5",
    "zod": "^3.23.8"
  },
  "devDependencies": {
    "@types/node": "^20.12.7",

Unverifiable Dependency: zod has 1 known advisory(ies) (CVE-2023-4316 (Zod denial of service vulnerability)), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
73% confidence
Finding

The manifest permits an unverified zod version while the package has a known DoS advisory in some releases. Without an exact version or lockfile, you cannot confirm whether the installed dependency is patched, so there is a plausible denial-of-service risk if untrusted input is validated using an affected version.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

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

json
"zod": "^3.23.8"
  },
  "devDependencies": {
    "@types/node": "^20.12.7",
    "typescript": "^5.4.5"
  }
}

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

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

json
},
  "devDependencies": {
    "@types/node": "^20.12.7",
    "typescript": "^5.4.5"
  }
}

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

The getOctokit function reads the GITHUB_TOKEN environment variable to authenticate API calls, but there is no nearby comment or user-facing documentation in this file explaining that the skill requires and uses this credential. For safety review purposes, credential access should be disclosed unless it is clearly documented elsewhere.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
76% confidence
Finding

Natural-language strings and descriptions in the tool are presented in a fixed bilingual Chinese/English format, with Chinese-first wording in comments and submission content. If organizational policy requires avoiding forced language defaults without opt-in, this may violate that policy because no user language selection or locale preference is offered.

Content

No source excerpt is available for this finding.