Back to skill

Security audit

Huo15 Marketingforce Website

Security checks for vulnerabilities and agentic risk

Overview

This skill is a disclosed MarketingForce website-admin tool, but it handles powerful session tokens and can change or delete production content without enforcing its own safety rules.

Install only if you intend to let this skill operate a MarketingForce/T云 production website. Keep tokens out of chats and logs, restrict scripts/.env permissions, rotate/revoke tokens after use, and require manual review before any save, publish, delete, upload, plugin, backup, restore, export, or user/member action.

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/mf_client.py:435
Finding

Declared Content-Safety and Destructive-Action Controls Are Not Enforced

Content
View full analysis

Vulnerability Details

File Location: scripts/mf_client.py, lines 435–445
Vulnerability Type: Unvalidated privileged content submission and unconfirmed destructive operation
Risk Level: Medium

Vulnerable Code

python
def cmd_save_article(json_file):
    with open(json_file) as f:
        article_data = json.load(f)
    r = api_call(f"{CMS_BASE}/article/save", method="POST", data=article_data)
    pjson(r)
    if r.get("code") == 200:
        print("\nArticle saved successfully!")

def cmd_delete_article(aid):
    pjson(api_call(f"{CMS_BASE}/article/remove", method="POST", data={"id": int(aid)}))

Technical Analysis

cmd_save_article treats the supplied JSON file as trusted and forwards its complete contents to the authenticated CMS API. It does not validate the permitted fields, sanitize HTML content, force draft status, create a backup, or require a separate publication confirmation.

This behavior conflicts with the safety requirements declared in SKILL.md, which require sanitizing user-provided HTML, previewing content as a draft before publication, and backing up content before editing. If the API accepts a payload containing active HTML and status: 1, the client can submit that content directly for publication. Whether active content is ultimately exploitable depends on server-side CMS validation and sanitization, which the client cannot guarantee.

cmd_delete_article also immediately calls the permanent removal endpoint using the supplied article ID. It does not ask for confirmation, retrieve the target for review, create a backup, or prefer a reversible disable operation as required by the Skill's documented safety rules.

Because both operations use the loaded X-Token and optional admin-token, any resulting action executes with the authenticated CMS user's existing privileges.

Attack Path

A content-submission attack can proceed as follows:

  1. An attacker, unt ...[truncated 2058 chars]
Remediation
View remediation

Remediation Suggestions

  1. Define and enforce an allowlisted schema for article payloads. Reject unknown fields, invalid identifiers, unexpected value types, and unsupported publication states.
  2. Sanitize article HTML with a maintained allowlist-based HTML sanitizer. Permit only required elements, attributes, and URL schemes.
  3. Force new and modified articles to status: 0 by default. Implement publication as a separate command that requires explicit confirmation.
  4. Retrieve and display the existing article before modification or deletion so the operator can verify the target.
  5. Export or save a timestamped backup of the current article before changing or removing it.
  6. Require explicit interactive confirmation for destructive operations, including the article ID and title in the prompt.
  7. Prefer a reversible disable or soft-delete operation where supported. Reserve permanent removal for a separately named command with stronger confirmation.
  8. Consider a non-interactive safety flag such as --confirm-delete ARTICLE_ID for automation, ensuring that destructive behavior cannot occur merely from an ambiguous positional argument.
  9. Add automated tests verifying that unsafe HTML is rejected or sanitized, publication is draft-first, and deletion cannot proceed without confirmation.
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
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
Findings (49)

