Back to skill

Security audit

Hostinger MCP

Security checks for vulnerabilities and agentic risk

Overview

This skill guides Hostinger account management through an MCP server and clearly discloses its powerful account and billing access with confirmation safeguards.

Install only if you are comfortable giving the connected MCP server full Hostinger account authority. Prefer the documented verified install path over the npx convenience route, use category-specific binaries, keep tokens in environment variables or a keychain, and require explicit confirmation before any write, purchase, deletion, or billing change.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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)

T08 · Insecure Dependencies

Warning
Location
references/installation.md:80
Finding

Unverified npm Package Retrieval and Execution Through npx

Content
View full analysis

Vulnerability Details

File Location: references/installation.md, lines 80-86
Vulnerability Type: Supply-chain exposure caused by fetching and executing an npm package without prior verification
Risk Level: Medium

Vulnerable Code

text
### The `npx` route is pinned but unverified

The repo's committed `.mcp.json` launches the server with `npx -y -p hostinger-api-mcp@1.8.2`
(Step 4). That needs no global install and keeps your PATH clean, and the version is pinned —
but npx fetches and executes in one step, **every run**, so there is no point at which the
bytes can be compared first.

Technical Analysis

The documented npx route downloads and executes hostinger-api-mcp@1.8.2 in a single operation. Pinning the version reduces unintended version drift, but it does not independently authenticate the package bytes before execution. It also does not lock or verify the complete transitive dependency tree resolved by npm.

Consequently, a compromised npm registry response, compromised package release, or malicious transitive dependency could execute code under the local user's account. npm package lifecycle behavior and imported dependency code may run before the MCP server begins normal operation.

This exposure is particularly significant because the launched process receives HOSTINGER_API_TOKEN. The project states that this token grants full Hostinger account access without per-tool restrictions. A malicious dependency executing in the same process context could read the token from the environment and transmit it externally.

The document acknowledges this limitation and supplies a safer tarball-verification alternative, but the unverified route remains documented as a supported zero-setup path. The referenced committed .mcp.json was not present in the submitted artifact, so its exact command and configuration could not be independently verified.

Attack Path

  1. An attacker compromises t ...[truncated 1667 chars]
Remediation
View remediation

Remediation Suggestions

  1. Remove the unverified npx route as the default or recommended setup method. Present it only as an explicitly insecure convenience option, if retained at all.
  2. Require the existing fetch-verify-install workflow before execution:
    • Pin the exact package version.
    • Obtain the expected digest through a trusted out-of-band channel.
    • Run npm pack without executing package code.
    • Verify the downloaded tarball against the trusted digest.
    • Install and execute only the verified local artifact.
  3. Install the MCP package inside a dedicated project with a committed lockfile rather than relying on global installation or runtime dependency resolution.
  4. Verify and lock the full transitive dependency graph. Use npm ci against a reviewed lockfile and monitor dependency integrity changes.
  5. Disable lifecycle scripts during installation where compatible, such as with npm install --ignore-scripts, and explicitly review any scripts that must subsequently be enabled.
  6. Run the MCP server under a dedicated, minimally privileged OS account or sandbox with access only to required resources.
  7. Supply only the required account token and category binary. Avoid exposing unrelated credentials or sensitive environment variables to the MCP process.
  8. Restrict outbound network access to the minimum necessary Hostinger API endpoints after installation. Package-registry access should not be required during routine MCP startup.
  9. Add automated dependency scanning, provenance verification, and alerts for unexpected package or lockfile changes.
  10. Include verified configuration files in the auditable artifact so the actual startup command can be reviewed rather than relying on documentation claims.
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (14)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
pure DNS edit needs only `hostinger-dns-mcp` (8 tools), not the full 127. See `references/installation.md`.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
pure DNS edit needs only `hostinger-dns-mcp` (8 tools), not the full 127. See `references/installation.md`.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
pure DNS edit needs only `hostinger-dns-mcp` (8 tools), not the full 127. See `references/installation.md`.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
pure DNS edit needs only `hostinger-dns-mcp` (8 tools), not the full 127. See `references/installation.md`.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
pure DNS edit needs only `hostinger-dns-mcp` (8 tools), not the full 127. See `references/installation.md`.

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/installation.md (reported line 117)May include surrounding context.

hostinger-api-mcp --logout # clears stored credentials

text

Credentials are stored at `~/.config/hostinger-mcp/credentials.json` as a **single central credential per machine**. Because OAuth can store only one credential, it **cannot separate accounts** — for multi-account use, prefer API tokens (see below).

### Handling the token safely

Credential Access

High
Category
Privilege Escalation
Confidence
70% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · references/installation.md (reported line 168)May include surrounding context.

hostinger-api-mcp --logout # clears stored credentials

