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## 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
## 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
Content
pure DNS edit needs only `hostinger-dns-mcp` (8 tools), not the full 127. See `references/installation.md`.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
pure DNS edit needs only `hostinger-dns-mcp` (8 tools), not the full 127. See `references/installation.md`.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
pure DNS edit needs only `hostinger-dns-mcp` (8 tools), not the full 127. See `references/installation.md`.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
pure DNS edit needs only `hostinger-dns-mcp` (8 tools), not the full 127. See `references/installation.md`.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Ae1

High
Category
analysis-evasion
Content
pure DNS edit needs only `hostinger-dns-mcp` (8 tools), not the full 127. See `references/installation.md`.
Confidence
100% confidence
Finding
Referenced artifact was not completely inspected

Credential Access

High
Category
Privilege Escalation
Content
hostinger-api-mcp --logout   # clears stored credentials
```

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
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
hostinger-api-mcp --logout   # clears stored credentials
```

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
Confidence
70% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

MCP Config Access

High
Category
Agent Snooping
Content
> `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.

---
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.

Session Persistence

Medium
Category
Rogue Agent
Content
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.
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.

Unrestricted Tool Access

Medium
Category
Excessive Agency
Content
- **`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).
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.

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.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Content
`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
Confidence
80% confidence
Finding
Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
## 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.
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.

Autonomous Decision Making

Medium
Category
Excessive Agency
Content
## 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.
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.

Static analysis

No suspicious patterns detected.