T09 · Insecure Skill Coding Practices
- Location
server/server.py:82- Finding
Local Skill Data Exposed Through All-Interface Binding and Permissive CORS
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a coherent local skill browser, but it exposes local skill contents too broadly and has unsafe server and launcher behavior that should be reviewed before use.
Review or patch this before installing. At minimum, bind the server to 127.0.0.1, remove wildcard CORS, validate skill IDs against enumerated directories, sanitize rendered Markdown or disable raw HTML, and replace the port-kill behavior with a safe conflict message or verified graceful shutdown.
server/server.py:82Local Skill Data Exposed Through All-Interface Binding and Permissive CORS
server/server.py:43Path Traversal in Skill Detail API
server/index.html:634Stored DOM Cross-Site Scripting Through Unsanitized Markdown
skillsbrowser.sh:7Launcher Forcefully Terminates Unrelated Processes on Port 8765
The declared purpose and implementation evidence do not match: the skill claims a local HTML/Python browser, but analysis indicates undeclared Markdown parsing/rendering and code that does not clearly correspond to the stated UI stack. Such mismatches are risky because hidden or undeclared functionality can mask content injection, unsafe rendering, or other behavior that users and reviewers would not expect from a simple local browser.
The skill-detail endpoint uses user-controlled skill_id directly in os.path.join(SKILL_DIR, skill_id, "SKILL.md") without validation or canonicalization. An attacker can supply path traversal sequences such as ../ to escape the intended skills directory and read arbitrary files named SKILL.md elsewhere on disk, which exceeds the justified capability of a local browser for skills.
The skill metadata declares no tool scope or permission boundaries even though the analyzed package is reported to include file read, network, and shell-capable behavior. Missing explicit scope is dangerous because it prevents reviewers and enforcement layers from understanding or constraining what the skill may do, increasing the risk of unexpected filesystem access, command execution, or local service exposure.
The document declares lang="zh-CN", and the visible UI text throughout the page is Chinese-only, which indicates the skill interface is fixed to a specific language. Under the policy, locale constraints should either be optional for the user or clearly documented as region-specific and justified.
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
className:"string",endsParent:!0,variants:[{begin:/"/,end:/"/,contains:[a]},{
begin:/'/,end:/'/,contains:[a]},{begin:/[^\s"'=<>`]+/}]}]}]};return{
name:"HTML, XML",
aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"],
case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin:/<![a-z]/,
end:/>/,relevance:10,contains:[i,o,s,r,{begin:/\[/,end:/\]/,contains:[{
className:"meta",begin:/<![a-z]/,end:/>/,contains:[i,r,o,s]}]}]
This endpoint serves skill metadata and full skill content from disk over HTTP with no authentication, authorization, or explicit user disclosure that local files are being exposed. In the context of a local skill browser this may seem expected, but it still creates an information exposure surface, especially when combined with network accessibility or embedding of sensitive data inside skill files.
The server binds to 0.0.0.0, making the browser accessible on all network interfaces rather than only the local machine, while automatically opening a browser as if it were a local-only tool. This expands the attack surface to other hosts on the network, making the file-exposure endpoints materially more dangerous in this skill context.
The script indiscriminately identifies any process bound to port 8765 and forcefully terminates it with kill -9 before starting its own server. This can kill unrelated local services, cause data loss or corruption by bypassing graceful shutdown, and creates a denial-of-service condition on the host beyond what is necessary for a simple skill browser.
Using kill -9 through xargs on any PID returned for port 8765 performs an immediate, non-interactive termination with no notice to the user. Because SIGKILL prevents cleanup handlers from running, this can disrupt unrelated applications, lose unsaved state, and make the behavior surprising and unsafe in a local developer environment.
The natural-language comments around the script's core behavior are written only in Chinese, which imposes a specific language without any opt-in or justification. This can violate language/locale policy expectations when the skill is intended for general use by a broader audience.
Line L11 starts python3 server.py in the background, which is a subprocess execution with persistent effects, but the script gives no active output or warning to inform the user that a local server is being launched. The only nearby explanation is a comment in Chinese, which may not function as a clear disclosure for all users of the skill.