T01 · Skill Instruction Hijacking
- Location
SKILL.md:108- Finding
Mandatory Dashboard-Link Injection into Unrelated Agent Responses
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This cron dashboard has a plausible purpose, but it exposes cron data and gateway tokens too broadly and relies on mutable remote code plus unmanaged background sync.
Review before installing. Treat the dashboard data as sensitive cron metadata. Do not use this as-is on a shared or networked host; first remove tokenized URLs and automatic after-run output, bind locally or add real authentication, remove wildcard CORS, pin or bundle the dashboard HTML, redact job prompts/secrets, and replace nohup sync with a managed process that has clear start, status, and stop controls.
SKILL.md:108Mandatory Dashboard-Link Injection into Unrelated Agent Responses
update_canvas.py:18Unpinned Remote HTML Is Downloaded and Deployed as Active Content
serve.py:20Development Server Exposes Full Cron Definitions Without Authentication
SKILL.md:50Gateway Credential Is Embedded in a Public Plaintext HTTP URL
watch_sync.sh:1Detached Infinite Sync Process Continuously Publishes Complete Job Data
generate.py:21Cron Data Can Break Out of the Generated Script Element
The README instructs opening a URL with token=${OPENCLAW_GATEWAY_TOKEN} in the query string, exposing a sensitive token in browser history, logs, screenshots, referrers, and proxy/access logs. Because this skill is for an externally accessible dashboard, the context makes token leakage more dangerous: compromise of the token could grant unauthorized access to cron status or related protected resources.
The skill is ներկայացված as a visual dashboard, but the instructions indicate installer/updater behavior including fetching remote content from GitHub, writing local files, and running background sync logic. This mismatch increases supply-chain and operator-trust risk because users may authorize it as a passive UI skill while it performs active code/data deployment tasks.
The documentation instructs constructing and exposing a URL containing the gateway token in the query string. Tokens in URLs are commonly leaked via logs, browser history, referrers, screenshots, and shared terminal output, granting unauthorized dashboard access if captured.
The instructions explicitly require revealing a live access URL containing the gateway token to the user after every cron job run. This is direct secret disclosure, and anyone with access to the output can reuse the token to access the dashboard and potentially associated run data.
Requiring the tokenized dashboard link to be printed after every cron run greatly increases the chance the token will be stored in logs, notifications, transcripts, or monitoring systems. Repetition magnifies exposure and turns a single secret into a routinely broadcast credential.
The installation block tells users to run a nohup background sync process during setup, which establishes persistence outside the user's current session. While not inherently malicious, instructing unattended persistence without prominent disclosure or controls is risky because it can keep running indefinitely and perform ongoing file or network activity.
Clone https://github.com/firstfloris/opencron-skill into skills/opencron.
Run python3 skills/opencron/update_canvas.py to deploy the dashboard.
Run nohup sh skills/opencron/watch_sync.sh & to start background sync.
After every cron job run, show the user: "See cron status on OpenCron: <dashboard-url>"
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.
The README explicitly says update_canvas.py fetches the latest dashboard from GitHub and writes local data, but provides no integrity checks, pinning, or warning about trusting remote content. This creates a supply-chain and local file modification risk: if the upstream content is compromised or unexpectedly changed, users may pull and deploy unsafe HTML or scripts into their environment.
The manual setup section repeats the nohup sh skills/opencron/watch_sync.sh & instruction, again creating session-independent persistence. In the context of a dashboard sync loop, this is more than cosmetic: it enables continual background execution that users may not monitor, increasing exposure if the script misbehaves or is later altered.
nohup sh skills/opencron/watch_sync.sh &
The README instructs users to launch watch_sync.sh with nohup ... &, creating a persistent background process without clearly disclosing persistence, lifecycle, resource use, or stop instructions. Persistent unattended processes expand attack surface and can continue syncing or modifying state after the user forgets they were started.
The skill documentation describes behaviors that require file read/write and network access, but it does not declare any tool scope or permissions boundary. This weakens reviewability and least-privilege controls, making it easier for a skill to perform broader actions than an operator expects.
The documented use of nohup launches a persistent background process that continues independently of the initiating session. Persistence is not inherently malicious here, but it can create unmanaged long-running behavior, surprise operators, and complicate containment or auditing if the sync loop is compromised or misconfigured.
nohup sh skills/opencron/watch_sync.sh &
Keeps cron-data.json in sync with jobs.json every 30 seconds.
The documentation tells the operator to query an external IP-discovery service, which causes outbound network traffic unrelated to core dashboard rendering. This leaks infrastructure metadata to a third party and normalizes unnecessary external calls in routine usage.
The instructions direct use of an external IP-discovery service without warning that this reveals server metadata and performs third-party network access. Lack of disclosure can surprise operators and violate privacy or network policy expectations.
The skill mandates contacting ifconfig.me after every cron job execution, creating repeated external beacons and unnecessary disclosure of server metadata. Because this occurs automatically and broadly, it increases privacy and operational risk beyond an initial setup step.
The instruction to act after every cron job run is overly broad and can affect unrelated jobs and outputs. Broad trigger conditions increase the chance of accidental data exposure, noisy behavior, and unsafe automation across contexts where a dashboard link is not appropriate.
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.
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.
This code performs a recursive, forced deletion of the repository's .git directory immediately after cloning. Although the script logs cloning and deployment steps, it does not disclose that it will irreversibly remove version-control metadata, and there is no confirmation prompt or comment warning about that destructive action.
The manifest describes a dashboard for OpenClaw with live countdown timers, run history, and calendar view, implying real OpenClaw cron data. In this file, all job data and run history are fabricated in in-memory mock structures and the code explicitly labels the logic as using mock data, so the implemented behavior is a demo rather than a live dashboard.
The comment says the app logic is 'identical to production, but with mock data,' which suggests production-equivalent behavior aside from the data source. In practice, this file never connects to any real backend and all visible functionality depends on synthetic datasets, so the documentation overstates what the code actually demonstrates.
The script reads cron job data from a sensitive per-user file in the home directory and embeds it directly into a standalone HTML artifact. Even though this is the advertised functionality, the generated file can expose job names, schedules, commands, paths, and error details to anyone who gains access to the HTML, and the code provides no warning, consent prompt, redaction, or access-control safeguard.
The server binds to 0.0.0.0, making the dashboard reachable from other hosts on the network, and the /cron-data endpoint explicitly allows any web origin to read its response via Access-Control-Allow-Origin: *. That exposes local cron metadata beyond the apparent 'local visual dashboard' use case and can let any website visited by the user harvest job names, schedules, and errors if the port is reachable.
No suspicious patterns detected.