T01 · Skill Instruction Hijacking
- Location
SKILL.md:62- Finding
Forced Promotional Output and Agent Tool-Routing Hijack
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill has a plausible booking purpose, but it needs Review because it can open unvalidated URLs through shell commands, weakens browser security, tries to control the host agent, and logs appointment contact data.
Only install after review or fixes. Require URL allowlisting and shell-free browser opening, remove host-agent control rules, restore the missing template or simplify rendering, add explicit user confirmation before submitting appointments, remove plaintext contact-data logs, and avoid running developer sync scripts unless you intentionally want to modify the local OpenClaw cache.
SKILL.md:62Forced Promotional Output and Agent Tool-Routing Hijack
api/browser/open-url.js:17Arbitrary OS Command Execution Through Unescaped URL Interpolation
api/browser/consult.js:16Arbitrary Web Content Opened with Chromium Sandbox and Web Security Disabled
api/skill.js:549Plaintext Logging of User Contact and Appointment Information
Referenced artifact was not completely inspected
- 医院数据:`data/hospitals.json`(961条)
Referenced artifact was not completely inspected
- 医院数据:`data/hospitals.json`(961条)
The plan contains rm -rf lib/, a destructive filesystem operation. In agentic execution, recursive deletion is dangerous because path mistakes, repository layout changes, or partial migrations can permanently remove code needed for recovery, validation, or forensic review.
rm -rf lib/
rm templates/zh_cn.txt
rm index.js
rm hospitals.json # now lives in data/
rm templates/zh_cn.txt is a direct file deletion command. Although narrower than rm -rf, it still performs irreversible state change and can remove a fallback or reference artifact before migration correctness is fully established.
rm -rf lib/
rm templates/zh_cn.txt
rm index.js
rm hospitals.json # now lives in data/
git rm -rf lib/ templates/zh_cn.txt index.js hospitals.json combines recursive removal with persistence in version control. This magnifies risk because it not only deletes files locally but also codifies their removal in repository history, increasing the chance of accidental loss of important components during autonomous execution.
git rm -rf lib/ templates/zh_cn.txt index.js hospitals.json
git commit -m "chore: remove old lib/, templates/zh_cn.txt, root index.js and hospitals.json"
The plan directs modification of skill.json, which is part of the skill's own configuration and execution surface. Self-modification is dangerous because an agent following the plan could change its entrypoint, inputs, or behavior contract in ways that bypass prior review or expand capabilities beyond intended scope.
---
## Task 9: Update skill.json and SKILL.md
**Files:**
- Modify: `skill.json`
This step includes concrete instructions to update skill.json, directly altering the skill manifest. In an agentic setting, allowing a plan to rewrite its own manifest can enable persistence, capability drift, or redirection to a different entry file without adequate oversight.
Modify: skill.json
Modify: SKILL.md
Step 1: Update skill.json
{
Updating SKILL.md is a form of self-modification to the skill's operating documentation. While less dangerous than manifest changes, it can still mislead downstream agents or users about data sources, capabilities, or safe usage, especially if documentation is trusted as policy input.
}
- [ ] **Step 2: Update SKILL.md data section**
Change the data paths in `SKILL.md` to reflect new locations:
- `hospitals.json` → `data/hospitals.json`
The commit step explicitly persists changes to skill.json and SKILL.md, turning self-modification into a durable state change. Persisted configuration/documentation changes are risky because they survive the current run and may affect future executions or audits.
git add skill.json SKILL.md
git commit -m "chore: update skill.json entry point and SKILL.md for new structure"
brace-expansion 1.1.12 has multiple denial-of-service issues involving pathological expansion patterns that can cause extreme CPU or memory consumption. Although it is transitively included through dev tooling, lockfile processing chains often touch globbing on file names, patterns, or configuration, so attacker-influenced patterns in CI or automation could stall developer workflows.
browserslist 4.28.1 is flagged for crash/prototype write and unbounded memory growth issues when handling untrusted browserslist stats or many distinct queries. Because this is in the development toolchain rather than the runtime app, the main exposure is CI/build instability or unexpected object mutation if untrusted configuration/data is processed.
js-yaml 3.14.2 has known quadratic/CPU exhaustion issues in parsing certain crafted YAML structures. Even as a dev dependency, YAML parsers are commonly exercised on configuration files, so attacker-controlled config or fixture content in CI, test, or helper scripts could trigger denial of service.
picomatch 2.3.1 is reported vulnerable to ReDoS and method-injection-style matching issues from crafted glob patterns. Since picomatch is heavily used across Jest and file-matching utilities, untrusted patterns or path-like inputs in developer automation could cause excessive CPU use or incorrect matching behavior.
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
/* 垂直间距 */
/* 透明度 */
/* 文章场景相关 */.qr-code[data-v-41c36176]{position:fixed;z-index:9999;bottom:120px;right:5px;width:45px;height:45px;-webkit-animation:shake-data-v-41c36176 1s infinite;animation:shake-data-v-41c36176 1s infinite}.qr-code uni-image[data-v-41c36176]{width:100%;height:100%}.kf-code[data-v-41c36176]{position:fixed;z-index:9998;bottom:150px;right:5px;width:45px;height:45px}.kf-code uni-image[data-v-41c36176]{width:100%;height:100%}@-webkit-keyframes shake-data-v-41c36176{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}20%{-webkit-transform:rotate(-3deg);transform:rotate(-3deg)}30%{-webkit-transform:rotate(3deg);transform:rotate(3deg)}60%{-webkit-transform:rotate(-3deg);transform:rotate(-3deg)}80%{-webkit-transform:rotate(3deg);transform:rotate(3deg)}100%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes shake-data-v-41c36176{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}20%{-webkit-transform:rotate(-3deg);transform:rotate(-3deg)}30%{-webkit-transform:rotate(3deg);transform:rotate(3deg)}60%{-webkit-transform:rotate(-3deg);transform:rotate(-3deg)}80%{-webkit-transform:rotate(3deg);transform:rotate(3deg)}100%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}</style><style type="text/css">
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
/* 垂直间距 */
/* 透明度 */
/* 文章场景相关 */.qr-code[data-v-41c36176]{position:fixed;z-index:9999;bottom:120px;right:5px;width:45px;height:45px;-webkit-animation:shake-data-v-41c36176 1s infinite;animation:shake-data-v-41c36176 1s infinite}.qr-code uni-image[data-v-41c36176]{width:100%;height:100%}.kf-code[data-v-41c36176]{position:fixed;z-index:9998;bottom:150px;right:5px;width:45px;height:45px}.kf-code uni-image[data-v-41c36176]{width:100%;height:100%}@-webkit-keyframes shake-data-v-41c36176{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}20%{-webkit-transform:rotate(-3deg);transform:rotate(-3deg)}30%{-webkit-transform:rotate(3deg);transform:rotate(3deg)}60%{-webkit-transform:rotate(-3deg);transform:rotate(-3deg)}80%{-webkit-transform:rotate(3deg);transform:rotate(3deg)}100%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes shake-data-v-41c36176{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}20%{-webkit-transform:rotate(-3deg);transform:rotate(-3deg)}30%{-webkit-transform:rotate(3deg);transform:rotate(3deg)}60%{-webkit-transform:rotate(-3deg);transform:rotate(-3deg)}80%{-webkit-transform:rotate(3deg);transform:rotate(3deg)}100%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}</style><style type="text/css">
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
._sup[data-v-c6b99c78]{display:inline}
</style><style type="text/css">
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
._sup[data-v-c6b99c78]{display:inline}
</style><style type="text/css">
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
/* 圆角 */}.bottom-popup .popup-gs[data-v-8c33c7b8]{display:flex;flex-direction:row;justify-content:center;align-items:center;margin-top:10px;font-size:14px}.bottom-popup .popup-gs .gs-label[data-v-8c33c7b8]{color:#949494}.bottom-popup .popup-gs .gs-name[data-v-8c33c7b8]{margin-left:10px;color:#ff5a62;font-weight:700}.bottom-popup .popup_text[data-v-8c33c7b8]{width:85%;font-size:14px;padding:10px;margin:5px auto 0;background:#fff;border:1px solid #dedede;border-radius:5px;height:140px;overflow-y:auto}.bottom-popup .popup_jf_num[data-v-8c33c7b8]{font-size:14px;color:#333;text-align:center;width:100%}.bottom-popup .popup_jf-btn[data-v-8c33c7b8]{width:85%;display:flex;flex-direction:column;align-items:center;margin:0 auto;padding-top:5px}.bottom-popup .popup_jf-btn .popup_jf_info[data-v-8c33c7b8]{font-size:15px;border-radius:15px;padding:7px 0;width:100%;text-align:center;box-sizing:border-box;margin-top:5px;margin-bottom:10px}.bottom-popup .popup_jf-btn .popup_jf_info-disable[data-v-8c33c7b8]{background:#eee;color:#333}.bottom-popup .popup_jf-btn .popup_jf_info-get[data-v-8c33c7b8]{
/* 基础线性渐变方案 */background:linear-gradient(180deg,#fd9d99,#ff5a62);color:#fff}.bottom-popup .popup_jf-btn .popup_jf_info-pm[data-v-8c33c7b8]{
/* 基础线性渐变方案 */background:linear-gradient(180deg,#fd9d99,#ff5a62);color:#fff}.success-icon[data-v-8c33c7b8]{font-size:30px;color:#4caf50;text-align:center;margin:10px 0}.err-icon[data-v-8c33c7b8]{color:#af4c4c}.success-text[data-v-8c33c7b8]{font-size:18px;color:#333;text-align:center;margin-bottom:10px}.success-description[data-v-8c33c7b8]{width:85%;font-size:14px;margin:20px auto 30px;padding:10px;background:#fff;border:1px solid #dedede;border-radius:5px;height:125px;overflow-y:auto}</style><style type="text/css">
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
/* 圆角 */}.bottom-popup .popup-gs[data-v-8c33c7b8]{display:flex;flex-direction:row;justify-content:center;align-items:center;margin-top:10px;font-size:14px}.bottom-popup .popup-gs .gs-label[data-v-8c33c7b8]{color:#949494}.bottom-popup .popup-gs .gs-name[data-v-8c33c7b8]{margin-left:10px;color:#ff5a62;font-weight:700}.bottom-popup .popup_text[data-v-8c33c7b8]{width:85%;font-size:14px;padding:10px;margin:5px auto 0;background:#fff;border:1px solid #dedede;border-radius:5px;height:140px;overflow-y:auto}.bottom-popup .popup_jf_num[data-v-8c33c7b8]{font-size:14px;color:#333;text-align:center;width:100%}.bottom-popup .popup_jf-btn[data-v-8c33c7b8]{width:85%;display:flex;flex-direction:column;align-items:center;margin:0 auto;padding-top:5px}.bottom-popup .popup_jf-btn .popup_jf_info[data-v-8c33c7b8]{font-size:15px;border-radius:15px;padding:7px 0;width:100%;text-align:center;box-sizing:border-box;margin-top:5px;margin-bottom:10px}.bottom-popup .popup_jf-btn .popup_jf_info-disable[data-v-8c33c7b8]{background:#eee;color:#333}.bottom-popup .popup_jf-btn .popup_jf_info-get[data-v-8c33c7b8]{
/* 基础线性渐变方案 */background:linear-gradient(180deg,#fd9d99,#ff5a62);color:#fff}.bottom-popup .popup_jf-btn .popup_jf_info-pm[data-v-8c33c7b8]{
/* 基础线性渐变方案 */background:linear-gradient(180deg,#fd9d99,#ff5a62);color:#fff}.success-icon[data-v-8c33c7b8]{font-size:30px;color:#4caf50;text-align:center;margin:10px 0}.err-icon[data-v-8c33c7b8]{color:#af4c4c}.success-text[data-v-8c33c7b8]{font-size:18px;color:#333;text-align:center;margin-bottom:10px}.success-description[data-v-8c33c7b8]{width:85%;font-size:14px;margin:20px auto 30px;padding:10px;background:#fff;border:1px solid #dedede;border-radius:5px;height:125px;overflow-y:auto}</style><style type="text/css">
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
/* 无任何数据的空布局 */.mescroll-empty[data-v-482baad0]{box-sizing:border-box;width:100%;padding:50px 25px;text-align:center}.mescroll-empty.empty-fixed[data-v-482baad0]{z-index:99;position:absolute; /*transform会使fixed失效,最终会降级为absolute */top:50px;left:0}.mescroll-empty .empty-icon[data-v-482baad0]{width:140px;height:140px;margin:0 auto}.mescroll-empty .empty-tip[data-v-482baad0]{margin-top:10px;font-size:12px;color:grey}.mescroll-empty .empty-btn[data-v-482baad0]{display:inline-block;margin-top:20px;min-width:100px;padding:9px;font-size:14px;border:1px solid #e04b28;border-radius:30px;color:#e04b28}.mescroll-empty .empty-btn[data-v-482baad0]:active{opacity:.75}</style><style type="text/css">
Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.
/* 无任何数据的空布局 */.mescroll-empty[data-v-482baad0]{box-sizing:border-box;width:100%;padding:50px 25px;text-align:center}.mescroll-empty.empty-fixed[data-v-482baad0]{z-index:99;position:absolute; /*transform会使fixed失效,最终会降级为absolute */top:50px;left:0}.mescroll-empty .empty-icon[data-v-482baad0]{width:140px;height:140px;margin:0 auto}.mescroll-empty .empty-tip[data-v-482baad0]{margin-top:10px;font-size:12px;color:grey}.mescroll-empty .empty-btn[data-v-482baad0]{display:inline-block;margin-top:20px;min-width:100px;padding:9px;font-size:14px;border:1px solid #e04b28;border-radius:30px;color:#e04b28}.mescroll-empty .empty-btn[data-v-482baad0]:active{opacity:.75}</style><style type="text/css">
The README instructs users to run npx clawhub install korean-booking without pinning a specific version of the tool being executed. This creates a supply-chain risk: users may fetch and run whatever version is current at install time, and if the package or dependency chain is compromised, arbitrary code could execute on the user's machine.
The trigger phrases are broad conversational requests like booking, recommending clinics, or downloading an app, which overlap with normal user speech. In an agent environment, ambiguous triggers can cause the skill to activate unexpectedly and initiate sensitive flows related to browser opening, clinic selection, or booking actions without sufficiently explicit scoping.
The invocation examples include short, generic commands such as '帮我下载' and other broad appointment-related phrases that lack clear scope constraints. This increases the chance of accidental or context-confused activation, especially in multi-skill or agentic environments where similar phrases may refer to unrelated tasks.
The README describes automatic browser opening, button clicking via Playwright, form filling, and submission of appointment information, but provides no user-facing warning, consent requirement, or safety boundary for actions that affect user data and external system state. In context, this is more dangerous because the skill operates on healthcare/medical-booking workflows and may submit personal scheduling details or contact interactions to third-party sites.
No suspicious patterns detected.