T09 · Insecure Skill Coding Practices
- Location
setup.js:27- Finding
Shell Command Injection Through YUKETANG_SECRET
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is a real Rain Classroom connector, but its setup and disclosure around credentials, installation commands, and reporting need careful review before use.
Install only if you intend to give this skill access to your Rain Classroom account, including class, teaching, student-warning, homework, notice, and lesson-reservation workflows. Prefer not to run the included setup scripts until mcporter is pinned, secrets are not passed on command lines, and the silent install report is removed or made opt-in; use a scoped, revocable secret and inspect generated MCP config for plaintext credentials.
setup.js:27Shell Command Injection Through YUKETANG_SECRET
setup.sh:46Unpinned Third-Party Package Execution During Installation
setup.sh:43Bearer Credential Exposed Through Process Arguments
setup.sh:99Undisclosed Silent Installation Telemetry
A second aspect of the same mismatch is that the skill appears to be a teaching-data assistant with authenticated external access, not a harmless test skill. Mislabeling security-relevant behavior makes phishing-style social engineering easier and can hide telemetry, configuration, and network reach from users and platform reviewers.
A second aspect of the same mismatch is that the skill appears to be a teaching-data assistant with authenticated external access, not a harmless test skill. Mislabeling security-relevant behavior makes phishing-style social engineering easier and can hide telemetry, configuration, and network reach from users and platform reviewers.
The file presents itself as a simple summary-related skill, but the actual instructions support authenticated access to teaching, classroom, and student-warning data plus class-management actions such as lesson reservation. This is dangerous because deceptive or incomplete identity in the manifest reduces scrutiny and could trick users into granting access to sensitive educational data.
The skill metadata says it is a 'test for summary', but the referenced documentation enables operational actions like scheduling classes and querying class-specific assignment and announcement data. This capability mismatch can mislead reviewers, users, or policy gates into granting a skill broader privileges than expected, increasing the risk of unauthorized or unexpected actions on educational resources.
The script executes external commands via child_process.execSync to configure tooling, despite the stated skill context not justifying command execution. In a misleading or weakly documented skill, arbitrary subprocess execution materially increases risk because it can run fetched code, alter local configuration, and expose the host environment.
The declared skill purpose is merely 'test for summary', but the code actually requests a secret and registers a remote MCP service. This mismatch is dangerous because it can mislead reviewers and users about the script's real capabilities, reducing informed consent around remote connectivity and credential use.
The skill metadata says it is a summary-related skill, but the setup script actually configures authenticated access to an external YuKeTang MCP service and sends installation telemetry. This mismatch is dangerous because it can mislead users and reviewers into granting secrets and network access under false expectations, reducing informed consent and increasing the chance of unauthorized data exposure.
The skill requests use of an environment secret and setup scripts but does not declare any explicit tool scope or permissions boundary. This creates hidden capability risk: reviewers and users cannot easily tell that the skill depends on sensitive credentials and external setup behavior, increasing the chance of over-trust and unsafe installation.
The skill tells users to store a personal secret in an environment variable but gives no warning about shell history, process inspection, shared environments, CI leakage, or accidental disclosure in logs. Because this secret appears to authenticate access to user and classroom data, poor handling could expose sensitive account access beyond the intended user.
The instruction says all relative time handling must use current system Beijing time as the baseline, which imposes a specific locale/timezone policy. Because the file does not offer the user a choice or clearly justify that the skill is limited to a Beijing-time operational context, this is a natural-language locale policy violation.
The skill recommends running npx mcporter without pinning a version, which can fetch and execute whatever package version is current at install time. This is a supply-chain risk because a compromised or malicious upstream release could execute arbitrary code on the user's machine during setup or operation.
The document is entirely written in Chinese and all prescribed user-facing prompts and examples are Chinese-only, such as the required clarification messages at L026, L031, L073, and L075. This creates a natural-language locale constraint without any stated option for the user to choose another language or opt in to Chinese-only behavior.
The script reads YUKETANG_SECRET for authentication even though the stated skill description does not indicate any need for credentials. This is risky because undisclosed secret collection in a setup flow can normalize credential exposure and cause users to provide sensitive tokens without understanding the purpose.
The bearer token is embedded directly into a subprocess command line via the --header argument. Command-line arguments may be visible to other local processes, shell history, logs, process monitors, or debugging tools, creating a practical credential leakage path even if the script itself does not print the secret.
The script invokes npx mcporter without pinning an exact package version, so execution may fetch and run whatever version is current in the registry at runtime. In a setup script that also handles authentication material and modifies MCP configuration, this creates a supply-chain execution risk if the package is updated maliciously or unexpectedly.
The verification step again runs npx mcporter without a pinned version, which can trigger untrusted code resolution at runtime even though it is only checking configuration. This repeats the same supply-chain exposure and broadens the attack surface during installation.
The script requires YUKETANG_SECRET and uses it to configure an Authorization header for a remote service, even though the declared skill purpose is only 'test for summary'. In this context, collecting and operationalizing a bearer secret is unjustified and increases the risk that users provide sensitive credentials to a skill whose stated purpose does not warrant privileged remote access.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
The script silently reports installation telemetry (claw_report with duration and action) to the remote MCP service without user-facing disclosure or consent. Hidden outbound reporting is dangerous because it normalizes covert network behavior, undermines user trust, and could be expanded to transmit more sensitive data in future revisions with little visibility.
A silent network reporting call that is suppressed with >/dev/null 2>&1 || true prevents the user from seeing that telemetry occurred or failed. This is dangerous because it obscures outbound communication and makes unauthorized or unexpected reporting harder to detect, especially in a setup script that already asks for a bearer secret.
The script's comments and console messages are entirely in Chinese, including the final suggested prompt for interacting with the AI. This imposes a specific language on users without opt-in or any documented locale constraint, which matches the language/locale policy violation criteria.
The script's user-facing messages and final usage instruction are entirely in Chinese, including the suggested phrase the user should say to the AI. The policy requires flagging language/locale constraints when a skill forces a specific language without user opt-in or documented justification.