Back to skill

Security audit

Manus

Security checks for vulnerabilities and agentic risk

Overview

The skill does what it claims, but it creates shareable Manus task links and saves remote agent-generated files locally with weak safeguards.

Review this skill before installing if you expect to use it with private prompts, business documents, code, or other sensitive material. Use a dedicated empty output directory for downloads, inspect downloaded files before opening or running them, and avoid shareable links unless you understand who can access them and for how long.

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/manus.sh:74
Finding
Unrestricted Remote File Download and Local File Overwrite<![CDATA[ ## Vulnerability Details **File Location**: `scripts/manus.sh`, lines 74-92 **Vulnerability Type**: Unvalidated remote URL retrieval and unsafe file overwrite **Risk Level**: Medium ### Vulnerable Code ```bash download) # Download output files: manus.sh download <task_id> [output_dir] task_id="$1" output_dir="${2:-.}" mkdir -p "$output_dir" curl -s "$API_BASE/tasks/$task_id" \ -H "API_KEY: $MANUS_API_KEY" | jq -r '.output[]?.content[]? | select(.type == "output_file") | "\(.fileName)\t\(.fileUrl)"' | \ while IFS=$'\t' read -r filename url; do if [ -n "$filename" ] && [ -n "$url" ]; then # Sanitize filename safe_name=$(echo "$filename" | tr -cd '[:alnum:]._-' | head -c 100) [ -z "$safe_name" ] && safe_name="output_file" echo "Downloading: $safe_name" >&2 curl -sL "$url" -o "$output_dir/$safe_name" echo "$output_dir/$safe_name" fi done ;; ``` ### Technical Analysis The `download` action extracts `fileUrl` and `fileName` values from a remote API response and passes the URL directly to `curl -L`. It does not validate the URL scheme or destination hostname. Redirect following is enabled without validating each redirect target. Consequently, a compromised or malicious task response could make the client request an attacker-selected URL. Depending on the protocols supported by the installed `curl`, this may include non-HTTPS resources, loopback addresses, private network services, or local resources. This is a client-side server-side request forgery–style issue, although retrieved content is written locally rather than automatically returned to the attacker. The filename is restricted to alphanumeric characters, periods, underscores, and hyphens, which prevents direct path traversal. However, the destination is opened with normal overwrite behavior. An API-controlled filename can therefore replace an existing file in the user-selected output directory. Different remote filenames may also ...[truncated 2007 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Permit only HTTPS downloads: ```bash curl --fail --show-error --proto '=https' --proto-redir '=https' ... ``` 2. Parse each URL and enforce an explicit allowlist of expected Manus CDN hostnames. Validate redirect destinations as well; do not assume that validating only the original URL is sufficient. 3. Reject loopback, link-local, private, and reserved network destinations if downloads are not restricted to a fixed CDN allowlist. 4. Prevent replacement of existing files. Create a unique destination with `mktemp`, download into it, validate it, and then atomically rename it to a non-existing final path. 5. Detect duplicate filenames after sanitization and generate unique names rather than silently overwriting a previous artifact. 6. Enforce maximum response sizes and reasonable connection and transfer timeouts, for example with `--max-filesize`, `--connect-timeout`, and `--max-time`. 7. Validate expected content type, file extension, and file signature before accepting a downloaded artifact. 8. Check every `curl`, `jq`, and filesystem operation for failure, and remove partial files when a download or validation step fails. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (16)

Session Persistence

Medium
Category
Rogue Agent
Content
## What it does

- **Create tasks** - send prompts to Manus and let it work autonomously
- **Poll for status** - track task progress (pending, running, completed, failed)
- **Get deliverables** - download output files (PDFs, slides, code) when tasks complete
- **Multiple profiles** - standard, lite (fast), or max (deep research) agent modes
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.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The README states that task output files are downloaded locally and delivered directly, but it does not warn users that running the skill may write untrusted, externally generated content onto the local filesystem. In the context of an autonomous remote agent that can generate code, documents, and other files, silent local writes increase the risk of unsafe file placement, accidental execution, or handling of malicious content.

Lp3

Medium
Category
MCP Least Privilege
Confidence
86% confidence
Finding
The skill demonstrates shell-based network operations via curl examples but does not declare any tool scope or allowed-tools restrictions. In an agent environment, this can lead to broader-than-expected execution capability and makes it harder to enforce least privilege or review what external actions the skill may perform.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The workflow instructs downloading generated output files locally and sending them onward without any safety checks, provenance validation, or sensitive-data handling guidance. Because Manus can autonomously browse and create arbitrary files, this increases the risk of exfiltrating sensitive content, storing malware-laced artifacts, or redistributing private data to users.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The skill recommends setting createShareableLink: true by default, which may expose task contents or outputs through a share URL. Without warning users about link visibility, retention, or access control, sensitive prompts, results, or attached files could be disclosed beyond the intended recipient.

External Transmission

Medium
Category
Data Exfiltration
Content
## Create a Task

```bash
curl -X POST "https://api.manus.ai/v1/tasks" \
  -H "API_KEY: $MANUS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# Manus API helper script
# Usage: manus.sh <action> [args]

API_BASE="https://api.manus.ai/v1"

if [ -z "$MANUS_API_KEY" ]; then
  echo "Error: MANUS_API_KEY not set" >&2
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# Manus API helper script
# Usage: manus.sh <action> [args]

API_BASE="https://api.manus.ai/v1"

if [ -z "$MANUS_API_KEY" ]; then
  echo "Error: MANUS_API_KEY not set" >&2
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# Manus API helper script
# Usage: manus.sh <action> [args]

API_BASE="https://api.manus.ai/v1"

if [ -z "$MANUS_API_KEY" ]; then
  echo "Error: MANUS_API_KEY not set" >&2
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# Manus API helper script
# Usage: manus.sh <action> [args]

API_BASE="https://api.manus.ai/v1"

if [ -z "$MANUS_API_KEY" ]; then
  echo "Error: MANUS_API_KEY not set" >&2
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# Manus API helper script
# Usage: manus.sh <action> [args]

API_BASE="https://api.manus.ai/v1"

if [ -z "$MANUS_API_KEY" ]; then
  echo "Error: MANUS_API_KEY not set" >&2
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# Manus API helper script
# Usage: manus.sh <action> [args]

API_BASE="https://api.manus.ai/v1"

if [ -z "$MANUS_API_KEY" ]; then
  echo "Error: MANUS_API_KEY not set" >&2
Confidence
60% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
# Create a task: manus.sh create "your prompt here" [profile]
    prompt="$1"
    profile="${2:-manus-1.6}"
    curl -s -X POST "$API_BASE/tasks" \
      -H "API_KEY: $MANUS_API_KEY" \
      -H "Content-Type: application/json" \
      -d "{\"prompt\": $(echo "$prompt" | jq -Rs .), \"agentProfile\": \"$profile\", \"taskMode\": \"agent\", \"createShareableLink\": true}"
Confidence
70% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Description-Behavior Mismatch

Medium
Confidence
95% confidence
Finding
The manifest focuses on creating and managing AI agent tasks via the Manus API. The `download` command goes beyond remote task management by fetching arbitrary output file URLs and writing files locally, which is a materially broader behavior than the stated description suggests.

Missing User Warnings

Medium
Confidence
91% confidence
Finding
The script downloads arbitrary remote files from URLs returned by the Manus API and writes them to the local filesystem without an explicit warning, confirmation, or safety checks on content type, size, or overwrite behavior. In this skill context, the remote service produces agent-generated artifacts, so a user may fetch unexpected or risky files onto a host system with little visibility.

Context-Inappropriate Capability

Medium
Confidence
88% confidence
Finding
The skill's stated purpose is to create and manage Manus tasks through the API. Creating directories and saving remote files locally introduces a filesystem-write capability that is not explicitly justified by that purpose, especially since task management could be fulfilled without local persistence.

Static analysis

No suspicious patterns detected.