Back to skill

Security audit

Humanizer

Security checks for vulnerabilities and agentic risk

Overview

This is a coherent text-analysis and rewriting skill with some deployment and usage cautions, but no hidden or malicious behavior found.

Install this only if you want heuristic AI-style detection and rewriting assistance. Do not use its AI score as sole evidence in academic, employment, moderation, or other high-stakes decisions. Keep humanization opt-in for sensitive or quote-sensitive writing, review autofix output manually, and if you deploy the HTTP API, add authentication, request-size limits, rate limits, privacy/retention notices, and pinned deployment tooling.

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

Warning
Location
api-server/server.js:36
Finding
Unbounded HTTP Request Body Enables Remote Memory Exhaustion## Vulnerability Details **File Location**: `api-server/server.js:36-48` **Vulnerability Type**: Unbounded request-body buffering and denial of service **Risk Level**: Medium ### Vulnerable Code ```js async function parseBody(req) { return new Promise((resolve, reject) => { let body = ''; req.on('data', chunk => body += chunk); req.on('end', () => { try { resolve(body ? JSON.parse(body) : {}); } catch (e) { reject(new Error('Invalid JSON')); } }); req.on('error', reject); }); } ``` ### Technical Analysis The HTTP server appends every received chunk to an in-memory string without enforcing a maximum body size, validating `Content-Length`, imposing a request deadline, or stopping slow and incomplete uploads. Each POST request therefore permits attacker-controlled memory consumption. Once the body is received, `JSON.parse` creates an additional in-memory representation, and the supplied text is subsequently processed by multiple regular expressions and statistical-analysis routines. These operations can amplify both memory and CPU consumption. The server can be deployed for external integrations and does not implement authentication or application-level rate limiting. Consequently, any network client able to reach the service can exercise the vulnerable parser. ### Attack Path 1. An operator deploys the HTTP API on a network-accessible interface or behind a public proxy. 2. An attacker connects to `/api/score`, `/api/analyze`, `/api/humanize`, or `/api/stats`. 3. The attacker sends a very large JSON request body or keeps streaming chunks without completing the request. 4. The server continually concatenates the chunks into the `body` string. 5. One large request, or several concurrent requests, exhausts available heap memory and consumes event-loop resources. 6. The Node.js process becomes unresponsive or terminates with an out-of-memory e ...[truncated 403 chars]
Remediation
## Remediation Suggestions - Enforce a conservative byte limit while streaming the request, such as 256 KB or another limit appropriate for expected documents. - Track bytes using `Buffer.byteLength` rather than JavaScript string length. - Reject requests whose declared `Content-Length` exceeds the configured limit. - Stop processing and destroy the request as soon as the streaming limit is exceeded. - Return HTTP `413 Payload Too Large` rather than a generic server error. - Configure header and request timeouts to prevent indefinitely slow uploads. - Apply reverse-proxy limits, concurrency controls, and per-client rate limiting. - Consider processing exceptionally large documents through an authenticated asynchronous job interface. Example hardening pattern: ```js const MAX_BODY_BYTES = 256 * 1024; async function parseBody(req) { return new Promise((resolve, reject) => { const declaredLength = Number(req.headers['content-length'] || 0); if (declaredLength > MAX_BODY_BYTES) { const error = new Error('Request body too large'); error.status = 413; reject(error); req.destroy(); return; } let body = ''; let received = 0; req.on('data', chunk => { received += chunk.length; if (received > MAX_BODY_BYTES) { const error = new Error('Request body too large'); error.status = 413; reject(error); req.destroy(); return; } body += chunk.toString('utf8'); }); req.on('end', () => { try { resolve(body ? JSON.parse(body) : {}); } catch { const error = new Error('Invalid JSON'); error.status = 400; reject(error); } }); req.on('error', reject); }); } ```

T08 · Insecure Dependencies

