Back to skill

Security audit

Humanizer-DE

Security checks for vulnerabilities and agentic risk

Overview

This is mostly a coherent offline German text-checking skill, but its optional CLI fixer writes predictable local files in a way that can overwrite user-writable targets.

Review the CLI before using the fix command. Use score, analyze, and suggest freely for local text review, but avoid running fix inside shared, extracted, temporary, or otherwise untrusted writable directories until the output write is hardened. Also manually review rewritten text for factual fidelity because the humanizing examples can add personal-sounding details.

Vulnerability Patterns
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/humanize-de.js:1257
Finding
Predictable Output Path Allows Symbolic-Link File Overwrite## Vulnerability Details **File Location**: `scripts/humanize-de.js:1257-1258` **Vulnerability Type**: Symbolic-link following and unsafe predictable output file **Risk Level**: Medium ### Complete Code Snippet ```js const outPath = path.join(dir, `${base}.fixed${ext}`); fs.writeFileSync(outPath, fixed, 'utf-8'); ``` ### Technical Analysis The `fix` command derives a predictable output path from the input filename and writes to it unconditionally. Node.js `fs.writeFileSync()` follows an existing symbolic link, while this implementation does not inspect the destination with `lstatSync()`, reject symbolic links, request exclusive creation, or obtain confirmation before replacing an existing file. An attacker who can create files in the input directory can therefore prepare the expected output path as a symbolic link to another file writable by the user running the command. When the user invokes `fix`, the linked target is truncated and replaced with the transformed document. The backup logic does not prevent this issue because the vulnerable write affects the separate `.fixed` destination. ### Attack Path 1. A victim has an input file named `document.md` in a shared or attacker-controlled directory. 2. The attacker predicts that the command will write to `document.fixed.md`. 3. The attacker creates `document.fixed.md` as a symbolic link to a target file that the victim can modify. 4. The victim runs: ```bash node scripts/humanize-de.js fix document.md ``` 5. `fs.writeFileSync()` follows the symbolic link and truncates the linked target. 6. The target is replaced with the transformed contents of `document.md`. ### Impact Assessment Exploitation permits overwrite of any file writable by the invoking user and reachable through the prepared symbolic link. Potential consequences include data loss, corruption of user configuration, or modification of scripts and other files later consumed by trusted ap ...[truncated 348 chars]
Remediation
## Remediation Suggestions 1. Refuse to use an existing output destination by opening it with exclusive creation: ```js const fd = fs.openSync(outPath, 'wx', 0o600); try { fs.writeFileSync(fd, fixed, 'utf8'); } finally { fs.closeSync(fd); } ``` 2. Before writing, use `fs.lstatSync()` when the path exists and explicitly reject symbolic links and non-regular files. Treat this as defense in depth rather than relying on a separate check alone, because check-then-write sequences can be subject to race conditions. 3. Use no-follow filesystem semantics where the platform and Node.js version support them. Combine no-follow behavior with exclusive creation to prevent both symbolic-link traversal and unintended replacement. 4. Avoid predictable destinations in shared directories. Create output through a securely generated temporary filename in a trusted directory, then atomically rename it only after validating the final destination. 5. Require explicit user confirmation before replacing any existing `.fixed` file, or fail safely and ask the user to choose another path. 6. Apply equivalent safeguards to the `.bak` destination so future changes cannot introduce the same symbolic-link issue in backup creation. 7. Document that input and output operations should not be performed in untrusted writable directories until secure destination handling is implemented.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (25)

Vague Triggers

Medium
Confidence
91% confidence
Finding
The trigger "Check diesen Text" is broad enough to overlap with normal conversational requests, which can cause the skill to activate unintentionally. In an agent environment, ambiguous activation increases the chance of processing user content in the wrong mode or invoking the skill without clear user intent.

Vague Triggers

Medium
Confidence
94% confidence
Finding
The triggers "Humanisiere das" and "Mach das menschlicher" are vague, high-frequency phrases that may appear in ordinary editing conversations. That makes accidental skill invocation more likely, especially because these commands can rewrite user text rather than just score it.

