T01 · Skill Instruction Hijacking
- Location
SKILL.md:145- Finding
Mandatory Output and Instruction Hijacking Through Skill-Level Directives
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill has a coherent bidding-document purpose, but it needs Review because its scripts can exceed the declared local file read/write boundaries.
Install only if you are comfortable uploading sensitive tender and bid files to the named vendor service under your Api Key. Confirm each file path before upload, avoid passing unrelated local paths, use a dedicated output folder, and watch for files created in both biaoshu-bailian-files and ~/.zcm.
SKILL.md:145Mandatory Output and Instruction Hijacking Through Skill-Level Directives
scripts/zcm_lib/files.py:23Arbitrary Readable Local Files Can Be Uploaded to the Remote API
scripts/zcm_lib/storage.py:62Persistent State Is Written Outside the Declared Filesystem Boundary
scripts/report_lib/generator.py:12Unrestricted Output Paths and Unsanitized Report Basenames Permit Arbitrary File Overwrite
scripts/zcm_lib/http_client.py:40Authenticated HTTP Requests Do Not Enforce Redirect Origin Restrictions
Referenced artifact was not completely inspected
**升级 skill 必须保留配置**:如果当前已安装目录存在 `config.json`,升级时不得删除、覆盖或替换该文件;只能更新 `SKILL.md`、`scripts/`、`references/` 等 skill 内容文件。本地生成目录 `biaoshu-bailian-files/` 也必须保留。
The trigger conditions are extremely broad and include common conversational intents around bidding, document review, and drafting, increasing the chance the skill auto-activates on ambiguous requests. In this skill's context, unintended invocation is more dangerous because activation can lead to reading local files, writing outputs, and uploading sensitive commercial documents to a remote vendor service.
The skill declares that attachment URLs, file streams, and base64 data are not exfiltrated to third parties, but elsewhere explicitly states that user tender/bid files are uploaded to the vendor cloud for processing. This creates a material transparency and consent problem: users may rely on the denial language and provide sensitive procurement documents without understanding that off-device transfer occurs.
All user-facing instructions and required phrasing in this file are written exclusively in Chinese, including directives on how information should be presented to users. There is no indication that the skill supports user language selection or that the Chinese-only constraint is required for a region-specific compliance reason.
SQP-3 applies to all file types and covers language or locale policy violations. The file presents all instructions and user-facing workflow guidance only in Chinese, with no indication that the skill offers multilingual support, user opt-in, or that it is intentionally limited to a Chinese-speaking/regional context.
This markdown file contains user-facing operational documentation only in Chinese, and there is no statement that the skill is region-specific or that users may choose another language. Under the policy, forcing a specific language without opt-in can be a natural-language policy violation.
This markdown file describes billing-impacting behavior and explicitly says that before generation there is no insufficient-balance warning and no balance-blocking. Because the skill documentation covers actions that consume user credits, omitting or negating a user warning is a safety-relevant disclosure issue for markdown under the missing user warnings category.
The file instructs the assistant to present risk levels directly in Chinese, which imposes a specific language choice on user-facing output. There is no indication here that the user may choose another language or locale, nor that the constraint is justified as a region-specific language requirement.
This code hard-codes report titles, section headings, and labels in Chinese, and the pattern continues throughout the file. That creates a language/locale policy concern because users are not offered a language choice or opt-in, and no region-specific justification is documented in the file.
The generated HTML hard-codes lang='zh-CN', which enforces a specific language/locale for all rendered reports. Under the policy, locale constraints should either be optional for the user or clearly documented as justified for a region-specific tool; this file provides no such opt-in or justification.
The file emits natural-language messages in Chinese in _die paths, which forces a specific language for user-visible output. The provided policy requires flagging language or locale constraints unless the skill offers user opt-in or clearly documents a justified regional limitation.
This line presents a user-visible error entirely in Chinese, again imposing a fixed language choice. There is no indication in this file that the locale is configurable or that the restriction is explicitly justified.
The file-not-found message is another user-facing string fixed to Chinese, which may violate organizational language-choice policy. No opt-in, fallback, or documented regional constraint is visible in this file.
This code emits multiple natural-language status and error messages in Chinese, and later continues that pattern throughout the file for user-visible output. Because the skill forces a specific language in its natural-language interaction without any opt-in or alternative locale handling, it violates the language/locale policy criteria.
Tool defaults are unsafe or overly permissive (e.g. disabled TLS verification, no authentication, world-writable permissions). Unsafe defaults widen the attack surface.
contract_snapshot,
funcs,
description,
include_skillhub_auth=False,
allow_remote_files=False,
include_feedback=False,
):
This code formats output using Chinese-only strings such as “分钟”, “小时”, and “天”, and later continues with Chinese-only progress messages. That forces a specific language/locale in user-visible output without any indication of user choice or documented region-specific scope.
The file hard-codes Chinese translations for risk and priority values and later emits Chinese-only status messages. This indicates a fixed language choice in user-facing behavior without any visible configuration, opt-in, or documented locale justification in the file.
L135 says generation does not perform balance-insufficiency warning or blocking before submission. But L161 states that before submission the script will precheck available balance, which is an active contradiction about whether pre-submission balance checks occur.
The workflow explicitly instructs the skill to download a generated file locally when the user asks for a local file, but it does not require an explicit confirmation or warning that the action will write to the user's filesystem. In an agent context, local file writes are sensitive because they can create unexpected artifacts, overwrite user expectations about where data is stored, and expand the consequences of prompt injection or accidental misuse.
The file explicitly states that when semantic review is incomplete or only a partial summary is available, callers must truthfully describe the output as partial. However, this file is purely API documentation and does not define any mechanism that enforces that requirement; the documented behavior still returns partial_summary and semantic-review status fields that downstream code could ignore. This creates an intent-behavior gap within the documentation itself about how results should be represented.
The only natural-language documentation in this file is entirely in Chinese, and the file does not indicate that language choice is optional or that the skill is region-specific. Under the stated policy, forcing a specific language without user opt-in can be a locale-policy violation.
Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.
from zcm_lib import cli as _cli
globals().update({name: getattr(_cli, name) for name in dir(_cli) if not name.startswith("__")})
if __name__ == "__main__":
The code emits a hard-coded Chinese message string ("请求失败 HTTP ...") for HTTP failures. This enforces a specific language in user-facing output without any visible opt-in or locale selection, which matches the language/locale policy violation criteria.
The --version string is hard-coded in Chinese, which imposes a specific language choice on all users of the CLI. The file does not offer any language selection or document this as a justified locale-specific constraint.
Detected: suspicious.dynamic_code_execution