Tainted flow: 'req' from os.environ.get (line 120, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Confidence
90% confidence
Finding

Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Content

Scanner excerpt · scripts/mf_client.py (reported line 122)May include surrounding context.

python
body = json.dumps(data).encode() if data else None
    req = urllib.request.Request(url, data=body, headers=headers, method=method)
    try:
        resp = urllib.request.urlopen(req, timeout=15)
        return json.loads(resp.read().decode())
    except urllib.error.HTTPError as e:
        try:

Credential Access

High
Category
Privilege Escalation
Confidence
94% confidence
Finding

The README identifies a local .env file under scripts/ as token storage for administrative credentials, reinforcing a pattern of keeping powerful bearer tokens in a plaintext developer-managed file. Even if gitignored, plaintext env files are commonly exposed through backups, shell history, editor plugins, misconfigured packaging, or accidental disclosure, and the impact is amplified because these credentials control a production website/CMS.

Content

Scanner excerpt · README.md (reported line 108)May include surrounding context.

├── README.md ← 本文件 ├── scripts/ │ ├── mf_client.py ← Python CLI 工具(50+ 命令) │ └── .env ← Token 存储(gitignored) └── references/ └── reference.md ← 完整 354 端点 API 参考文档

text

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
See references/reference.md for complete API list of:

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
See references/reference.md for complete API list of:

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 · scripts/mf_client.py (reported line 85)May include surrounding context.

python
import json, os, sys, urllib.request, urllib.error, urllib.parse

SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
ENV_FILE = os.path.join(SCRIPT_DIR, ".env")

CMS_BASE = "https://api.71360.com/api/app/site-admin-api/admin_cms"
ADMIN_BASE = "https://api.71360.com/api/app/site-admin-api/admin"

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 · scripts/mf_client.py (reported line 106)May include surrounding context.

python
elif line.startswith("MF_ADMIN_TOKEN="):
                    admin_token = line.split("=", 1)[1]
    if not x_token:
        print("Error: MF_X_TOKEN not found. Create .env file.")
        sys.exit(1)
    return x_token, admin_token

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The README explicitly instructs operators to extract live authentication tokens from browser cookies and store them in a local .env file, but it does not clearly warn that these tokens grant account/site-admin access and can enable full content modification or administrative actions if exposed. In the context of a website-management skill with broad CMS coverage, these are effectively bearer credentials with high account impact, so normalizing cookie extraction materially increases credential-handling risk.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
91% confidence
Finding

The skill advertises access to local environment credentials (scripts/.env) and multiple external APIs, but it does not declare any explicit tool scope or permission boundaries. That makes it easier for an agent runtime to invoke network and secret-accessing capabilities without transparent least-privilege constraints, increasing the risk of unintended credential use or unauthorized site modifications.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
76% confidence
Finding

The skill name, display name, description, and invocation examples are presented entirely around Chinese-language usage, with no indication that users may choose another language or locale. Because the skill covers general website-management functions rather than a clearly region-restricted compliance context, this may amount to an implicit language constraint without explicit opt-in.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The trigger phrases are broad and include generic website-management intents like '编辑官网', 'SEO优化', and even opaque aliases such as 'siteadmin' and 'uwtsd'. Overbroad activation can cause the skill to engage for loosely related requests and perform sensitive administrative actions in contexts where the user did not clearly intend full CMS control.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
78% confidence
Finding

This skill is explicitly designed to send administrative CMS requests to an external service endpoint. External transmission is expected for the use case, but it is still security-relevant because the requests can include privileged tokens and potentially sensitive site content, making the integration dangerous if endpoint scope, data handling, or confirmation controls are weak.

Content

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

md
| Service | Base URL |
|---------|----------|
| CMS | `https://api.71360.com/api/app/site-admin-api/admin_cms` |
| Site Admin | `https://api.71360.com/api/app/site-admin-api/admin` |
| Site/BPF | `https://api.71360.com/api/app/obor-nginx-php/tweb` |
| Console | `https://api.71360.com/api/app/aggregateservice-web/api` |

External Transmission

Medium
Category
Data Exfiltration
Confidence
78% confidence
Finding

The skill exposes another privileged external API base URL for site administration. Because the skill performs admin operations against third-party infrastructure, any misuse, prompt confusion, or unauthorized invocation could leak data or alter production website settings.

Content

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

md
| Service | Base URL |
|---------|----------|
| CMS | `https://api.71360.com/api/app/site-admin-api/admin_cms` |
| Site Admin | `https://api.71360.com/api/app/site-admin-api/admin` |
| Site/BPF | `https://api.71360.com/api/app/obor-nginx-php/tweb` |
| Console | `https://api.71360.com/api/app/aggregateservice-web/api` |
| Plugins | `https://api.71360.com/api/app/site-admin-api/plugin` |

External Transmission

Medium
Category
Data Exfiltration
Confidence
78% confidence
Finding

The documented Site/BPF endpoint expands the skill's external communication surface beyond a single CMS API. A wider external surface increases the chance of sensitive content, templates, or metadata being sent to remote services without sufficiently granular runtime controls.

Content

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

md
|---------|----------|
| CMS | `https://api.71360.com/api/app/site-admin-api/admin_cms` |
| Site Admin | `https://api.71360.com/api/app/site-admin-api/admin` |
| Site/BPF | `https://api.71360.com/api/app/obor-nginx-php/tweb` |
| Console | `https://api.71360.com/api/app/aggregateservice-web/api` |
| Plugins | `https://api.71360.com/api/app/site-admin-api/plugin` |
| AI | `https://api.71360.com/api/app/site-admin-api/admin_ai` |

External Transmission

Medium
Category
Data Exfiltration
Confidence
78% confidence
Finding

The console API endpoint indicates the skill may interact with broader aggregate services, which can expose additional tenant or account data. In the context of a highly privileged admin skill, every extra external integration path increases data exposure and misuse risk.

Content

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

md
| CMS | `https://api.71360.com/api/app/site-admin-api/admin_cms` |
| Site Admin | `https://api.71360.com/api/app/site-admin-api/admin` |
| Site/BPF | `https://api.71360.com/api/app/obor-nginx-php/tweb` |
| Console | `https://api.71360.com/api/app/aggregateservice-web/api` |
| Plugins | `https://api.71360.com/api/app/site-admin-api/plugin` |
| AI | `https://api.71360.com/api/app/site-admin-api/admin_ai` |
| File | `https://api.71360.com/api/app/site-admin-api/file` |

External Transmission

Medium
Category
Data Exfiltration
Confidence
78% confidence
Finding

The plugin management API allows remote modification of website plugin configuration, which is a sensitive external transmission target. Sending authenticated requests here can change site behavior, verification settings, or embedded services, making accidental or unauthorized invocation impactful.

Content

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

md
| Site Admin | `https://api.71360.com/api/app/site-admin-api/admin` |
| Site/BPF | `https://api.71360.com/api/app/obor-nginx-php/tweb` |
| Console | `https://api.71360.com/api/app/aggregateservice-web/api` |
| Plugins | `https://api.71360.com/api/app/site-admin-api/plugin` |
| AI | `https://api.71360.com/api/app/site-admin-api/admin_ai` |
| File | `https://api.71360.com/api/app/site-admin-api/file` |

External Transmission

Medium
Category
Data Exfiltration
Confidence
79% confidence
Finding

The AI administration endpoint adds another channel for transmitting content or metadata externally under administrative credentials. In combination with broad skill scope, this could expose unpublished content or operational details to remote services without sufficient user awareness.

Content

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

md
| Site/BPF | `https://api.71360.com/api/app/obor-nginx-php/tweb` |
| Console | `https://api.71360.com/api/app/aggregateservice-web/api` |
| Plugins | `https://api.71360.com/api/app/site-admin-api/plugin` |
| AI | `https://api.71360.com/api/app/site-admin-api/admin_ai` |
| File | `https://api.71360.com/api/app/site-admin-api/file` |

## Module Reference

External Transmission

Medium
Category
Data Exfiltration
Confidence
80% confidence
Finding

The file API endpoint supports file-related operations, which can involve uploads and transfer of documents or media to external infrastructure. In an admin context, such transmission can expose proprietary assets or enable unauthorized file changes if the skill is triggered too broadly or credentials are mishandled.

Content

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

md
| Console | `https://api.71360.com/api/app/aggregateservice-web/api` |
| Plugins | `https://api.71360.com/api/app/site-admin-api/plugin` |
| AI | `https://api.71360.com/api/app/site-admin-api/admin_ai` |
| File | `https://api.71360.com/api/app/site-admin-api/file` |

## Module Reference

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% 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 279)May include surrounding context.

