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## 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
## 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## 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
## 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
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.

Missing User Warnings

Medium
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.

Natural-Language Policy Violations

Medium
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.

Missing User Warnings

Medium
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.

Natural-Language Policy Violations

Low
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.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"start": "node dist/index.js"
  },
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.27.1",
    "@octokit/rest": "^20.1.1",
    "dotenv": "^16.4.5",
    "zod": "^3.23.8"
Confidence
40% confidence
Finding
Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

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.

Unpinned Dependencies

Low
Category
Supply Chain
Content
},
  "dependencies": {
    "@modelcontextprotocol/sdk": "^1.27.1",
    "@octokit/rest": "^20.1.1",
    "dotenv": "^16.4.5",
    "zod": "^3.23.8"
  },
Confidence
40% confidence
Finding
Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"dependencies": {
    "@modelcontextprotocol/sdk": "^1.27.1",
    "@octokit/rest": "^20.1.1",
    "dotenv": "^16.4.5",
    "zod": "^3.23.8"
  },
  "devDependencies": {
Confidence
40% confidence
Finding
Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"@modelcontextprotocol/sdk": "^1.27.1",
    "@octokit/rest": "^20.1.1",
    "dotenv": "^16.4.5",
    "zod": "^3.23.8"
  },
  "devDependencies": {
    "@types/node": "^20.12.7",
Confidence
40% confidence
Finding
Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

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.

Unpinned Dependencies

Low
Category
Supply Chain
Content
"zod": "^3.23.8"
  },
  "devDependencies": {
    "@types/node": "^20.12.7",
    "typescript": "^5.4.5"
  }
}
Confidence
40% confidence
Finding
Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Unpinned Dependencies

Low
Category
Supply Chain
Content
},
  "devDependencies": {
    "@types/node": "^20.12.7",
    "typescript": "^5.4.5"
  }
}
Confidence
40% confidence
Finding
Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Missing User Warnings

Low
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.

Natural-Language Policy Violations

Low
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.

Static analysis

No suspicious patterns detected.