T09 · Insecure Skill Coding Practices
- Location
assets/server.py:134- Finding
Directory Traversal in the Logs API Allows Reading Log Files Outside the Workspace
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is mostly coherent for multi-agent coding, but its local dashboard exposes project files and logs too broadly for a sensitive development workspace.
Install only in a dedicated workspace that contains no secrets, tokens, private keys, or unrelated source. Treat the dashboard as a local file viewer for the workspace, keep it bound to localhost, stop it when done, and prefer pinning/vendoring frontend and npx dependencies before using it on sensitive projects.
assets/server.py:134Directory Traversal in the Logs API Allows Reading Log Files Outside the Workspace
assets/server.py:216Unauthenticated Static Handler Exposes All Regular Files in the Project Workspace
assets/dashboard.html:7Dashboard Executes Unpinned Third-Party JavaScript from External CDNs
The declared description frames the skill as a multi-agent coding workflow, but the content also instructs users to deploy a dashboard server, scan project directories, expose APIs, and serve logs and archived project data. This mismatch is security-relevant because users may approve the skill expecting only development orchestration, while it also introduces local service exposure and broad filesystem visibility that can leak sensitive project information.
Referenced artifact was not completely inspected
Dashboard is included in `assets/server.py` and `assets/dashboard.html`.
Referenced artifact was not completely inspected
Dashboard is included in `assets/server.py` and `assets/dashboard.html`.
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.
</head>
<body class="bg-gray-50 min-h-screen">
<div id="app" v-cloak>
<!-- Header -->
<header class="bg-white shadow-sm border-b">
<div class="max-w-7xl mx-auto px-4 py-4">
<div class="flex items-center justify-between">
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.
</div>
</div>
<!-- Pending Request Banner -->
<div v-if="currentProject && currentProject.is_request" class="bg-gradient-to-r from-yellow-500 to-orange-500 rounded-lg shadow-lg p-6 mb-6 text-white">
<div>
<h2 class="text-2xl font-bold">⏳ {{ currentProject.name.replace('[待启动] ', '') }}</h2>
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.
</div>
</div>
<!-- Task List -->
<div v-if="currentProject && !currentProject.is_request" class="bg-white rounded-lg shadow">
<div class="px-4 py-3 border-b border-gray-200">
<h2 class="text-lg font-bold text-gray-900">任务列表</h2>
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.
</div>
</div>
<!-- Progress Info -->
<div v-if="module.progress" class="flex items-center gap-4 text-xs text-gray-500">
<span>迭代:{{ module.progress.review_iterations || 0 }} 轮</span>
<span v-if="module.progress.started_at">
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.
</div>
</div>
<!-- Progress Info -->
<div v-if="module.progress" class="flex items-center gap-4 text-xs text-gray-500">
<span>迭代:{{ module.progress.review_iterations || 0 }} 轮</span>
<span v-if="module.progress.started_at">
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.
<div v-for="(it, index) in module.review_history" :key="index"
class="rounded-lg overflow-hidden border"
:class="getIterationBorderClass(it.status)">
<!-- Header bar -->
<div class="flex items-center justify-between px-3 py-2"
:class="getIterationBgClass(it.status)">
<div class="flex items-center gap-2">
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.
<!-- Detail panel -->
<div v-if="isIterationExpanded(module.module_id, it.iteration)" class="px-3 py-3 bg-white space-y-3">
<!-- Parsed checklist -->
<div v-if="getParsedChecks(it.summary).length > 0">
<p class="text-xs font-medium text-gray-500 mb-1.5">检查项:</p>
<div class="space-y-1">
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.
<div v-for="(line, li) in getNonCheckLines(it.summary)" :key="li">{{ line }}</div>
</div>
<!-- Feedback (only if different from summary) -->
<div v-if="it.feedback && !isSameAsSummary(it.summary, it.feedback)" class="pt-3 border-t border-gray-100">
<p class="text-xs font-medium text-gray-500 mb-1">反馈:</p>
<div class="text-xs text-gray-600 space-y-1 leading-relaxed" v-html="renderMarkdown(it.feedback)"></div>
The skill requests or implies powerful capabilities like file access, session messaging, agent spawning, code execution, and a local HTTP dashboard, but it does not declare an explicit tool scope or permission boundary in the skill manifest. That makes the operational trust model opaque and increases the risk that users or hosting platforms enable broader access than intended, especially for a skill that orchestrates multiple agents and runs project code.
The activation text uses broad triggers like requests for complex software projects, deep coding, or multi-agent collaboration, which can cause the skill to activate in many ordinary development contexts. Because this skill encourages code execution, agent spawning, session communication, and optional local server use, over-broad activation increases the chance of these higher-risk behaviors being invoked unintentionally.
Referencing Playwright through npx playwright without pinning an exact package version creates a supply-chain risk, because execution may resolve to a newer or unexpected package version at runtime. In a skill that already executes arbitrary project code and uses browser automation, an unpinned tool increases exposure to malicious or compromised upstream releases.
The document declares lang="zh-CN", and the visible interface text throughout the page is exclusively in Simplified Chinese. For a general-purpose dashboard, this imposes a specific language/locale without any opt-in, selection mechanism, or documented regional constraint, which matches the language-policy violation criteria.
The dashboard renders agent-controlled Markdown via markdown-it and injects the output with Vue's v-html, which allows untrusted content to become active HTML in the browser. In this skill, review feedback and handoff summaries appear to come from agents/logged project data, so a malicious or compromised agent can inject script gadgets, event handlers, javascript: URLs, or other XSS payloads depending on parser/browser behavior.
A deep-coding skill would reasonably coordinate coding tasks and project state, but running an HTTP server that serves files and exposes logs is an additional capability not mentioned in the manifest. The ability to browse project files and archived JSON over HTTP is broader than the stated multi-agent collaboration role.
The manifest describes a multi-agent development workflow skill focused on orchestration, building, reviewing, and complex project development. This file instead implements a local HTTP dashboard and generic static file server that can return any file under BASE_DIR via /projects/, /archive/, or direct path handling, which is a materially different behavior than the stated coding workflow purpose.
The skill metadata presents this as a coding orchestration workflow, but the rules expand it into launching HTTP services and browser-driven E2E activity. That capability expansion increases attack surface because a user invoking a development helper may unknowingly trigger process creation, network-exposed services, and active browser automation on local artifacts.
The guidance permits starting HTTP servers as part of review even though the skill is described as an orchestrator for collaborative coding. Hidden process-execution behavior is risky because it can expose local files or application content over a network interface and creates capabilities beyond user expectations.
The skill instructs use of npx serve without pinning a package version, which can pull the latest package at execution time. That creates a supply-chain risk and makes behavior non-reproducible; if the upstream package is compromised or changed unexpectedly, the orchestrator or reviewer could execute untrusted code.
The delivery flow requires starting and later killing a web server, which is operational system management outside the declared coding-orchestration scope. This mismatch is dangerous because it grants the skill authority to create long-lived processes and exposed endpoints that users may not anticipate when enabling the skill.
The instructions direct the agent to start a local web server, keep it running, and later kill it, but do not require a prominent user-facing warning or opt-in about process creation and service exposure. That is risky because users may unknowingly expose project content on a port, leave background processes running, or create a reachable local service without informed consent.
This delivery workflow again relies on unpinned npx serve, exposing the system to transient dependency resolution and possible execution of altered upstream code. Because this step occurs during delivery, it may be triggered on real projects and can expose the host to avoidable supply-chain compromise.
The file-level docstring presents this component as an "OpenClaw Harness Dashboard Server," while the manifest claims the skill is a deep-coding multi-agent development system. This documentation indicates a different apparent intent than the skill's declared purpose, suggesting the file belongs to a dashboard/harness utility rather than the described coding workflow itself.