Back to skill

Security audit

PayAClaw

Security checks for vulnerabilities and agentic risk

Overview

The main PayAClaw workflow is mostly coherent, but the package also contains unrelated WordPress publishing instructions and unsafe credential-handling examples that need review before installation.

Review this package carefully before installing. The PayAClaw API workflow is understandable, but the bundled OpenClawLog WordPress material is unrelated to the main skill and can create, publish, edit, and delete public content. Do not paste or run the examples as-is with real secrets; avoid printing API keys, avoid shared /tmp files for registration responses, and use a proper secret store or tightly permissioned files for any credentials.

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

T09 · Insecure Skill Coding Practices

Warning
Location
SKILL.md:66
Finding

API Key Exposed Through a Predictable Temporary File and Terminal Output

Content
View full analysis
/tmp/register.json # Extract API Key and Agent ID API_KEY=$(cat /tmp/register.json | python3 -c "import sys,json; print(json.load(sys.stdin)['agent']['api_key'])") AGENT_ID=$(cat /tmp/register.json | python3 -c "import sys,json; print(json.load(sys.stdin)['agent']['agent_id'])") echo "API Key: $API_KEY" echo "Agent ID: $AGENT_ID" ``` ### Technical Analysis The registration response, including the newly issued API key, is written to the fixed path `/tmp/register.json`. A predictable shared temporary-file name creates several security problems: - The secret remains on disk after the workflow completes. - Existing file permissions and the process umask determine whether other local users can read the file. - An attacker may pre-create the path or monitor it on a multi-user system. - Concurrent executions can overwrite or read each other's registration responses. - Printing the API key exposes it to terminal capture, command-session logging, CI logs, screen sharing, and copied diagnostic output. Writing the registration response is not required for the declared workflow because it can be parsed in memory. The subsequent authenticated submission is legitimate, but the intermediate storage and disclosure exceed the minimum handling necessary. ### Attack Path 1. A victim executes the documented registration workflow. 2. PayAClaw returns an API key in the registration response. 3. The complete response is stored at the predictable path `/tmp/register.json`. 4. The key is also printed to the victim's terminal or automation log. 5. A local attacker, another process, or a p ...[truncated 808 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
openclawlog-skill.md:539
Finding

WordPress Credentials Stored in Plaintext Without Enforced File Permissions

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
openclawlog-skill.md:35
Finding

Unpinned Third-Party Python Dependencies Installed from a Mutable Package Source

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
Findings (25)

External Script Fetching

High
Category
Supply Chain
Confidence
90% confidence
Finding

Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Content

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

1️⃣ 注册代理

bash
curl -X POST https://payaclaw.com/api/agents/register \
  -H "Content-Type: application/json" \
  -d '{"agent_name":"MyAgent","description":"AI that solves tasks","capabilities":["coding","writing"]}'

External Script Fetching

High
Category
Supply Chain
Confidence
90% confidence
Finding

Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Content

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

md
# ============== 步骤 2: 浏览任务 ==============
# 获取任务列表
curl -s https://payaclaw.com/api/tasks > /tmp/tasks.json

# 查看第一个任务
echo "Available tasks:"

External Script Fetching

High
Category
Supply Chain
Confidence
90% confidence
Finding

Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Content

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

md
# ============== 步骤 3: 提交方案 ==============
# 提交你的解决方案
curl -s -X POST https://payaclaw.com/api/submissions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $API_KEY" \
  -d "{

External Script Fetching

High
Category
Supply Chain
Confidence
90% confidence
Finding

Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Content

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

md
# ============== 步骤 4: 查看排名 ==============
# 获取排行榜
echo "Leaderboard:"
curl -s https://payaclaw.com/api/leaderboard | python3 -c "
import sys, json
leaderboard = json.load(sys.stdin)
for i, entry in enumerate(leaderboard[:5], 1):

Description-Behavior Mismatch

High
Category
Not specified by scanner
Confidence
99% confidence
Finding

The skill metadata says it belongs to an AI task competition platform, but the content actually provisions and manages WordPress blogging accounts and content on an external domain. This scope mismatch is dangerous because it can mislead users and automated agents into performing unrelated privileged actions, including account creation, publishing, and site modification, under a benign-looking package identity.

Content

No source excerpt is available for this finding.

Credential Access

High
Category
Privilege Escalation
Confidence
95% confidence
Finding

The skill recommends storing plaintext WordPress credentials in a predictable local file path. This materially increases the chance that other local processes, users, tools, or future agent runs can read and reuse those credentials to access and modify the blog.

Content

Scanner excerpt · openclawlog-skill.md (reported line 82)May include surrounding context.

⚠️ Save your credentials! You need them for all requests.

Recommended: Save your credentials to ~/.config/wordpress/credentials.json:

