T09 · Insecure Skill Coding Practices
- Location
scripts/render-itinerary-map.js:27- Finding
Shell Command Injection Through the Amap API Key
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a disclosed hiking planner, but real code flaws could allow command execution or writing outside the intended trip folder in edge cases.
Review before installing. This skill stores detailed trip, order, media, and GPS data locally and sends map/query data to third-party services. Use a private output directory, avoid importing untrusted GPX/KML/media files, do not expose generated map HTML publicly, and install optional helper skills only from versions and publishers you trust. The shell-command and path-boundary issues should be fixed before use in shared or high-trust environments.
scripts/render-itinerary-map.js:27Shell Command Injection Through the Amap API Key
scripts/hike-planner.js:227Path Traversal Through an Unvalidated Start Date and Derived Trip ID
scripts/hike-planner.js:815Symlink Bypass in Imported File Path Validation
scripts/generate-track-map.py:222Stored HTML Injection in Generated Track Maps
assets/gpx-parser.py:59Unbounded GPX and KML Parsing Enables Resource Exhaustion
SKILL.md:120Unpinned Third-Party Skill Installation Instructions
scripts/generate-track-map.py:272Generated Maps Contact an Undeclared OpenStreetMap Endpoint
Skill manipulates agent memory, state, or stored context. Memory corruption can alter personality, override safety rules, or cause unpredictable behavior.
if (r.startDate) {
const newTripId = generateTripId(trip.destination, r.startDate);
if (newTripId !== tripId) {
delete state.trips[tripId];
trip.tripId = newTripId;
state.trips[newTripId] = trip;
state.activeTripId = newTripId;
The manifest description and primary user-facing instructions are written entirely in Chinese, with no indication that other languages are supported or that the user may choose their preferred language. This creates a locale/language constraint in natural-language behavior without explicit opt-in or justification as a region-specific tool.
The skill instructs users to install or invoke external dependencies via npx clawhub without pinning a specific version. That creates a supply-chain risk: a newer, compromised, or typo-squatted package version could be fetched and executed unexpectedly, especially because the skill also declares execution capability (curl, python3, node) and relies on networked components.
This dependency installation path is unpinned, so the resolved package version may change over time and could deliver malicious code. In this skill's context, that risk is amplified because the installed helper would process sensitive travel data and may have filesystem/network access through the surrounding agent workflow.
Referencing flyai via an unversioned npx clawhub install leaves the installation open to supply-chain compromise or breaking changes. Because this dependency is tied to travel search and API-key-backed network access, compromise could expose itinerary data, credentials, or influence downstream outputs.
Using an unpinned package install for xiaohongshu introduces the same mutable-dependency risk: the code obtained at install time may differ from what was reviewed. Since this plugin may interact with authenticated sessions and external content, a malicious update could steal tokens, exfiltrate data, or manipulate search results.
This manifest provides only a broad descriptive summary and generic keywords such as travel- and route-related terms, but does not define any explicit trigger phrases, scope boundaries, or negative examples. In a manifest file, this can make activation conditions ambiguous and increase the chance of unintended invocation for common travel-related requests.
The user-facing description and several keywords are written in Chinese, but the manifest does not indicate that the skill is region-specific or that users can choose their language/locale. This may violate language or locale policy by implicitly forcing a specific language presentation without opt-in.
This code file contains natural-language text that fixes the interaction language to Chinese in the module docstring and CLI help, which can violate a language/locale policy when no user opt-in or justification is provided. The file does not indicate that the tool is region-specific or offer an alternative language.
Natural-language strings in the parser function and main help output are presented only in Chinese, including errors and usage guidance. Because the file gives no user choice of language and no documented regional constraint, this is a policy-relevant locale restriction.
This markdown file contains natural-language instructions that require Chinese-language output conventions and China-specific sources, such as mandating Chinese quotation marks for poetry and prescribing Wikipedia/web_search/xiaohongshu queries, while not offering any user opt-in or language choice. Under the locale policy rule, forcing a specific language/locale without user choice is a policy concern unless clearly justified as region-specific, which is not stated for all uses of the skill.
The file’s natural-language prompts, errors, notices, and generated content are consistently fixed to Chinese, which forces a specific language/locale on users. The policy allows locale constraints only when clearly documented and justified or when the user is given a choice, neither of which is present in this code file.
This code automatically enumerates saved media files and embeds links to them in the generated trip plan, making imported screenshots/photos part of the exported artifact. Although saveMediaFile has a confirmation prompt, cmdGeneratePlan/renderPlan do not provide any user-facing warning at the point where those files become referenced in the shareable plan output.
The validatePlan docstring says it is used after generation to ensure required sections are present, and the validator explicitly warns when '出行建议' is missing. However, renderPlan never calls renderTravelAdvice and does not add a travel-advice section at all, so the documented/template intent diverges from actual generation behavior.
This code file contains natural-language documentation and CLI output entirely in Chinese, including usage instructions and runtime messages. Because the skill does not offer a user language/locale option or explain that it is intentionally China-specific despite using Amap, it creates a language-policy risk for users who did not opt into Chinese-only interaction.
This markdown file contains only Chinese headings, instructions, and examples, which effectively forces a single language/locale for users. Under the policy, language constraints should either be optional for the user or clearly justified as region-specific.
The generated page hard-codes lang="zh-CN", and the surrounding UI text is also fixed in Chinese. For a general-purpose track-map generator, this imposes a specific language/locale on all users without opt-in or any documented regional requirement.
The header comment documents the skill as having only six primary commands for progressively filling a TripPlan. In reality, the file implements and exports many more operational commands, including file import, configuration, selection, plan generation, archiving, and live status mutation, so the documentation understates and mischaracterizes the skill's interface.
Detected: suspicious.dangerous_exec