Back to skill

Security audit

One Novel Skill

Security checks for vulnerabilities and agentic risk

Overview

This is a real novel-writing skill, but it needs review because it can broadly modify project files, run commands, persist writing memory, and automatically use discovered LLM providers with manuscript content.

Install only in a dedicated writing workspace. Do not enable local/provider mode or set API keys unless you are comfortable sending outlines, chapters, prompts, and project state to the selected LLM provider; avoid untrusted custom endpoints. Avoid rollback/import paths supplied by untrusted sources, and expect the skill to persist project memory and preferences. Be careful with the anti-detection features, especially where authorship disclosure is required.

Vulnerability Patterns
  • Tool Hijacking and SpoofingModifies or replaces tools so legitimate-looking calls execute attacker logic
  • 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)

T07 · Tool Hijacking and Spoofing

Warning
Location
engine/generator.py:505
Finding

Unauthenticated File-Based LLM Session Allows Prompt Disclosure and Response Spoofing

Content
View full analysis
str: try: uid = str(int(time.time() * 1000)) req_dir = self._SESSION_DIR os.makedirs(req_dir, exist_ok=True) req_path = os.path.join(req_dir, f"request_{uid}.json") resp_path = os.path.join(req_dir, f"response_{uid}.json") req = { "system": system, "user": user, "temperature": temperature, "timestamp": uid, } with open(req_path, "w", encoding="utf-8") as f: json.dump(req, f, ensure_ascii=False, indent=2) deadline = time.time() + 300 while time.time() < deadline: if os.path.exists(resp_path): try: with open(resp_path, "r", encoding="utf-8") as f: resp = json.load(f) text = resp.get("text", "") if text and len(text) > 50: os.remove(req_path) os.remove(resp_path) return text except (json.JSONDecodeError, OSError): pass time.sleep(0.5) logger.error(f"SessionProvider: timeout waiting for {uid}") return "" ``` ### Technical Analysis The session transport writes complete system prompts and user content to a shared relative directory named `_llm_session`. The filenames are derived solely from the current time in milliseconds and are therefore predictable. The implementation does not: - Create the session directory with explicit owner-only permissions. - Create request files atomically with restrictive permissions. - Use cryptographical ...[truncated 2341 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
run.py:136
Finding

Unrestricted Rollback Path Can Overwrite Files Outside the Active Project

Content
View full analysis
Remediation
View remediation
/_backup`. 7. Refuse to overwrite existing destination files unless the user explicitly confirms or passes a dedicated overwrite option. 8. Perform restoration through an atomic temporary file and rename operation. 9. Preserve the source backup by default instead of renaming it immediately after restoration. 10. Validate backup filenames with a strict regular expression and reject malformed or unexpected entries. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (433)

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The description advertises a complete novel-creation system with extensive writing-specific features and broad LLM backend support. The provided code chunk is only a minimal package init.py that re-exports StateAdapter. On its own, this code does not demonstrate the declared primary purpose or capabilities. Because the visible behavior is limited to module export plumbing and lacks evidence of the advertised functionality, the description does not accurately represent what this supplied code chunk actually does.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The declared description presents a user-facing novel generation/orchestration skill with writing assistance, anti-detection safeguards, multi-model LLM integration, and autonomous end-to-end book creation. The supplied code does not implement text generation, LLM access, model routing, anti-AI protection, detection checks, review pipelines, or authoring workflow logic. Instead, it is infrastructure code for managing and persisting application state for a novel project. While such state handling could support a larger novel-writing system, this chunk’s actual purpose is materially different from the declared feature set, so the description does not accurately represent what this code chunk does.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

The declared description presents a user-facing novel-writing skill with multi-model LLM integration, creative workflow automation, anti-AI defenses, and narrative review/validation features. The supplied code does not implement novel generation, LLM routing, provider integration, content creation, or the advertised detection/protection systems. Instead, it is backend infrastructure for transaction handling and persistence. While pre-commit hooks and state coordination could support a larger novel-writing system, this chunk’s actual primary purpose is generic unit-of-work/state consistency management, which is materially different from the declared skill behavior.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

代码的主要用途并不是“融合级中文小说创作”,而是对已有文本进行内容安全检查。它通过敏感词表、正则模式、否定词邻近判断、上下文白名单等机制,将文本标记为 PASS/WARN/FLAG/BLOCK,并输出命中项和风险等级。这属于审核/过滤工具,而非创作引擎。虽然声明中提到“多层检测”“审查”,可勉强与检测类辅助功能有一定关联,但该代码片段完全没有体现生成小说、管理写作流程、调用任意模型端点、时间线校验或反AI防护等被重点宣传的核心能力。因此描述与实际行为存在明显不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

