T01 · Skill Instruction Hijacking
- Location
scripts/eyes-utils.py:263- Finding
Unrelated Product Promotion Is Automatically Injected into Outbound Reports
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly matches a news-and-market alert assistant, but its outbound messaging path has under-scoped delivery behavior that could send or modify reports in unexpected ways.
Install only after reviewing the cron jobs and message destinations. Do not use the provided hard-coded Feishu examples as-is, remove the BigA config fallback and promotion behavior, and require explicit confirmation before sending reports or changing cron/update settings.
scripts/eyes-utils.py:263Unrelated Product Promotion Is Automatically Injected into Outbound Reports
SKILL.md:146Mandatory Delivery Examples Contain a Concrete Feishu Recipient Identifier
scripts/eyes-utils.py:249Eyes Silently Reads and Reuses Another Skill's Delivery Configuration
Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.
Mixing characters from multiple Unicode scripts in a single identifier is a common technique to create visually ambiguous tool names.
The skill is described as a news monitor, but its behavior extends into persistent local state, outbound delivery, cron/job management, update workflows, and references to other tooling. This mismatch makes risk harder for users and reviewers to understand and can conceal privileged behavior behind an innocuous description.
Broad everyday triggers can cause the skill to activate on unrelated conversation. In this skill, activation is especially risky because the instructions say '触发即执行' and can lead to searches, file operations, outbound messaging, and other side effects without further confirmation.
The skill invokes shell commands and writes persistent files, but it declares no explicit tool restrictions. That creates an over-privileged design where a conversational trigger can lead to command execution, cron changes, updates, and outbound messaging without a least-privilege boundary.
The trigger set contains multiple generic phrases with weak scope constraints. Because the skill auto-executes and includes persistent and outbound behaviors, accidental invocation can produce unintended message sends, cron actions, or local state changes.
The document defines a fixed branded output format in Chinese and does not indicate that the user may choose language or locale. Since the skill description is bilingual but the operational instructions prescribe one language/style by default, this can violate language-choice policy when interacting with users who did not opt in.
Self-update plus cron reconfiguration allows the skill to change its own code path and persistence behavior from a chat trigger. That expands the trust boundary significantly: a user asking for news could end up authorizing software modification and background task changes, which can be abused for persistence or to introduce new behavior after review.
Installing scheduled jobs and creating marker files establishes persistence beyond a one-shot summarization task. If triggered unintentionally or abused, the skill can continue sending content or modifying local state long after the initiating conversation, increasing blast radius.
This JSON manifest contains only Chinese-language skill names, descriptions, and execution messages, which indicates the skill is designed to operate in a fixed language without offering a user choice or opt-in. Under the policy rule for natural-language violations, forcing a specific language is reportable unless the locale constraint is explicitly justified or optional.
The document title, headings, and all table content are in Chinese, which imposes a single language on users. Under the stated policy, forcing a specific language without user opt-in or documented justification is a natural-language policy violation.
The file-level description and command/help text are entirely in Chinese, and later user-directed strings also require Chinese phrases such as replying with specific Chinese text. There is no indication that the skill is region-specific or that users may opt into another language, which violates the language/locale policy described in the audit rules.
This utility can send content to Feishu/OpenClaw targets, which is a material capability expansion beyond passive news monitoring and analysis. In a skill context, hidden outbound messaging increases the risk of unauthorized data exfiltration, spam, or actions performed on behalf of the user without sufficiently clear consent.
The skill reads shared BigA configuration and reuses its channel/target, then advertises another tool inside the send path. Cross-skill config reuse breaks isolation assumptions and can cause this news skill to send to destinations configured for a different tool, enabling confused-deputy behavior and unexpected disclosure to third-party recipients.
These strings instruct the user to reply with Chinese phrases such as 帮我安装 and 帮我安装大A to proceed. Because no alternative language option is offered and no regional justification is stated, the skill imposes a language requirement on users.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
seg=seg.strip()
if not seg: continue
for attempt in range(3):
p=subprocess.Popen(
[openclaw_bin,"message","send",
"--channel",channel,
"--target",target,
Messages are transmitted to an external channel without an explicit confirmation step in the sending path. In this skill, that is more dangerous because the tool is framed as a news assistant, so users may not expect operational message delivery or realize content and destination can be pulled from stored config.
The trigger '大眼' is very short and ambiguous, making accidental activation likely. In the context of this skill, accidental activation is more dangerous because invocation can immediately perform searches and outbound push behavior rather than only generating local text.
L169-L171 says manual triggering should use message send and even checks whether openclaw message send was called, but elsewhere the same file mandates eyes-utils.py send-segments as the required sender and forbids manual openclaw message send calls (L121-L122, L146-L151, L206-L207). This is an active contradiction in operational guidance, not just missing detail.
L220 states that manual triggers must send segmented messages via openclaw message send, while multiple earlier sections explicitly require eyes-utils.py send-segments and prohibit manual openclaw message send usage. These instructions cannot both be true, creating intent-code/documentation divergence within the skill specification.
The cron entry explicitly sets the timezone to "Asia/Shanghai", and the same pattern recurs in the other scheduled jobs. This is a natural-language/configured locale constraint that does not present user opt-in or explain why the skill must be limited to that locale.
The function signatures and CLI parsing suggest the caller can choose a scene via --scene, but the inline comments state the implementation always infers Beijing time and ignores the provided value. This is an intent/documentation divergence within the code interface itself: the exposed parameter implies controllability that the implementation explicitly overrides.