T09 · Insecure Skill Coding Practices
- Location
assets/server.py:231- Finding
Unrestricted Workspace File Disclosure Through Static File Handler
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill’s multi-agent coding workflow is mostly coherent, but its local dashboard can expose workspace files and logs more broadly than users are likely to expect.
Install only in an isolated project workspace with no secrets, credentials, private keys, sensitive logs, or unrelated source files. Do not expose the dashboard beyond localhost. Prefer a container or VM for untrusted generated code, and consider fixing the dashboard to serve only explicit public assets, validate project IDs, sanitize rendered markdown, and bundle or integrity-pin browser dependencies before regular use.
assets/server.py:231Unrestricted Workspace File Disclosure Through Static File Handler
assets/server.py:132Directory Traversal in Project Logs API
assets/dashboard.html:7Execution of Mutable Third-Party JavaScript Without Integrity Verification
The skill description emphasizes multi-agent coding orchestration, but the actual behavior also includes running a local HTTP server, scanning directories, parsing logs, and exposing project and archived data through dashboard endpoints. This mismatch is dangerous because operators may grant trust or permissions based on the narrower description, while the real behavior materially expands the attack surface to local data exposure and unintended information disclosure.
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, process execution, agent spawning, and local networking, but it does not declare an explicit tool scope or permissions boundary in the skill metadata. This increases the chance of over-privileged execution, unclear operator expectations, and accidental exposure of local files or services when the dashboard and orchestration workflow are used.
Referencing Playwright via npx playwright without pinning a specific version introduces supply-chain and reproducibility risk, because the resolved package version may change over time or differ across environments. In a workflow that executes code and browser automation, an unexpected dependency version can alter behavior or introduce malicious or vulnerable transitive code.
The document declares lang="zh-CN", and the visible UI strings throughout the page are in Chinese, which enforces a specific language/locale experience. There is no visible language selector, opt-in, or documentation in this file explaining that the dashboard is intentionally region-specific.
The dashboard renders agent-supplied markdown using markdown-it and injects the rendered result with Vue's v-html. If agent feedback or handoff content contains raw HTML or dangerous links/events, this can become stored XSS in a monitoring UI that is expected to display untrusted agent output, allowing script execution in the viewer's browser and possible access to same-origin data or privileged actions.
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.
These instructions expand the orchestrator from coordination into active environment manipulation by starting HTTP servers, checking localhost reachability, keeping services running, and killing processes later. That increases the skill's operational privileges and attack surface: a coordination agent handling untrusted project content should not also manage long-lived processes and network-exposed services unless tightly sandboxed and explicitly authorized.
The delivery workflow explicitly keys off Chinese phrases like "可以", "有问题", and "需要改" as user responses, alongside a small set of English terms. This imposes a language/locale expectation in the skill logic without stating that the skill is China-specific or giving the user an explicit language choice.
The server prepends the fixed Chinese label "[待启动]" to request-backed project names, which imposes a specific language in the UI regardless of user preference. This is a natural-language locale choice rather than a technical necessity, and the file does not offer a language selection or document a justified region-specific constraint.
The general logging section mandates filenames in the format agent-{role}-{module-id}-{timestamp}.log, but the sub-agent prompt templates later instruct Builders and Reviewers to use fixed names like logs/builder-{module_id}.log and logs/reviewer-{module_id}.log without timestamps. This is an active contradiction in the file's own operational guidance, creating ambiguity about what sub-agents are actually supposed to do.
No suspicious patterns detected.