Back to skill

Security audit

multi-agent-writer

Security checks for vulnerabilities and agentic risk

Overview

This appears to be a real writing helper, but its installer pulls mutable remote code, installs dependencies, and registers into multiple agent environments, so it needs review before use.

Install only if you trust the GitHub repository and are comfortable with the installer modifying user-level agent skill directories and installing Python packages. Prefer reviewing or pinning the repository commit, using a virtual environment, choosing a single target agent, and avoiding confidential topics or secrets in prompts sent to external search or LLM providers.

Vulnerability Patterns
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • 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
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Findings (1)

T03 · Remote Payload Retrieval and Execution

Error
Location
install.sh:14
Finding

Unpinned Remote Code Retrieval and Dependency Installation

Content
View full analysis

Vulnerability Details

File Location: install.sh, lines 14 and 20-33
Vulnerability Type: Mutable remote payload retrieval and insecure dependency installation
Risk Level: High

Vulnerable Code

bash
REPO_URL="https://github.com/gonelake/multi-agent.git"

# ── 1. Ensure project code is available ────────────────────
if [[ -d "${INSTALL_DIR}/.git" ]]; then
    echo "→ Updating project code..."
    git -C "${INSTALL_DIR}" pull --quiet
    echo "✓ Code updated: ${INSTALL_DIR}"
else
    echo "→ Cloning project code..."
    git clone --quiet "${REPO_URL}" "${INSTALL_DIR}"
    echo "✓ Project downloaded: ${INSTALL_DIR}"
fi

# ── 2. Install Python dependencies ─────────────────────────
if [[ -f "${INSTALL_DIR}/requirements.txt" ]]; then
    echo "→ Installing Python dependencies..."
    pip install --quiet -r "${INSTALL_DIR}/requirements.txt"
    echo "✓ Python dependencies installed"
fi

Technical Analysis

The installer clones or updates the mutable default branch of an external Git repository without pinning a reviewed commit, verifying a signed release, or checking a cryptographic digest. Consequently, the code installed at a later date can differ from the code that was present when this Skill package was audited.

The installer then trusts the remotely retrieved requirements.txt and invokes pip install in the active Python environment. Python dependency installation can execute package build hooks and other installation-time code. No dedicated virtual environment, hash-locked dependency file, or package integrity verification is enforced.

This behavior exceeds the minimum privileges necessary for registering the Skill documentation. Although downloading the associated writing application is part of the declared installation design, automatically retrieving mutable code and installing its dependencies without integrity controls is unnecessary. The executable Python application is absent from the audited artifact, so its network b ...[truncated 2029 chars]

Remediation
View remediation

Remediation Suggestions

  1. Pin the application source to an immutable revision

    • Clone a specific reviewed commit rather than the mutable default branch.
    • Verify that the checked-out commit exactly matches the expected commit identifier.
    • Prefer a signed release and validate its signature.
  2. Add cryptographic integrity verification

    • Download a versioned release artifact with a published SHA-256 digest.
    • Abort installation if signature or digest verification fails.
    • Store the expected digest in the reviewed Skill package.
  3. Eliminate automatic mutable updates

    • Remove the unconditional git pull behavior.
    • Implement an explicit update command that identifies the old and new revisions and requires user approval.
    • Require each new revision to undergo review before execution.
  4. Lock and verify Python dependencies

    • Pin all direct and transitive dependencies to exact versions.
    • Use a hash-locked requirements file and install with pip install --require-hashes.
    • Review packages for dependency confusion, typosquatting, and unexpected build dependencies.
  5. Isolate the Python environment

    • Create a dedicated virtual environment under the application directory.
    • Invoke that environment's Python and pip explicitly.
    • Avoid modifying the user's global or unrelated project environment.
  6. Vendor the audited implementation when practical

    • Include the executable application source and locked dependency metadata in the reviewed artifact.
    • If remote retrieval remains necessary, clearly display the exact source revision and obtain confirmation before downloading or executing it.
  7. Protect sensitive configuration

    • Restrict .env permissions to the owning user.
    • Ensure API keys are sent only to the explicitly configured provider.
    • Document what article prompts, search results, and other content are transmitted to remote LLM services.
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
  • Tool MisuseTool Parameter Abuse, Chaining Abuse, Unsafe Defaults
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (22)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description says this skill should be used for writing articles, generating news, fetching hotspots, and creating social media content. However, the actual code shown does none of that. Its primary purpose is operational setup: downloading/updating a repository, installing dependencies, and registering a multi-agent skill into local agent directories. These are materially different capabilities and resources than content creation. This is not merely an implementation detail of a writing tool; the code chunk’s behavior is an installer for a different skill with unrelated triggers and system-modifying behavior.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description says this skill should be used for article/news/social-media content creation. However, the actual code does not generate or manipulate content at all. Its primary purpose is developer tooling: linking a local multi-agent project into ~/.skills/multi-agent for development use. It performs filesystem operations, including validating a path, deleting an existing target, creating directories, and making a symlink. These are materially different capabilities and an unrelated primary purpose compared with the declared content-writing behavior.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared purpose is content creation (articles, news, social posts), but the actual code does not generate or assist with content at all. Instead, it functions as an installation/test harness for a separate 'multi-agent' skill. It inspects local directories and files, checks Python package availability, verifies registration in multiple agent-specific skill folders, and runs a demo invocation. This is a materially different primary purpose and involves undeclared local filesystem and execution behavior unrelated to the stated article/news/social-media writing use case.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description says this skill should be used for article/news/social-media content creation. However, the actual code performs local system maintenance: it parses CLI flags, identifies agent-specific skill directories, removes installed skill folders, and optionally deletes the project code directory. This is a materially different primary purpose and introduces undeclared filesystem deletion capabilities. There is no article writing, news generation, hotspot fetching, or social-media content production in the code.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

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