md
- User center (`/admin/ucenterConfig`, `/admin/ucenterMember`)
- AI functions (`/admin_ai`, `/admin_cms/AiExtract`)
- System (`/admin/System` - logs, backups)
- Templates (`/tweb/pub/tplist` - 968+ templates)
- Statistics (`/tweb/statistic`)

## Token Storage

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% 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 · references/reference.md (reported line 433)May include surrounding context.

md
- User center (`/admin/ucenterConfig`, `/admin/ucenterMember`)
- AI functions (`/admin_ai`, `/admin_cms/AiExtract`)
- System (`/admin/System` - logs, backups)
- Templates (`/tweb/pub/tplist` - 968+ templates)
- Statistics (`/tweb/statistic`)

## Token Storage

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% 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 · scripts/mf_client.py (reported line 428)May include surrounding context.

python
- User center (`/admin/ucenterConfig`, `/admin/ucenterMember`)
- AI functions (`/admin_ai`, `/admin_cms/AiExtract`)
- System (`/admin/System` - logs, backups)
- Templates (`/tweb/pub/tplist` - 968+ templates)
- Statistics (`/tweb/statistic`)

## Token Storage

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 · SKILL.md (reported line 295)May include surrounding context.

md
- **Always backup** content before editing
- **Be idempotent**: search before create
- **Preview before publish**: set `status: 0` (draft) first
- Don't delete without confirmation — prefer `disabled: "true"`
- Sanitize user-provided HTML