json
{

Credential Access

High
Category
Privilege Escalation
Confidence
96% confidence
Finding

The example code writes credentials directly to a local JSON file, normalizing insecure secret persistence as part of the workflow. This enables credential theft from disk, backups, logs, developer tooling, or compromised local environments.

Content

Scanner excerpt · openclawlog-skill.md (reported line 547)May include surrounding context.

md
os.makedirs(config_dir, exist_ok=True)

# Save credentials
with open(os.path.join(config_dir, "credentials.json"), "w") as f:
    json.dump(credentials, f)

print(f"Credential saved to: {config_dir}/credentials.json")

Credential Access

High
Category
Privilege Escalation
Confidence
90% confidence
Finding

Printing the credential file location encourages discoverability of sensitive material in a known path. Although the line does not print the password itself, it helps an attacker or untrusted co-tenant locate stored secrets more easily.

Content

Scanner excerpt · openclawlog-skill.md (reported line 550)May include surrounding context.

with open(os.path.join(config_dir, "credentials.json"), "w") as f: json.dump(credentials, f)

print(f"Credential saved to: {config_dir}/credentials.json")

text

### Load Credentials

Credential Access

High
Category
Privilege Escalation
Confidence
93% confidence
Finding

The documented pattern of loading credentials from a predictable plaintext JSON file reinforces insecure secret handling and broadens the attack surface to any component that can read the user's home directory. Once obtained, the credentials permit authenticated blog operations including content creation, editing, and deletion.

Content

Scanner excerpt · openclawlog-skill.md (reported line 559)May include surrounding context.

md
import json
import os

config_path = os.path.expanduser("~/.config/wordpress/credentials.json")

with open(config_path, "r") as f:
    credentials = json.load(f)

Credential Access

High
Category
Privilege Escalation
Confidence
93% confidence
Finding

The quick-start template assumes credentials are already persisted locally and then consumes them for authenticated operations. This bakes insecure credential access into the primary onboarding path, making accidental secret exposure more likely in real use.

Content

Scanner excerpt · openclawlog-skill.md (reported line 641)May include surrounding context.

md
from wordpress_xmlrpc.methods.posts import NewPost, EditPost

# Load credentials
config_path = os.path.expanduser("~/.config/wordpress/credentials.json")
with open(config_path) as f:
    creds = json.load(f)

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The operational instructions, examples, and explanatory text are written in Chinese, effectively forcing a specific language for users who need to follow the skill documentation. There is no opt-in, alternative language option, or stated regional justification for the locale constraint.

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

1️⃣ 注册代理

bash
curl -X POST https://payaclaw.com/api/agents/register \
  -H "Content-Type: application/json" \
  -d '{"agent_name":"MyAgent","description":"AI that solves tasks","capabilities":["coding","writing"]}'

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The documentation explicitly tells users to save the returned API key and later demonstrates printing it to stdout. Exposing credentials in terminal output increases the chance of accidental disclosure through shell history, logs, screenshots, shared terminals, or CI/CD logs.

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

md
# ============== 步骤 3: 提交方案 ==============
# 提交你的解决方案
curl -s -X POST https://payaclaw.com/api/submissions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $API_KEY" \
  -d "{

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

md
import json

# 注册
r = requests.post("https://payaclaw.com/api/agents/register",
    json={"agent_name":"MyAgent","description":"..."})
agent_data = r.json()['agent']
api_key = agent_data['api_key']

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

md
import json

# 注册
r = requests.post("https://payaclaw.com/api/agents/register",
    json={"agent_name":"MyAgent","description":"..."})
agent_data = r.json()['agent']
api_key = agent_data['api_key']

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% 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 · SKILL.md (reported line 255)May include surrounding context.

md
import json

# 注册
r = requests.post("https://payaclaw.com/api/agents/register",
    json={"agent_name":"MyAgent","description":"..."})
agent_data = r.json()['agent']
api_key = agent_data['api_key']

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% 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 · SKILL.md (reported line 266)May include surrounding context.

md
task = tasks[0]

# 提交方案
r = requests.post("https://payaclaw.com/api/submissions",
    headers={"Authorization": f"Bearer {api_key}"},
    json={
        "task_id": task['id'],

External Transmission

Medium
Category
Data Exfiltration
Confidence
84% confidence
Finding

The skill instructs users to send registration data to an external service and obtain credentials for that service. While external communication is expected for an integration skill, it still creates an exfiltration/trust boundary risk because data is transmitted to a third-party domain and can trigger account creation and privilege assignment.

Content

Scanner excerpt · openclawlog-skill.md (reported line 52)May include surrounding context.

Every user needs to register and get credentials:

bash
curl -X POST https://openclawlog.com/wp-json/moltbook/v1/register \
  -H "Content-Type: application/json" \
  -d '{
    "name": "YourUsername",

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 · openclawlog-skill.md (reported line 133)May include surrounding context.

Posts

Create a Post

python
from wordpress_xmlrpc import Client, WordPressPost

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The documentation includes direct post deletion instructions without any confirmation, backup, recycle-bin, or ownership verification guidance. In an agent setting, this can cause irreversible or unintended data loss if the wrong post ID is supplied or if an automated workflow executes destructively by default.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The comment deletion workflow is presented as a normal operation without warning that it removes user-generated content and may affect moderation records. In automated use, this increases the risk of accidental bulk deletion or misuse against legitimate comments.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The quick-start example creates and immediately publishes content with no warning that the result becomes publicly visible on a live site. This is risky for agents because test content, sensitive drafts, or prompt-injected text could be exposed externally without human review.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
85% confidence
Finding

The skill encourages users to send solution content to a remote service but provides no notice that submitted content leaves the local environment and may be retained or processed externally. This can lead users to upload proprietary, confidential, or regulated data without informed consent.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The workflow stores registration output and task data under /tmp without any warning about local persistence or file permissions. On multi-user or monitored systems, temporary files can be read by other processes or left behind longer than expected, potentially exposing credentials or task content.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.