Back to skill

Security audit

Character Manager

Security checks for vulnerabilities and agentic risk

Overview

This is a mostly coherent local character-management skill, but it gives broad file read, overwrite, and deletion authority without enforcing project boundaries.

Install only if you are comfortable with a local CLI that can read YAML recursively from any directory you pass and can overwrite or delete files at paths you provide. Use it in a dedicated novel workspace, avoid absolute paths to sensitive locations, avoid --force unless you have checked the exact target file, and prefer a virtual environment with reviewed pinned dependencies.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
Findings (2)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/manage_characters.py:348
Finding

Unrestricted Paths Permit Arbitrary File Overwrite, Recursive Read, and Deletion

Content
View full analysis
Remediation
View remediation
/characters`. - Set reasonable limits on file count and file size. - Confirm that every discovered file remains within the approved resolved root. 6. **Enforce controls in code** - Keep the documentation warnings, but do not rely on them as the security boundary. ]]>

T08 · Insecure Dependencies

Note
Location
requirements.txt:1
Finding

Unpinned Dependencies Make Installations Non-Reproducible

Content
View full analysis
=6.0.1 rich>=13.7.0 ``` The documented installation command is: ```bash pip3 install -r requirements.txt --user ``` ### Technical Analysis Both dependencies use lower-bound version constraints. A new installation may therefore select any future release that satisfies those constraints. The project provides no reviewed lockfile, exact version pins, or package hashes. The package names are legitimate and correspond to the implementation's stated functionality. No typosquatted package, untrusted package index, direct URL, or known malicious package was identified. The weakness is that future installations are not reproducible and automatically trust newly published compatible releases. ### Attack Path 1. A future package release is compromised, maliciously replaced, or contains a newly introduced vulnerability. 2. A user runs the documented installation command. 3. Package resolution selects that newer release because the requirement specifies only a minimum version. 4. The package may execute installation-time behavior or be imported by `manage_characters.py`. 5. The compromised dependency then runs with the privileges of the user invoking installation or the Skill. ### Impact Assessment A compromised dependency could execute code with the installing user's permissions and access files or resources available to that account. No current malicious dependency was found, so this is a preventive supply-chain risk rather than evidence of an active payload. ]]>
Remediation
View remediation
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (12)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The code broadly matches the stated domain and primary purpose: it is a local character manager for fiction projects that reads/writes YAML character files and supports create, list, query, update, delete, and export. It does not show malicious or unrelated behavior. However, the description claims support for role relationship networks, emotional arcs, and motivation tracking as core capabilities. In practice, motivation is partially supported, relationships are only minimally represented and displayed, and emotional arcs are present only in the schema without effective CLI management. Additionally, the script advertises validate and visualize-relations capabilities but never dispatches them in main(), so those features are effectively not implemented. This makes the declared description materially more capable than the actual behavior.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill documents file read/write behavior through --project and --output but does not declare any explicit tool scope such as permissions or allowed-tools. In an agent environment, this weakens least-privilege controls and increases the chance that the skill can be invoked with filesystem access broader than intended, especially since the documentation itself admits arbitrary directory paths can be supplied.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This code file performs a destructive operation by deleting a file, and the --force path explicitly bypasses the interactive confirmation. While normal deletion prompts the user, there is no additional user-facing warning, log emphasis, or docstring/comment disclosure that --force will irreversibly remove the target file immediately.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The --format argument explicitly documents markdown, json, and yaml as valid export formats, but the only export implementation is export_to_markdown, and the dispatch always calls that function regardless of the selected format. This is an active contradiction between the CLI documentation/interface and the code's actual behavior.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The module documentation and argument parser present this tool as supporting validate and visualize-relations operations, which align with the manifest's promises around relationship networks and tracking character growth. However, the command-dispatch logic only handles create/list/query/update/delete/export; there is no implementation for the advertised validation or visualization paths, so the actual behavior falls short of the described capabilities.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
78% confidence
Finding

The file uses Chinese-only natural-language values for the character name and role, which can imply a fixed language/locale presentation without offering user choice. Under the policy rule, locale-specific content should either provide opt-in or be clearly justified as region-specific.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

This manifest-style YAML file uses natural-language descriptions and labels exclusively in Chinese across the entire configuration. Under the policy, forcing a specific language without user opt-in can be a locale-policy violation when no alternative language choice or justification is provided.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

该 markdown 文件全文以中文撰写,且未说明这是面向特定中文用户群体的区域化文档,也未提供语言选择或用户自愿采用中文的机制。根据规则,若技能在自然语言层面强制特定语言而没有用户 opt-in,可视为语言/区域策略违规。

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
95% confidence
Finding

The dependency is specified with a lower-bound only (pyyaml>=6.0.1), which makes builds non-reproducible and allows future installs to resolve to different versions over time. This increases supply-chain risk and makes it harder to verify whether a deployed version includes security fixes or newly introduced issues, especially for a package with a history of deserialization-related advisories.

Content

Scanner excerpt · requirements.txt (reported line 1)May include surrounding context.

text
pyyaml>=6.0.1
rich>=13.7.0

Unverifiable Dependency: pyyaml has 8 known advisory(ies) (CVE-2019-20477 (Deserialization of Untrusted Data in PyYAML); CVE-2020-1747 (Improper Input Validation in PyYAML); CVE-2020-14343 (Improper Input Validation in PyYAML) +5 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
90% confidence
Finding

PyYAML has multiple historical security advisories, and because the manifest does not pin an exact version, it is not possible to verify whether deployed environments will receive a fixed or affected release. In a character-management skill that may plausibly import or export structured character data, YAML parsing could become dangerous if untrusted content is ever accepted and unsafe loaders are used.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
89% confidence
Finding

The rich dependency is also unpinned (rich>=13.7.0), so installations may resolve to different versions in different environments. While this is primarily a supply-chain hygiene issue rather than an immediate exploit path, it weakens reproducibility and can introduce unexpected vulnerable or breaking releases later.

Content

Scanner excerpt · requirements.txt (reported line 2)May include surrounding context.

text
pyyaml>=6.0.1
rich>=13.7.0

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

Natural-language strings in the module description and CLI help are written exclusively in Chinese, with no indication that users may choose another language or locale. Under the policy, forcing a specific language without opt-in is a natural-language policy violation unless the locale restriction is explicitly documented and justified.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.