该代码块的主职责非常明确:定位“正文”目录下的章节文件,调用检测器(run_all_detectors),更新“追踪”数据(update_tracker),做简单一致性检查,并打印报告。注释中还明确写明“只编排检测+追踪部分。章节生成和 spec 规划仍由 LLM 对话完成”。这与声明中的核心承诺——自动完成小说创作、支持多LLM后端、安装即用的写作技能——存在实质差异。虽然声明里提到检测、防护、时间线校验等元素,与代码中的“检测/追踪/一致性检查”有部分相关性,但这只是整个创作能力中的辅助子模块,不能代表声明的主要功能。因此应判定为描述与实际代码行为不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

该代码块的主功能是‘检测’而不是‘创作’。它读取输入文本文件,运行多种规则与统计检测器,检查禁用词、模板化表达、Markdown残留、ChatGPT痕迹、句长/标点基线、主语分布、句式模式、风格细节等,并依据加权投票给出“人类创作/疑似AI/AI创作特征”分类。还支持可选的内容安全过滤。相比之下,声明描述的是一个中文小说写作技能,强调从零创作、长篇日更、多模型兼容和创作工作流支持。两者在核心用途上存在明显差异:一个是生成/创作助手,另一个是AI痕迹审查与内容检测工具。因此应判定为描述与实际行为不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

声明描述的是一个功能非常广泛的小说创作与多模型适配平台,但这段代码只实现了其中一个很窄的辅助脚本:根据章节规格文件更新“角色状态.md”和“伏笔.md”。它是本地内容追踪/同步工具,而不是小说写作主流程、模型路由器、反AI检测系统或审查框架。虽然可以认为追踪更新属于小说创作生态的支持性细节,但声明将技能的核心能力描述为自动创作与多层防护/多模型兼容,而代码并未体现这些主要能力,因此描述与实际行为存在明显不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

声明描述聚焦于小说创作能力、反AI防护、L2检测、创作审查、时间线校验以及多LLM提供商适配;而给出的代码块并未实现任何小说生成、内容审查、反AI检测、模型路由或多厂商接入逻辑。相反,它是一个与业务相对无关的可靠性工具模块,用于保护下游调用、重试失败任务,并做章节是否已写的本地文件检查。虽然这类组件可能作为大型创作系统的支撑实现细节存在,但就这段代码本身而言,其实际行为与声明的核心用途不一致,属于明显的描述-行为不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

声明描述的是一个完整的中文小说创作与多模型接入系统,而提供的代码片段只是底层框架组件:定义 EngineBase 抽象类以及 EngineRegistry 注册/发现/调用机制。该代码没有任何与小说写作、文本生成、模型路由、外部 API 调用、防检测策略、审查规则或时间线校验直接相关的实现。从主用途看,代码是“分析引擎插件系统基础设施”,不是“小说创作技能”本身,因此描述与实际行为存在明显不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
96% confidence
Finding

声明描述聚焦于小说创作与多层内容审查/模型适配能力,但这段代码并未体现任何小说生成、中文写作、反AI防护、L2检测、时间线校验或多模型接入逻辑。相反,它是一个基础设施层的执行框架,用于统一运行多个“引擎”任务并处理重试、错误记录和汇总统计。虽然这种执行器可能作为更大创作系统的底层支持组件,但就该代码块本身而言,其主要目的与声明用途存在明显偏离,因此应判定为描述与行为不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

声明描述的是一个功能非常全面的中文小说创作平台/工作流系统,重点在生成式创作、审查防护、流程管理和多模型兼容。而提供的代码块只是一个“algorithm”分析引擎:通过正则和Counter对中文文本做重复词检测、n-gram频率统计、模式提取,以及简单的章节复用检查。它没有网络访问、没有模型适配、没有调用任何LLM API、没有生成小说内容、也没有实现描述中强调的多层检测与校验框架。因此代码实际行为与声明用途在主功能上明显不一致,应判定为描述与行为不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

声明强调的是“小说创作代理/写作系统”,核心承诺是替用户完成从开书到持续创作的生成式工作,并具备复杂的防护、审查和多模型兼容能力。但提供的代码块仅实现分析评估类静态函数,主要围绕读者留存、平台指标、书名/文本质量和商业潜力进行诊断。这些分析能力可能与写作辅助相关,但它们不足以支撑声明中的主要用途,且缺少最关键的文本生成、模型调用、适配器、工作流审查与防护实现。因此描述与实际行为存在明显且实质性的不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

声明描述的是一个功能完整、以小说创作为核心的复杂系统,重点在内容生成、质量控制、反AI检测规避和多模型兼容。而提供的代码块只实现了一个名为 ManagerEngine 的管理辅助模块:维护内存队列、检测文本中对话占比是否适合有声书、给出KDP系列定价/篇幅建议,以及根据固定字典返回投稿渠道建议。这些能力至多是写作生态中的外围支持功能,并不能支撑声明中的主要用途。代码也没有显示任何模型调用、文本生成、审查流程、时间线分析或防护机制。因此该描述与该代码块的实际行为存在明显且实质性的能力不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding

