T01 · Skill Instruction Hijacking
- Location
script/note-generator-script.py:76- Finding
Fixed Third-Party Attribution Injected into Generated Reports
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a coherent book-note workflow, but it embeds Neo4j credentials and performs under-scoped database/file writes that need review before installation.
Review this skill before installing. Rotate or remove the embedded Neo4j credential, require runtime secrets, validate and parameterize Cypher inputs, use a least-privileged Neo4j account, and run in preview/dry-run mode before allowing it to write Obsidian files or mutate a database.
script/note-generator-script.py:76Fixed Third-Party Attribution Injected into Generated Reports
script/neo4j-importer-script.py:15Hard-Coded Plaintext Neo4j Credentials
script/neo4j-cypher-generator-script.py:156Cypher Injection Through Unvalidated Relationship Types and Property Values
book-extractor.md:377Unpinned Third-Party Dependency Installation Instructions
The file embeds a plaintext Neo4j username and password, which is a direct credential exposure. Anyone with access to the skill content can reuse those credentials to access or modify the database, and the surrounding context makes this especially dangerous because the same document also describes write-capable import operations.
The skill instructions, file names, templates, and examples are entirely in Chinese, which effectively imposes a specific language on users and downstream outputs. There is no indication that users may choose another language or that the Chinese-only format is required for a region-specific compliance reason.
The skill explicitly creates directories and later overwrites progress files, but it does not clearly warn the user that local files under F:\Obsidian will be created or modified. This can cause unintended data loss or integrity issues, especially because update_progress_file writes back to an existing markdown file and the workflow is designed to run automatically across many chapters.
The workflow sends extracted book content, concepts, and relationships into Neo4j-related components without a clear privacy or integrity notice. Even if the Neo4j instance is local, this still propagates potentially sensitive copyrighted or private content into another system, increasing exposure and the risk of unintended retention, corruption, or later exfiltration.
The skill is explicitly designed to read local files from a fixed drive path and emit full chapter contents plus path metadata in structured output. Without a prominent warning, users may unknowingly expose sensitive local documents, document names, filesystem structure, or copyrighted/full-text content to downstream modules or logs.
The skill instructions, operational sections, and examples are written entirely in Chinese, which effectively imposes a language choice on users and operators. There is no statement that the skill is region-specific, no opt-in for language preference, and no alternative locale guidance.
The skill is explicitly designed to execute batches of database-modifying Cypher statements, but it does not include a clear warning that running it will mutate the target Neo4j instance or require explicit confirmation. In an agent setting, that increases the risk of unintended destructive or unauthorized data changes if upstream input is wrong, malicious, or insufficiently reviewed.
The recovery strategy explicitly says duplicate-node style errors should be recorded as warnings and later batches should continue. In the actual batch handler at L087-L096, any non-empty errors array causes the batch to be returned as unsuccessful, with no branching for ConstraintViolationError or warning-only handling.
The error recovery section states that temporary network failures will be retried up to 3 times with a 1-second interval. However, the only execution function shown at L066-L116 performs a single Invoke-WebRequest inside one try/catch and immediately returns on exception, with no retry loop or delay.
The skill explicitly specifies writing generated notes to a local filesystem path under F:\Obsidian\<书名>\... without any user consent, safety notice, or constraints on when file writes are allowed. In an agent setting, instructions that normalize persistent file creation can cause unintended local writes, overwrite existing notes, or enable path manipulation if fields like book title or chapter title are not sanitized by the downstream script.
This code file contains natural-language strings such as the module docstring, function docstrings, error messages, and console output entirely in Chinese. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale restriction is explicitly justified, which is not present here.
The skill's natural-language docstrings, status messages, generated markdown content, and output labels are consistently hard-coded in Chinese, indicating a fixed language choice. There is no visible option for the user to select language or locale, and no documented justification that this is a region-specific skill.
The module docstring and class/method documentation describe coordinating a book learning process, generating notes, and tracking progress. The code also performs graph-database imports via neo4j_importer.import_batches, which is a distinct persistence capability and not clearly implied by a generic 'coordinator' purpose when no manifest is available to justify database modification.
This code automatically creates and overwrites markdown files under F:\Obsidian\{book_title} as part of start_learning, including the progress file and final summary report. Although there are print statements after or during execution, there is no upfront user-facing warning, confirmation, or docstring disclosure at the entrypoint that running the skill will modify files in the user's notes directory.
This code file contains user-facing natural-language descriptions and comments in Chinese only, including the module docstring and method documentation. Under the policy, forcing a specific language without user opt-in or a documented justification is a natural-language policy violation.
The file’s user-facing natural-language descriptions and logs are primarily written in Chinese, including the module docstring and runtime messages, but there is no indication that the user can choose language or that the skill is intended only for a Chinese-speaking environment. This creates a locale policy concern because the skill appears to impose a specific language by default.
The code claims to verify a Neo4j import, but _verify_import does not query the database and instead sets imported counts equal to expected counts derived from the input batches. This can falsely report success even when no data was written, causing operators or downstream automation to trust an import that never actually happened or only partially completed.
This code file contains natural-language descriptions and output strings exclusively in Chinese, including the module docstring and runtime messages. Under the policy, forcing a specific language without user opt-in or a justified locale scope is a natural-language policy violation.
The class docstring and note template headings are user-visible content and are hardcoded in Chinese. The file does not provide an alternative language option or indicate that the skill is restricted to a Chinese-speaking audience.
The entire skill description, prompts, and expected interaction are presented in Chinese, which can amount to a language policy constraint if users are not given an explicit choice. The file does not state that the locale is region-specific or provide an opt-in mechanism for Chinese-language operation.
The batching table states that concept batches should contain 3-5 items and relationship batches 2-3 items, implying a required invariant. However, the sample output and example later in the file produce a concept batch with count 2 and 1 and relationship batches with count 1, so the documented rule contradicts the demonstrated behavior.
The checklist requires every concept batch to have 3-5 items and every relationship batch 2-3 items. Yet the output examples include concept batches of 1 and 2 items and relationship batches of 1 item, so the validation guidance actively conflicts with the documented/generated behavior.
The note claims both CREATE INDEX IF NOT EXISTS and IF NOT EXISTS are used to ensure idempotency. But the example concept-import statements at L362 and L488 use plain CREATE for nodes, and no IF NOT EXISTS pattern is shown for entity creation, so the documentation overstates what the code/examples do.
The skill's title, purpose, and operational instructions are presented in Chinese, which effectively imposes a language choice on users without documented opt-in. Under the stated policy, forcing a specific language without giving the user a choice is a natural-language policy concern.
The function claims to validate the book path and even defines a restrictive path pattern, but never enforces it. As a result, any existing .docx or .pdf path is accepted, which can let an attacker steer the workflow to unexpected files, causing unauthorized reads and subsequent writes into note storage and Neo4j based on attacker-chosen content.
No suspicious patterns detected.