Natural-Language Policy Violations

Medium
Confidence
87% confidence
Finding
Die Metadaten und Regeln legen Deutsch als feste Sprache fest, insbesondere "Sprache: Deutsch" und "Deutsch. Alle Muster, Vokabeln und Vorschläge sind auf Deutsch." Das stellt eine Sprachvorgabe dar, ohne dass dem Nutzer eine Sprachwahl oder ein explizites Opt-in angeboten wird.

Vague Triggers

Medium
Confidence
90% confidence
Finding
Die Trigger wie 'Humanisiere das' oder 'Mach das menschlicher' sind sehr breit und alltagssprachlich, sodass der Skill unbeabsichtigt auf normale Unterhaltung oder fremde Inhalte anspringen kann. In einem Agentensystem kann das zu unerwarteter Texttransformation, Fehlaktivierung oder Umgehung der Nutzerintention führen, besonders wenn sensible oder unveränderte Inhalte erhalten bleiben sollten.

Natural-Language Policy Violations

Medium
Confidence
92% confidence
Finding
This markdown file consistently instructs use of German content and commands, including a German-only workflow description and a next-step directive to continue work in German. Because the file does not offer any user opt-in or alternative language choice, it creates a natural-language locale constraint that may violate language-choice policy.

Vague Triggers

Medium
Confidence
95% confidence
Finding
The command triggers are generic everyday German phrases such as 'Humanisiere das' and 'Mach das menschlicher', which are likely to overlap with normal user requests outside an explicit skill invocation flow. This can cause accidental activation or routing of unrelated text into the skill, increasing the chance of unintended text transformation or analysis in contexts where the user did not intend to use this capability.

Natural-Language Policy Violations

Medium
Confidence
90% confidence
Finding
This markdown file presents all instructional content and examples exclusively in German, and there is no indication that users can opt into another language or that the skill is intentionally limited to a German-only context. Under the language/locale policy, forcing a specific language without user choice can be a natural-language policy violation.

Natural-Language Policy Violations

Medium
Confidence
82% confidence
Finding
The title labels this as a German reference, and the entire skill content is written as German-only guidance. Under the policy rule, forcing a specific language without user opt-in can be a natural-language policy violation when no alternative or choice is provided.

Natural-Language Policy Violations

Medium
Confidence
95% confidence
Finding
The skill is written to produce German-language stylistic output and examples without indicating that language should follow the user's request. In a multilingual agent, this can silently override user preference or system behavior, causing integrity issues in outputs and making prompt-control less predictable.

Vague Triggers

Medium
Confidence
91% confidence
Finding
The phrase stating these techniques are applied on the 'Humanisiere' command creates an implicit trigger without clearly defining scope, precedence, or user consent. In a larger agent system, an ambiguous activation phrase can cause unintended stylistic transformation of content, potentially overriding task intent or applying prompt-like behavior when the user did not explicitly request this skill.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding
Suspicious Unicode normalization or mixed-script content

Natural-Language Policy Violations

Medium
Confidence
90% confidence
Finding
The description states it works for any German text and defines invocation behavior in German, indicating a language-specific constraint. The file does not offer user opt-in or explain why German-only handling is required, which can violate language/locale policy expectations.

Vague Triggers

Medium
Confidence
95% confidence
Finding
The activation phrases are very broad natural-language requests ('Humanisiere das', 'Mach das menschlicher') that can easily appear in ordinary conversation. This increases the chance of unintended invocation, causing the skill to rewrite text when the user may have meant something less invasive or different, which is especially risky because the skill is permitted to alter tone and wording across arbitrary content.

Intent-Code Divergence

Medium
Confidence
95% confidence
Finding
The file explicitly claims the layer does not add personal opinion, but the provided example injects first-person experience and subjective evaluation that were not present in the source text. In a rewriting skill, this can cause semantic drift and fabricated attribution, making outputs misleading and potentially unsafe in contexts where factual fidelity matters.

Intent-Code Divergence