声明描述的是一个功能非常全面的中文小说创作平台,核心承诺是自动完成小说创作流程并集成多种模型与复杂审查机制。但实际代码片段仅实现了基于正则和启发式规则的文本质量检查,属于写作辅助中的一个子模块。虽然其中的描写质量、句式和感官检测与“小说创作辅助”方向相关,但它远不足以支撑声明中的主要能力,且缺少生成、模型接入、时间线管理、反AI机制等关键功能。因此描述与实际行为存在明显且实质性的不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

该代码块的功能范围明显小于且不同于声明描述。声明将技能定位为一个端到端的中文小说创作与审查平台,并特别强调模型接入、反AI检测、多层审查与创作流程控制;但实际代码只是一个名为 TensionEngine 的分析组件,围绕“张力/节奏”进行非常有限的启发式检测,例如统计‘拒绝/争吵’与‘靠近/拥抱’等词的比例、给章节分配五步周期标签,以及检测数值曲线跌落。这可以被视为小说分析系统中的一个支持性子功能,但无法代表声明中的核心能力,因此描述与代码行为存在实质性不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

该代码块的核心职责是“检测”而非“创作”。WritingEngine.analyze/check_polish 只调用一组静态规则检查,输出 issues/fixes 列表,没有生成文本的逻辑;compose 甚至直接返回空字符串。虽然描述中提到反AI防护、检测、审查等方向,与代码中的部分反AI写作检测存在一定相关性,但宣称的主要用途是完整小说创作助手,并强调多模型接入、零配置、自适应、长篇创作流程等重大能力,而这些在代码中完全没有体现。代码还包含 check_libraries 之类的项目结构检查,这更像配套校验工具,而不是一个安装即用的多LLM创作系统。因此描述明显夸大且与实际代码的主要行为不一致。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

声明描述的是一个面向小说生成与创作治理的完整写作系统,核心价值应体现在内容生成、审查、防护、模型适配等能力上。而实际代码仅是底层基础组件 event_bus.py,负责在不同模块之间发布和订阅事件,并记录事件日志。虽然事件名称与小说工作流有关(如章节生成、质量门、记忆冲突等),但本代码本身不执行小说创作、审查、模型调用或时间线校验,只提供通用的消息传递机制。因此,这段代码的实际主要用途与声明的技能用途存在明显不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
98% confidence
Finding

声明描述的是一个面向中文小说创作的高层生成与审查系统,并强调多模型支持与创作流程自动化。但提供的代码片段仅是底层工程组件:在异常时回滚文件和状态变更,属于通用可靠性/事务管理功能。虽然这类组件可能作为小说创作系统的内部支撑实现存在,但就该代码块本身而言,其实际行为与声明的主要用途并不相符,且包含明显未声明的文件系统恢复能力。因此应判定为描述与代码行为不匹配。

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

声明的核心用途是“中文小说创作”及相关生成、审查、防AI与多模型写作编排能力;而实际代码并不进行小说生成、内容规划、审查或模型编排,而是进行运行前环境与依赖完整性检查。虽然健康检查可能是大型写作技能的配套组件,但就该代码片段本身而言,其主要行为与声明的主要功能明显不同。此外,代码还实际访问了本地文件系统、环境变量,并对本地 Ollama 服务发起网络探测,这些能力在声明中未被明确表述。因此该描述与该代码片段存在实质性不匹配。

Content

No source excerpt is available for this finding.

Vague Triggers

High
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill is configured in a broad 'fork/general-purpose' context and uses highly generic activation language like '帮我写个小说', with additional natural-language triggers later in the file. In a general-purpose agent with file and command permissions, ambiguous invocation increases the chance the skill activates unintentionally and performs writes, edits, deletions, or command execution in contexts the user did not mean to authorize.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
98% confidence
Finding

The manifest grants powerful tools including write_to_file, replace_in_file, execute_command, and delete_file, but the user-facing description does not prominently disclose these destructive capabilities or their scope. In a general-purpose agent, this creates a meaningful integrity risk: users may think they are invoking a benign writing helper while the skill can modify or remove local data and run local commands.

Content

No source excerpt is available for this finding.

Missing User Warnings

High
Category
Not specified by scanner
Confidence
97% confidence
Finding

The skill advertises automatic discovery and use of external LLM providers based on environment state and API keys, but it does not clearly warn that user content may be transmitted to third-party services. In a writing workflow, chapters, notes, outlines, and project state can contain sensitive intellectual property or personal data, so silent network use materially increases confidentiality risk.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 449)May include surrounding context.

md
| `run.py` | CLI 入口(status/detect/generate/rollback) |

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 454)May include surrounding context.

md
| `engine/rolling_planner.py` | 指南针+视野滚动规划(长篇不一次规划全部) |

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 478)May include surrounding context.

md
| `engine/rolling_planner.py` | 指南针+视野滚动规划(长篇不一次规划全部) |