Note
Location
docs/INTEGRATIONS.md:101
Finding
Deployment Instructions Execute an Unpinned Package Through npx## Vulnerability Details **File Location**: `docs/INTEGRATIONS.md:101-105` **Vulnerability Type**: Mutable third-party package retrieval and execution **Risk Level**: Low ### Vulnerable Code ```bash ### Deploy (Cloudflare Workers example) ```bash # Create wrangler.toml npx wrangler deploy ``` ``` ### Technical Analysis The documented deployment workflow invokes `npx wrangler deploy` without specifying an exact reviewed version. If the package is not already installed locally, `npx` may resolve the current package release from the configured npm registry, download it, and execute it immediately. Because the project does not pin this deployment tool in the relevant instructions or provide a lockfile for the workflow, the effective code executed by users can change after the project has been audited. This creates a supply-chain exposure to package-account compromise, registry compromise, malicious configuration of the npm registry, or an unexpectedly unsafe future release. The package name uses the expected official name, and the audit found no evidence that the currently referenced package is malicious. The weakness is the mutable, unverified execution process rather than a confirmed malicious dependency. ### Attack Path 1. A user follows the Cloudflare deployment instructions. 2. The user runs `npx wrangler deploy` in an environment where the package is not already installed and pinned. 3. `npx` resolves and downloads a mutable package release from the configured npm registry. 4. If the resolved package or registry response has been compromised, attacker-controlled package code executes during installation or command startup. 5. The malicious code runs with the permissions and environment of the invoking user. ### Impact Assessment Successful supply-chain exploitation could execute arbitrary code with the current user's privileges. Depending on the invoking environment, this could expose source files, deplo ...[truncated 373 chars]
Remediation
## Remediation Suggestions - Add a reviewed exact version of `wrangler` to project development dependencies rather than resolving the latest compatible package at execution time. - Commit the generated lockfile and use `npm ci` in deployment environments. - Invoke the locally installed binary through a package script or an offline npm execution command. - Enable lockfile integrity verification and review dependency changes before upgrades. - Pin CI actions, container images, and deployment tooling to immutable versions or digests where practical. - Ensure deployment credentials are short-lived and narrowly scoped so a compromised build tool cannot obtain unnecessary cloud privileges. Example: ```json { "devDependencies": { "wrangler": "4.33.1" }, "scripts": { "deploy": "wrangler deploy" } } ``` Then install and deploy reproducibly: ```bash npm ci npm run deploy ``` The exact version shown should be replaced with a version that the project maintainers have reviewed and tested.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (34)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
There is a clear mismatch between the declared description and the actual code. The description claims sophisticated natural-language processing functionality for detecting and humanizing AI-generated text. However, the provided code is purely a static ESLint configuration file that configures linting behavior for source and test JavaScript files. It has a completely different primary purpose and does not implement any of the declared text-processing capabilities.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding
The declared description describes a substantial NLP-style feature for detecting and rewriting AI-generated text. The supplied code chunk only configures a JavaScript test runner (Vitest) by setting test globals and test file inclusion patterns. This is a materially different primary purpose and does not implement any of the described capabilities. Therefore, the description does not accurately represent the code.

Ae1

High
Category
analysis-evasion
Content
echo "Your text here" | node src/cli.js score
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
echo "Your text here" | node src/cli.js score
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
echo "Your text here" | node src/cli.js score
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
echo "Your text here" | node src/cli.js score
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
echo "Your text here" | node src/cli.js score
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
echo "Your text here" | node src/cli.js score
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
echo "Your text here" | node src/cli.js score
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The README explicitly recommends making the rewriting behavior "always on" by embedding it into an agent’s personality or system prompt. That creates a persistent instruction to rewrite outputs in a prescribed style and can alter user-authored wording, tone, or meaning without an explicit per-use consent boundary, which is risky for editing, quoting, legal, academic, or safety-sensitive contexts.

Natural-Language Policy Violations

Medium
Confidence
93% confidence
Finding
The skill includes prescriptive instructions for system prompts and personality files that force a specific writing style at all times, including bans on certain words and tone patterns. In agent settings, that can override user intent and downstream task requirements, causing silent noncompliance with requested style, domain conventions, accessibility needs, or faithful transformation tasks.

Lp3

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding
Without declared permissions the skill's intent is opaque and cannot be validated.

Vague Triggers