Content

Scanner excerpt · install.sh (reported line 118)May include surrounding context.

sh
echo "  cd ${INSTALL_DIR} && python main.py --demo"
echo ""
echo "生产模式(需配置 API Key):"
echo "  # 在 ${INSTALL_DIR}/ 创建 .env 文件,填入以下内容:"
echo "  # LLM_API_KEY=your-api-key"
echo "  # LLM_BASE_URL=https://api.moonshot.cn/v1  # 可选"
echo "  # LLM_MODEL=moonshot-v1-8k                 # 可选"

Chaining Abuse

High
Category
Tool Misuse
Confidence
75% confidence
Finding

Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.

Content

Scanner excerpt · scripts/link-project.sh (reported line 27)May include surrounding context.

sh
fi

# 如已存在则先删除
[[ -e "${INSTALL_DIR}" ]] && rm -rf "${INSTALL_DIR}"

mkdir -p "$(dirname "${INSTALL_DIR}")"
ln -s "${SOURCE_DIR}" "${INSTALL_DIR}"

Lp1

High
Category
MCP Least Privilege
Confidence
55% confidence
Finding

The skill uses 'network' capability that is not listed in its permissions. This may indicate deceptive intent or missing permission declarations.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

This markdown file includes an uninstall command with a --all option that removes project code, which can affect user data or system state. The description states the behavior but does not warn users that the deletion is destructive or potentially irreversible.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The trigger criteria are very broad, covering essentially any article or content-generation request. Overbroad activation can cause the skill to be selected unexpectedly, leading users to invoke external search/LLM workflows and data sharing when they only wanted local or simpler assistance.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill advertises DuckDuckGo news retrieval and LLM-backed article generation but does not warn that prompts, topics, and generated content may be transmitted to third-party services. This creates a privacy and compliance risk, especially if users provide sensitive drafts, internal topics, or proprietary information.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
87% confidence
Finding

The documented .env configuration explicitly supports third-party API endpoints, confirming external transmission of user prompts/content in production mode. In the context of a writing skill, this is expected behavior, but it is still security-relevant because it can expose sensitive input to external processors if users are not clearly informed.

Content

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

bash
LLM_API_KEY=your-api-key
LLM_BASE_URL=https://api.moonshot.cn/v1  # 可选
LLM_MODEL=moonshot-v1-8k                 # 可选
LLM_API_STYLE=openai                     # openai 或 anthropic

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The script's user-facing comments and usage instructions are presented exclusively in Chinese, which imposes a specific language on users without opt-in. The policy allows fixed locale/language only when a choice is offered or the constraint is clearly justified as region-specific, neither of which is present here.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The installer clones or updates code from a remote GitHub repository and installs Python dependencies with pip, which extends behavior well beyond merely registering a content-generation skill. This creates supply-chain risk because the installed code and packages can change over time and may execute arbitrary code during installation or later use.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The script auto-detects and writes into multiple external agent skill directories under the user's home directory, potentially modifying several tools in one run. Cross-agent registration increases blast radius and can create persistence or unexpected trust relationships if the skill is later found unsafe or behaves differently per agent.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
60% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · install.sh (reported line 120)May include surrounding context.

sh
echo "生产模式(需配置 API Key):"
echo "  # 在 ${INSTALL_DIR}/ 创建 .env 文件,填入以下内容:"
echo "  # LLM_API_KEY=your-api-key"
echo "  # LLM_BASE_URL=https://api.moonshot.cn/v1  # 可选"
echo "  # LLM_MODEL=moonshot-v1-8k                 # 可选"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

Comments and runtime messages such as usage, errors, and success output are written only in Chinese. This imposes a single language on all users without opt-in, which is a natural-language policy concern under the locale/language rule.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The script removes ${HOME}/.skills/multi-agent with rm -rf if it already exists. Although there is a brief comment noting deletion, there is no user-facing confirmation or warning message before this destructive operation, and the script output only announces the new symlink after the fact.

Content

No source excerpt is available for this finding.

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
85% confidence
Finding

The script enumerates well-known skill directories for multiple agents under the user's home directory and reports whether this skill is installed there. This leaks local environment/tooling presence to anyone who can observe the script output, which is a form of information disclosure, though limited to the current user's workspace and low sensitivity in this testing context.

Content

Scanner excerpt · tests/test_install.sh (reported line 46)May include surrounding context.

sh
echo ""
echo "── 检查 Skill 注册 ───────────────────────────────"
for agent_dir in "${HOME}/.codebuddy/skills" "${HOME}/.claude/skills" "${HOME}/.openclaw/skills"; do
    agent=$(basename "$(dirname "${agent_dir}")" | sed 's/^\.//')
    skill_file="${agent_dir}/${SKILL_NAME}/SKILL.md"
    if [[ -f "${skill_file}" ]]; then

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This shell script performs irreversible directory deletion with rm -rf for installed skill directories and, with --all, deletes the local project code as well. Although it prints messages after deletion and the comments describe usage, there is no interactive confirmation or explicit pre-action warning before the destructive operation occurs.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

The file's instructional content is presented in Chinese, which can amount to a language policy issue when the skill forces a specific language without user opt-in. There is no indication that the skill is region-specific or that alternative language documentation is available.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
97% confidence
Finding

This shell script contains natural-language comments and console output entirely in Chinese, including usage guidance and test status messages. Under the policy rule, forcing a specific language without opt-in or justification is a locale/language policy violation.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
96% confidence
Finding

The script's natural-language comments and console output are entirely in Chinese, which imposes a specific language on users without opt-in or locale selection. This matches the policy category for language or locale constraints that are not documented as optional or region-specific.

Content

No source excerpt is available for this finding.