T09 · Insecure Skill Coding Practices
- Location
dist/index.js:15- Finding
Generated reports may be created with overly permissive filesystem permissions
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is a coherent daily-report generator, but it uses an authenticated browser session to capture and replay dashboard API requests and encourages scheduled runs without strong scoping or privacy safeguards.
Install only for a trusted internal dashboard and use a dedicated browser profile or automation account. Review config.json carefully, keep the dashboard URL and data API same-origin or explicitly approved, protect ~/openclaw-skill-data with restrictive permissions, and avoid enabling the cron job until retention and revocation are clear.
dist/index.js:15Generated reports may be created with overly permissive filesystem permissions
dist/utils/report.js:1API-controlled metric values are inserted into Markdown without escaping
The stated purpose sounds like simple report generation, but the documented workflow includes browser access to a dashboard, capture of XHR payloads from a live session, external API calls, and persistent local file I/O. That mismatch is dangerous because it obscures sensitive behaviors that may rely on user credentials/session context and may exfiltrate or persist internal operational data without sufficiently informed consent.
The stated purpose sounds like simple report generation, but the documented workflow includes browser access to a dashboard, capture of XHR payloads from a live session, external API calls, and persistent local file I/O. That mismatch is dangerous because it obscures sensitive behaviors that may rely on user credentials/session context and may exfiltrate or persist internal operational data without sufficiently informed consent.
The stated purpose sounds like simple report generation, but the documented workflow includes browser access to a dashboard, capture of XHR payloads from a live session, external API calls, and persistent local file I/O. That mismatch is dangerous because it obscures sensitive behaviors that may rely on user credentials/session context and may exfiltrate or persist internal operational data without sufficiently informed consent.
The stated purpose sounds like simple report generation, but the documented workflow includes browser access to a dashboard, capture of XHR payloads from a live session, external API calls, and persistent local file I/O. That mismatch is dangerous because it obscures sensitive behaviors that may rely on user credentials/session context and may exfiltrate or persist internal operational data without sufficiently informed consent.
The stated purpose sounds like simple report generation, but the documented workflow includes browser access to a dashboard, capture of XHR payloads from a live session, external API calls, and persistent local file I/O. That mismatch is dangerous because it obscures sensitive behaviors that may rely on user credentials/session context and may exfiltrate or persist internal operational data without sufficiently informed consent.
Referenced artifact was not completely inspected
node dist/index.js
The README explicitly describes connecting to an existing Chrome session to reuse login state and then intercepting/reporting data, but it does not warn about the privacy and security implications of operating inside an already-authenticated browser context. This can expose unrelated cookies, session tokens, or sensitive in-browser data if the skill is misconfigured, overbroad, or run against untrusted dashboards.
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.
通过 cron 每天自动生成日报:
crontab -e
添加:
The skill documentation declares no explicit tool scope or permission boundaries even though the described behavior clearly involves network access and likely access to authenticated browser/session context. This creates a transparency and governance gap: an agent may invoke networked/browser-capable code without users or policy systems being able to constrain or review those capabilities up front.
The skill description omits prominent warnings that it captures API request payloads from a browser session, calls external APIs, and stores report data locally. In this context, those actions can expose internal endpoints, query structures, tokens/session-derived data, and sensitive team metrics, making the lack of disclosure materially risky for informed consent and safe deployment.
The invocation phrases are broad and provide no boundaries such as requiring prior configuration, trusted dashboard domains, or user confirmation before accessing internal systems and writing local files. Overbroad triggers increase the chance the agent runs this skill in unintended contexts, causing unauthorized network access, data collection, or local persistence of sensitive metrics.
The code's user-facing comments and console messages are consistently written in Chinese, including operational errors and instructions. This imposes a specific language on users without offering a language choice or documenting that the skill is intentionally limited to a Chinese-speaking context.
The code goes beyond passive report generation by automating a logged-in browser session, detecting authentication state, capturing outbound request payloads, and replaying API calls directly. In a reporting skill this may be functionally useful, but it materially expands access and data-handling capability, increasing the risk of collecting or reusing authenticated data in ways users may not expect.
Intercepting requests and parsing POST bodies allows the skill to extract potentially sensitive parameters, filters, identifiers, or other business data from a live authenticated session. Even if intended to bootstrap report queries, this is a sensitive capability because it silently harvests request contents from the user's browser context without clear necessity or boundary checks.
The captured POST payload is taken from an authenticated page request and processed internally without any visible disclosure, consent, or indication of what data is being extracted. That creates a transparency and privacy risk because users may believe the tool only renders a report page rather than inspecting and reusing underlying request bodies.
The skill reuses captured payload data in a secondary POST request, effectively transmitting authenticated query parameters over the network without any user-facing warning. This can expose sensitive report filters or internal data selectors to endpoints chosen by configuration, and it normalizes replay of browser-derived data outside the original request flow.
The README states that collected data and generated reports are written to persistent local storage, but it does not warn users that potentially sensitive quality metrics will remain on disk. Persistent storage increases the risk of unintended disclosure through shared machines, backups, lax file permissions, or later compromise of the host.
The natural-language values for the report name and all column labels are exclusively in Chinese, and the file provides no indication that this skill is region-specific or that users can choose another language. Under the stated policy, forcing a specific language without opt-in can be a locale-policy issue.
The error and status messages shown to users are written only in Chinese, which imposes a specific language without any visible opt-in or fallback. This can violate language or locale policy when the skill is not clearly documented as region-specific.
This JavaScript file generates user-facing report text entirely in Chinese, including headings and explanatory content. Because the skill does not provide any language selection or state that it is intentionally limited to a Chinese-language context, it appears to force a specific language without user opt-in.
The dependency uses a caret range, which allows newer minor/patch releases to be installed without explicit review. This creates a supply-chain risk because builds may become non-reproducible and could unexpectedly pull in a compromised or breaking release of a shared internal package.
"config.example.json"
],
"dependencies": {
"@bondli-skills/shared": "^1.0.0",
"puppeteer": "^22.0.0",
"puppeteer-core": "^22.15.0"
},
The puppeteer dependency is not pinned and can resolve to different versions over time, increasing the risk of consuming a vulnerable or malicious upstream release. Because this package drives browser automation, dependency drift can also expand attack surface in environments that execute the skill automatically.
],
"dependencies": {
"@bondli-skills/shared": "^1.0.0",
"puppeteer": "^22.0.0",
"puppeteer-core": "^22.15.0"
},
"license": "MIT"
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.
Using a version range for puppeteer-core permits unreviewed updates to a security-sensitive browser automation library. In automated agent workflows, this can introduce supply-chain risk and inconsistent runtime behavior across environments.
"dependencies": {
"@bondli-skills/shared": "^1.0.0",
"puppeteer": "^22.0.0",
"puppeteer-core": "^22.15.0"
},
"license": "MIT"
}
No suspicious patterns detected.