T01 · Skill Instruction Hijacking
- Location
SKILL.md:162- Finding
Mandatory Promotional and Update-Solicitation Content Injected into Agent Responses
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This news skill mostly matches its stated purpose, but it also performs automatic update checks and uses an unsafe shared temp cache, so it should be reviewed before install.
Before installing, confirm you are comfortable with this skill contacting Ebrun for news and also checking Ebrun/GitHub/Gitee for skill version data. Treat any update prompt as advisory only, verify the repository yourself, and prefer disabling or fixing the update checker/cache behavior before use in shared or sensitive environments.
SKILL.md:162Mandatory Promotional and Update-Solicitation Content Injected into Agent Responses
scripts/update.py:34Predictable Shared Python Cache Allows Version-State Poisoning and Symlink File Overwrite
scripts/update.sh:14Predictable Shared Shell Cache Allows Version-State Poisoning and Symlink File Overwrite
Beyond news retrieval, the skill reads local version files, may write cache-like state, queries remote version sources, and exposes script-oriented operational controls. This mismatch matters because a content-fetching skill is being used as a vehicle for additional local-state and software-maintenance behavior, which broadens attack surface and complicates trust review.
Beyond news retrieval, the skill reads local version files, may write cache-like state, queries remote version sources, and exposes script-oriented operational controls. This mismatch matters because a content-fetching skill is being used as a vehicle for additional local-state and software-maintenance behavior, which broadens attack surface and complicates trust review.
Referenced artifact was not completely inspected
bash scripts/update.sh --json
Referenced artifact was not completely inspected
bash scripts/update.sh --json
Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.
import subprocess
from pathlib import Path
skill_dir = Path(".claude/skills/ebrun-original-news")
channel_file = skill_dir / "references" / "channel-list.json"
data = json.loads(channel_file.read_text(encoding="utf-8"))
Skill reads from agent configuration directories (.claude/, .codex/, .gemini/). These directories may contain API keys, personal settings, and other credentials that the skill has no legitimate need to access.
import subprocess
from pathlib import Path
skill_dir = Path(".claude/skills/ebrun-original-news")
channel_file = skill_dir / "references" / "channel-list.json"
data = json.loads(channel_file.read_text(encoding="utf-8"))
The skill instructs the agent to read local files, invoke shell/Python scripts, perform network requests, and maintain runtime cache behavior, but it does not declare any explicit tool restrictions or allowed-tools scope. In an agent environment, this expands the effective authority of a seemingly simple news skill and increases the chance of unintended file, shell, or network use beyond user expectations.
The natural-language instructions, activation phrases, and output templates are entirely specified in Chinese, with no indication that users may interact in other languages or choose a locale. This creates a locale/language constraint in the skill behavior without explicit opt-in or justification as a region-specific tool.
The listed triggers "看看有什么AI新闻" and "品牌有什么新动态" are much broader than the skill's stated ecommerce-news scope and overlap with common user requests about general AI or brand news. Although some exclusion cases are listed later, these phrases can still cause unintended invocation because they do not clearly restrict the request to 亿邦动力网 or ecommerce-related coverage.
该 markdown 文件属于 SQP-1 适用范围。看看AI新闻、看品牌全球化报道、产业有什么新动态 这类表述接近日常通用说法,文档又未给出排除条件或更明确的触发边界,容易与普通对话重叠并造成误调用。
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.
import subprocess
from pathlib import Path
skill_dir = Path(".claude/skills/ebrun-original-news")
channel_file = skill_dir / "references" / "channel-list.json"
data = json.loads(channel_file.read_text(encoding="utf-8"))
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.
import subprocess
from pathlib import Path
skill_dir = Path(".claude/skills/ebrun-original-news")
channel_file = skill_dir / "references" / "channel-list.json"
data = json.loads(channel_file.read_text(encoding="utf-8"))
The documented version-check and update behavior expands the skill's network reach beyond its stated purpose of fetching Ebrun news, including contacting GitHub/Gitee-derived URLs. This creates unnecessary external connectivity and increases supply-chain and data exfiltration risk if an attacker can influence repository URLs or remote version metadata.
Contacting GitHub/Gitee for version metadata is not necessary to retrieve latest Ebrun news and broadens the trust boundary to unrelated third-party infrastructure. Even without direct code execution, this can leak environment/network metadata, create an unexpected outbound channel, and expose users to spoofed update signals or repository-based supply-chain abuse.
This manifest-style JSON defines aliases used for channel selection, and the alias "产业" is very generic and lacks scope constraints. As a trigger term, it could collide with many ordinary references to industry rather than specifically invoking this channel.
The skill manifest describes a user-facing capability to retrieve the latest ecommerce news from 亿邦动力网, but this file is a maintenance utility for checking the skill's own version updates. Its logic reads local version metadata, caches results, and queries remote version endpoints and repository files rather than fetching news articles. This is a semantic mismatch between the declared skill purpose and the actual code behavior in this file.
技能清单描述该技能用于获取亿邦动力网最新电商新闻,但此脚本实现的是技能自身版本更新检查:读取本地 version.json、请求远程版本接口、探测 GitHub/Gitee 地址可达性并写入本地缓存。这些操作与“获取新闻报道”这一用户可见目的并不一致,属于独立的维护/更新功能。
脚本允许访问版本接口以及 GitHub、raw.githubusercontent.com、Gitee 等仓库域名,并在主流程中主动请求这些地址以判断技能版本和仓库可达性。对于一个声明用途仅为获取亿邦动力网新闻的技能,这类面向代码仓库和更新元数据的网络能力并非实现新闻抓取的直接必要条件。
SQP-3 适用于所有文件类型。当前文件从标题、触发示例到输出格式均默认强制使用中文,没有看到允许用户选择语言/locale 的说明;若该技能面向通用用户环境,这可能构成未经用户选择的语言策略限制。
The manifest describes a skill for retrieving the latest Ebrun e-commerce news articles when users ask for news. In this file, Examples 8 and 10 document invoking scripts/update.py to check remote versions and surface upgrade notices, which is a maintenance capability rather than part of the user-facing news retrieval purpose.
Running scripts/update.py --json --force and checking remote APIs or repository version files introduces a software-update lookup capability unrelated to retrieving latest news content. For a skill whose declared purpose is to fetch Ebrun news reports, this maintenance/network behavior is not obviously required by that purpose.
This markdown file uses Chinese throughout and does not indicate that the skill is limited to Chinese-speaking users or provide an opt-in language choice. Under the language/locale policy, forcing a single language without user choice can be a natural-language policy violation.
The document frames the built-in scripts as defensive wrappers for news fetching, yet later sections describe separate update/version-check logic with different remote endpoints and fallback repository probing. This creates an intent-level inconsistency within the documentation about the skill's operational scope.
All natural-language labels and aliases in the configuration are in Chinese, and the file does not indicate that language selection is optional or that the skill is intentionally limited to a Chinese-speaking context. This can constitute a language/locale policy concern when users are not given an explicit opt-in or alternative.
This code file contains natural-language strings that force a specific language/locale for usage instructions and CLI interaction. Under the policy, a skill should not impose a language without giving the user a choice unless the constraint is clearly documented and justified as region-specific.