text

Credentials are stored at `~/.config/hostinger-mcp/credentials.json` as a **single central credential per machine**. Because OAuth can store only one credential, it **cannot separate accounts** — for multi-account use, prefer API tokens (see below).

### Handling the token safely

MCP Config Access

High
Category
Agent Snooping
Confidence
90% confidence
Finding

Skill accesses MCP server configuration files (mcp.json). MCP configs contain server URLs, authentication tokens, and tool definitions — reading them allows the skill to discover and potentially abuse other tool integrations.

Content

Scanner excerpt · references/installation.md (reported line 299)May include surrounding context.

md
> `claude mcp remove` a connection when an engagement ends, and unset its variable — a stale entry
> is a standing grant on someone else's account.

> **Use API tokens for multi-account.** OAuth stores ONE central credential per machine and cannot separate accounts — only env-scoped tokens can. `.mcp.json.example` in the repo root shows the same thing in JSON form, with the same `${VAR}` placeholders: a real token does not belong in that file either.

---

Session Persistence

Medium
Category
Rogue Agent
Confidence
60% confidence
Finding

Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

Content

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

md
1. **Identify the account first (multi-account).** Each Hostinger account is a **separate MCP connection** with its own prefix (`mcp__hostinger-<account>__*`). Resource IDs are **NOT interchangeable between accounts** — VM ID 123456 in account A is a different resource (or nonexistent) in account B. Before every call, verify which account it belongs to. If it's unclear which account is meant, **stop and ask** — don't guess, and don't run across all of them "to be safe".

2. **Write operations require explicit confirmation.** Before any write tool, present: the **account**, the tool name, the **target resource (ID + name)**, the parameters, and the expected impact. Wait for an explicit "yes". One confirmation ≠ blanket consent for further operations, and a confirmation on one account never carries to another.

3. **Money-spending operations require cost-confirmation.** `domains_purchaseNewDomainV1`, `VPS_purchaseNewVirtualMachineV1`, enabling billing auto-renewal, and `billing_setDefaultPaymentMethodV1` spend **real money** (now or on the next renewal). Confirm the **cost AND the account** before executing.

Unrestricted Tool Access

Medium
Category
Excessive Agency
Confidence
80% confidence
Finding

Skill grants unrestricted tool access without appropriate constraints. An agent with unfettered tool access can perform arbitrary actions including file modification, network requests, and code execution.

Content

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

md
- **`HOSTINGER_API_TOKEN` (default).** A Bearer token generated in **hPanel**, passed to the MCP server via env. This is the standard path.
- **OAuth 2.0 PKCE (interactive alternative).** Available on **stdio transport only**, via `hostinger-api-mcp --login`.

The token has **full account access** — every action the account can perform in hPanel. There is **no granular / per-tool permission at the MCP layer**: any connected client can call any tool. Treat it like a password and **never print it** in responses. If the user asks to see it, refer them to hPanel.

**Never put a token's value on a command line** when helping a user set this up. It lands in their shell history, is visible in `ps` to every other user on the machine while the command runs, and `claude mcp add` then stores the resolved value in `~/.claude.json` in plaintext. Pass a quoted placeholder instead — `-e 'HOSTINGER_API_TOKEN=${HOSTINGER_API_TOKEN:-}'` — and keep the value in the environment Claude Code starts with; Claude Code expands it at launch. See "Handling the token safely" in `references/installation.md`, which also covers the OAuth credential file and what to do if a token may have been exposed (revoke and regenerate in hPanel — nothing narrower exists).

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.

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
80% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · references/installation.md (reported line 169)May include surrounding context.

md
`HOSTINGER_API_TOKEN` there and the committed `.mcp.json` picks it up with no local setup at all.

**The OAuth credential file.** `~/.config/hostinger-mcp/credentials.json` holds a live credential
written by the upstream package. Check its mode (`ls -l`) and tighten it if needed (`chmod 600`),
and run `hostinger-api-mcp --logout` before leaving a shared or handed-over machine.

**If a token may have been exposed** — pasted into a chat, committed, left in a history file or an

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · references/workflows-vps.md (reported line 11)May include surrounding context.

md
## 1. Inventory (read-only)

List what exists. No confirmation needed.

1. `VPS_getVirtualMachinesV1` — all virtual machines on the account (IDs, names, plan, state, IPs).
2. `VPS_getProjectListV1` — Docker Compose projects deployed on a VM.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · references/workflows-vps.md (reported line 22)May include surrounding context.

md
## 1. Inventory (read-only)

List what exists. No confirmation needed.

1. `VPS_getVirtualMachinesV1` — all virtual machines on the account (IDs, names, plan, state, IPs).
2. `VPS_getProjectListV1` — Docker Compose projects deployed on a VM.