T09 · Insecure Skill Coding Practices
Warning
- Location
- SKILL.md:181
- Finding
- Hardcoded User-Specific Paths and Operational Identifiers<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:22-24, 34-40, 55-56, 71-83, 181-218, 255`; `evals/evals.json:6-45` **Vulnerability Type**: Plaintext disclosure of environment-specific metadata **Risk Level**: Medium ### Vulnerable Code Snippet ```json { "id": "c6e92d09-5ff6-4079-b839-a9c4fe6d2e10", "name": "obsidian-discord-guild-daily-review-final", "schedule": { "expr": "0 5 * * *", "tz": "Asia/Shanghai" } } ``` ```text /Users/can4hou6joeng4/.openclaw/cron/jobs.json /Users/can4hou6joeng4/.openclaw/cron/runs/c6e92d09-5ff6-4079-b839-a9c4fe6d2e10.jsonl /Users/can4hou6joeng4/Documents/Obsidian/Second Brain/01-Daily/2026-03-13.md /Users/can4hou6joeng4/Documents/Obsidian/Second Brain/00-Inbox/Daily Sync Digest - 2026-03-13.md ``` ```js author.id === "1478785297784373490" mentions.some(m => m.id === "1478785297784373490") ``` The package also contains the guild identifier `1478785964896817267`, multiple Discord thread identifiers, model and provider details, and the same environment-specific information in evaluation prompts. ### Technical Analysis The reusable Skill package embeds stable identifiers and absolute paths taken from a specific operating environment. The disclosed data includes: - A local operating-system username. - OpenClaw configuration and execution-history paths. - Personal Obsidian document locations. - A stable cron job UUID. - Discord user, guild, and thread identifiers. - Model and provider metadata associated with the job. These values are not credentials and do not directly grant access. Nevertheless, they expose environment topology and stable account identifiers that are unnecessary for implementing generic troubleshooting behavior. If the package is published, shared, indexed, or included in logs, an observer can correlate the local identity with Discord infrastructure and infer where operational records and personal documents are stored. The same values are repeated in `evals/evals.json`, increasi ...[truncated 1523 chars]
- Remediation
- <![CDATA[ ## Remediation Suggestions 1. Replace all absolute paths with neutral variables or placeholders: - `$HOME/.openclaw/cron/jobs.json` - `<OPENCLAW_HOME>/cron/runs/<JOB_ID>.jsonl` - `<OBSIDIAN_VAULT>/01-Daily/<DATE>.md` 2. Replace production identifiers with clearly synthetic values: - `<JOB_ID>` - `<GUILD_ID>` - `<TARGET_USER_ID>` - `<THREAD_ID>` 3. Remove the case-specific task record from the distributable Skill or move it to a private incident report. 4. Sanitize `evals/evals.json` so evaluation prompts use synthetic fixtures rather than real paths and identifiers. 5. Add an automated release check that detects: - `/Users/<name>/` and other absolute home-directory paths. - UUIDs not present in an approved fixture list. - Discord Snowflake-like identifiers. - Provider, account, and local workspace metadata. 6. Keep any examples necessary for teaching ID-string handling, but use reserved synthetic identifiers that cannot be correlated with a real account. ]]>