## Additional Resources

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The document provides a complete authentication flow, identifies session token names and cookie scopes, and references where credentials are stored, but does not include any warning against exposing, logging, or reusing those secrets. In a skill meant to manage a production website, this materially increases the chance that an agent or operator mishandles credentials or leaks active tokens into prompts, logs, or external tools.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
95% confidence
Finding

The login flow documents sending loginName and password in GET query parameters for SMS-related endpoints. Even over HTTPS, query parameters are commonly captured in browser history, reverse-proxy logs, monitoring systems, and referrer-adjacent telemetry, creating a direct credential exposure risk.

Content

Scanner excerpt · references/reference.md (reported line 7)May include surrounding context.

md
### Login Flow (RSA + SMS)

1. **Get RSA public key**: `GET https://api.71360.com/api/app/tcloud-sso/account/getPublicKey`
2. **Encrypt password**: RSA PKCS1 encrypt, then base64 encode
3. **Login**: `POST /tcloud-sso/account/loginCheckRsa` → returns code 206 if SMS needed
4. **Send SMS**: `GET /tcloud-sso/account/sendSecondValidPhoneSecode?loginName=&password=`

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% 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 · references/reference.md (reported line 410)May include surrounding context.

md
| Method | Path | Description |
|--------|------|-------------|
| GET | `/System/getLogList?rows=10&page=1` | Operation logs |
| GET | `/System/backupList` | Backups |
| POST | `/System/addBackup` | Create backup |
| POST | `/System/removeBackup` | Remove |
| POST | `/System/restore` | Restore |

Session Persistence

Medium
Category
Rogue Agent
Confidence
75% 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 · scripts/mf_client.py (reported line 425)May include surrounding context.

python
| Method | Path | Description |
|--------|------|-------------|
| GET | `/System/getLogList?rows=10&page=1` | Operation logs |
| GET | `/System/backupList` | Backups |
| POST | `/System/addBackup` | Create backup |
| POST | `/System/removeBackup` | Remove |
| POST | `/System/restore` | Restore |

Static analysis

No suspicious patterns detected.