Medium
Confidence
93% confidence
Finding
The layer states that facts, arguments, and structure remain unchanged, yet the example adds new factual content and drops unsupported attribution like 'Studien zeigen'. That creates a reliability issue: users may believe a rewrite preserves meaning when it can instead alter evidence, introduce hallucinated specifics, or weaken provenance.

Natural-Language Policy Violations

Medium
Confidence
91% confidence
Finding
The skill is entirely written to enforce a German-language, German-cultural output style without indicating any need for user consent or language negotiation. If applied automatically, it can override the user's preferred language or locale, reducing usability, causing policy mismatches, and making outputs inappropriate in multilingual contexts.

Vague Triggers

Medium
Confidence
95% confidence
Finding
The trigger phrase 'Humanisiere das im Lesch-Stil' is relatively generic and could plausibly appear in ordinary user requests, causing this style layer to activate unintentionally. Because the layer imposes strong stylistic constraints and overrides normal output behavior, accidental activation can steer responses away from user intent and create prompt-routing ambiguity.

Natural-Language Policy Violations

Medium
Confidence
94% confidence
Finding
The entry "Last but not least" → "Deutsch schreiben" instructs users to enforce a specific language choice. This is a natural-language locale policy constraint, and the file does not offer user choice or document a justified region-specific requirement.

Intent-Code Divergence

Medium
Confidence
97% confidence
Finding
The top-level docblock identifies the script as a 'Deutscher KI-Text-Detektor', which frames it as a detection/analysis tool. However, the documented commands include 'fix' that performs automatic replacements and later code writes both a backup and a modified file, so the documentation's primary characterization as a detector contradicts the actual edit-and-write behavior.

Natural-Language Policy Violations

Medium
Confidence
91% confidence
Finding
The header and CLI description present the tool as a 'Deutscher KI-Text-Detektor' and all commands, labels, and heuristics are hard-coded for German. For SQP-3, this is a natural-language locale policy issue because the skill forces a specific language experience without any opt-in, fallback, or explicit justification that it is limited to a German-only compliance/domain context.

Natural-Language Policy Violations

Low
Confidence
88% confidence
Finding
Mit "Sprache: Deutsch" und der durchgehend deutschsprachigen Beschreibung wird eine feste Sprachvorgabe kommuniziert. Es fehlt ein Hinweis darauf, dass dies ein optionaler, deutschspezifischer Skill ist oder dass Nutzer eine Sprachwahl haben, was als Locale-Vorgabe ohne Opt-in gelesen werden kann.

Intent-Code Divergence

Low
Confidence
86% confidence
Finding
Die Aussage 'Kein Netzwerk ... Alles funktioniert offline' wird durch den späteren Verweis auf ein Web-Dashboard abgeschwächt bzw. widersprüchlich. Solche Widersprüche können Nutzer über Datenschutz- und Netzwerkverhalten fehlleiten; in Agent-Ökosystemen ist unklare Zusicherung zu Offline-Betrieb sicherheitsrelevant, auch wenn hier kein direkter Exfiltrationsmechanismus beschrieben wird.

Context-Inappropriate Capability

Low
Confidence
81% confidence
Finding
The skill is described throughout as a German AI-text detector/humanizer that works offline on provided text, with an explicit 'Kein Netzwerk' statement for the skill itself. The integration section additionally advertises an external dashboard URL, which is a network-oriented capability not justified by the core text-analysis purpose described elsewhere in the file.

Natural-Language Policy Violations

Low
Confidence
82% confidence
Finding
The metadata sets the skill language to "de", and the description and commands are entirely German, but there is no indication that users can opt into this locale or that the restriction is explicitly justified in-policy. This can be a language/locale policy issue when the skill appears generally applicable rather than clearly region-specific.

Intent-Code Divergence

Low
Confidence
99% confidence
Finding
The usage string for 'fix' says it writes '<datei>.fixed.md', implying a single output artifact. In implementation, the fix path also creates a backup '<original>.<ext>.bak' when absent before writing the fixed file, which is an extra filesystem side effect not reflected in the command description.

Static analysis

No suspicious patterns detected.