Medium
Confidence
92% confidence
Finding
The manifest description says to use the skill when asked to 'make content sound more natural/human,' 'review writing,' or 'improve AI-generated drafts,' which are common, loosely bounded requests. It does not define clear trigger constraints or exclusions, so the skill could be invoked for ordinary editing tasks beyond intentional AI-humanization use.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The API is designed to receive arbitrary user text for scoring, analysis, and rewriting, but the OpenAPI contract provides no privacy, retention, or handling notice for that potentially sensitive content. Because users may submit drafts, internal documents, or personal data to a text-analysis service, the lack of explicit disclosure increases the risk of unintended exposure, compliance issues, and unsafe use.

Natural-Language Policy Violations

Medium
Confidence
76% confidence
Finding
Line L020 explicitly says to "hide the reasoning," which is a normative instruction in natural language about suppressing a class of explanation content. While this is framed as a style improvement, it can conflict with organizational expectations for transparent response behavior when no user opt-in or justification is provided.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

External Transmission

Medium
Category
Data Exfiltration
Content
### Example

```bash
curl -X POST http://localhost:3000/api/score \
  -H "Content-Type: application/json" \
  -d '{"text": "This serves as a testament to innovation."}'
```
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Natural-Language Policy Violations

Medium
Confidence
92% confidence
Finding
The 'Always-On Mode' section instructs operators to permanently modify system or custom instructions so the model always rewrites output in a prescribed style, regardless of per-request user intent. In an agent setting, this can override user preferences, distort responses, and create policy/consent issues because the behavior is applied globally rather than only when explicitly requested.

Natural-Language Policy Violations

Medium
Confidence
93% confidence
Finding
The instruction "NEVER use these words in your rewrites" imposes a blanket linguistic constraint on outputs. Under the policy, forcing a specific language or locale style without user opt-in is a natural-language policy concern, and this file does not indicate that users can choose whether to apply this restriction.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The reporting functions present a numeric score and labels such as 'Heavily AI-generated' and 'The text looks human-written' as authoritative conclusions without any visible disclaimer about uncertainty, error rates, or appropriate use. In a skill explicitly designed to detect and rewrite AI-like text, users may rely on these outputs for moderation, academic, hiring, or trust decisions, creating real downstream harm from false positives and false negatives.

Natural-Language Policy Violations

Medium
Confidence
84% confidence
Finding
The natural-language comments and thresholds present generalized claims such as "Human burstiness is typically 0.5-1.0, AI is 0.1-0.3" and "Very uniform sentence lengths ... = AI." This embeds policy-relevant assumptions about writing norms without offering user opt-in or acknowledging that the heuristics are language- and population-dependent.

Natural-Language Policy Violations

Low
Confidence
84% confidence
Finding
The pattern list marks 'curly quotes' as an AI-writing signal to remove, which enforces a specific orthographic style regardless of user preference or locale. Since quotation-mark conventions vary by platform, publisher, and locale, treating them as inherently undesirable can conflict with language/locale choice.

Intent-Code Divergence

Low
Confidence
98% confidence
Finding
The skill description and earlier sections claim '28 pattern detectors' and '560+ AI vocabulary terms across 3 tiers' (L005-L008, L026, L033-L064), but the Process section says '24 patterns, 500+ vocabulary terms' (L150). This is an active documentation contradiction about what the analyzer actually covers, which can mislead developers about the skill's intended behavior and detection scope.

Missing User Warnings

Low
Confidence
84% confidence
Finding
The /humanize endpoint offers an autofix mode that alters user-submitted text, but the specification does not clearly warn that the returned content may change meaning, tone, or factual precision. In a rewriting service, silent or insufficiently disclosed modification can cause users to rely on altered text in professional, legal, academic, or safety-sensitive contexts.

Intent-Code Divergence

Low
Confidence
90% confidence
Finding
The file states 'all 24 AI writing patterns detected by humanizer,' while the provided manifest describes the skill as using 28 pattern detectors. This is an active documentation contradiction about the skill's implemented detection scope, not just an omitted detail.

Static analysis

Detected: suspicious.prompt_injection_instructions

Prompt-injection style instruction pattern detected.

Warn
Code
suspicious.prompt_injection_instructions
Location
docs/INTEGRATIONS.md:159