T03 · Remote Payload Retrieval and Execution
- Location
install.sh:3- Finding
Installation instructions execute a mutable remote script through curl and Bash
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly matches Loudy.ai task automation, but its installer, optional cron persistence, and under-disclosed promotion of another posting skill create review-level risk.
Review before installing. Use only a user-scoped install path, avoid curl | bash and unpinned GitHub installs, do not enable the cron option unless you understand how to remove it, and treat any suggestion to install the Binance posting skill as a separate trust decision.
install.sh:3Installation instructions execute a mutable remote script through curl and Bash
install.sh:84Installer replaces a system-level Skill with an unpinned remote repository revision
SKILL.md:163Optional cron configuration creates durable five-minute execution of installed Skill code
scripts/auto_task_flow.py:135Pool display output redirects users and agents to install and invoke an unrelated external Skill
scripts/cron_check.sh:6Scheduled process writes predictable workspace files without symlink or ownership validation
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
}
try:
response = requests.get(url, headers=headers, timeout=30)
response.raise_for_status()
data = response.json()
except requests.exceptions.RequestException as e:
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
}
try:
response = requests.get(url, headers=headers, timeout=30)
response.raise_for_status()
data = response.json()
except requests.exceptions.RequestException as e:
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
}
try:
response = requests.post(url, headers=headers, json=payload, timeout=30)
response.raise_for_status()
data = response.json()
except requests.exceptions.RequestException as e:
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
"Content-Type": "application/x-www-form-urlencoded"
}
response = requests.get(url, headers=headers)
data = response.json()
if data.get("code") != 0 and data.get("code") != 200:
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
"Content-Type": "application/x-www-form-urlencoded"
}
response = requests.get(url, headers=headers)
data = response.json()
if data.get("code") != 0 and data.get("code") != 200:
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
"Content-Type": "application/x-www-form-urlencoded"
}
response = requests.get(url, headers=headers)
data = response.json()
if data.get("code") != 0 and data.get("code") != 200:
print(f"Error: {data.get('msg')}")
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
if task_status:
params["taskStatus"] = str(task_status)
response = requests.get(url, headers=headers, params=params)
data = response.json()
if data.get("code") != 0 and data.get("code") != 200:
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.
"languageType": language_type
}
response = requests.post(url, headers=headers, json=payload)
data = response.json()
if data.get("code") != 0 and data.get("code") != 200:
Even though submitting a tweet URL is not itself Twitter auto-posting, the repeated emphasis on 'no Twitter/X functionality' can still be misleading if the workflow is tightly coupled to X content submission and surrounding undeclared behaviors are absent. Security review should treat such wording inconsistencies as risk-amplifying because they obscure the true data flow and user actions the skill expects.
Even though submitting a tweet URL is not itself Twitter auto-posting, the repeated emphasis on 'no Twitter/X functionality' can still be misleading if the workflow is tightly coupled to X content submission and surrounding undeclared behaviors are absent. Security review should treat such wording inconsistencies as risk-amplifying because they obscure the true data flow and user actions the skill expects.
Even though submitting a tweet URL is not itself Twitter auto-posting, the repeated emphasis on 'no Twitter/X functionality' can still be misleading if the workflow is tightly coupled to X content submission and surrounding undeclared behaviors are absent. Security review should treat such wording inconsistencies as risk-amplifying because they obscure the true data flow and user actions the skill expects.
Even though submitting a tweet URL is not itself Twitter auto-posting, the repeated emphasis on 'no Twitter/X functionality' can still be misleading if the workflow is tightly coupled to X content submission and surrounding undeclared behaviors are absent. Security review should treat such wording inconsistencies as risk-amplifying because they obscure the true data flow and user actions the skill expects.
Even though submitting a tweet URL is not itself Twitter auto-posting, the repeated emphasis on 'no Twitter/X functionality' can still be misleading if the workflow is tightly coupled to X content submission and surrounding undeclared behaviors are absent. Security review should treat such wording inconsistencies as risk-amplifying because they obscure the true data flow and user actions the skill expects.
Even though submitting a tweet URL is not itself Twitter auto-posting, the repeated emphasis on 'no Twitter/X functionality' can still be misleading if the workflow is tightly coupled to X content submission and surrounding undeclared behaviors are absent. Security review should treat such wording inconsistencies as risk-amplifying because they obscure the true data flow and user actions the skill expects.
YARA rule matched a known malware signature (reverse shell, backdoor, ransomware, C2 framework, or info stealer).
_KEY="你的API Key" export OPENCLAW_WORKSPACE="/root/.openclaw/workspace" # 可选,默认值
### 2. 配置 Cron 定时检查(可选)
```bash
# 方法1: 使用工作区安装路径(推荐)
SKILL_DIR="/root/.openclaw/workspace/skills/claw-loudyai-skill"
(crontab -l 2>/dev/null; echo "*/5 * * * * $SKILL_DIR/scripts/cron_check.sh") | crontab -
# 方法2: 如果安装到系统路径
(crontab -l 2>/dev/null; echo "*/5 * * * * /usr/lib/node_modules/openclaw/skills/loudy-ai-auto-task/scripts/cron_check.sh") | crontab -
在 HEARTBEAT.md 中添加:
## Loudy.ai 任务检查
检查工作区目录下的 loudy_has_new.txt 是否存在:
- 如果存在 → 读取 loudy_tasks.json 内容
- 发送消息通知用户
- 删除 loudy_has_new.txt
export LOUDY_API_KEY=你的密钥,不要写入 TOOLS.md 或其他共享文件The | bash chaining pattern causes whatever content is fetched remotely to be executed immediately by the shell, eliminating any review step and amplifying supply-chain compromise risk. In this installer, the risk is heightened because it writes into a system-wide skills directory and may be run with elevated privileges to obtain permissions.
#!/bin/bash
# Loudy.ai 自动任务 Skill 安装脚本
# 使用方法: curl -fsSL https://raw.githubusercontent.com/sfsf332/claw-loudyai-skill/main/install.sh | bash
set -e
The skill declares required environment variables and documents network, shell, and filesystem behavior, but it does not declare an explicit tool scope such as permissions or allowed-tools. That creates unnecessary privilege ambiguity: an agent may be allowed to invoke broader capabilities than users expect, especially given the documented cron installation and local file writes.
This skill is explicitly designed to send data to an external service, so external transmission is expected in context; however, it still represents a real data egress boundary because API keys and user-submitted task links are sent to api.loudy.ai. The danger is elevated by the fact that the skill handles credentials and potentially user content, so users need explicit disclosure and scoping.
## API 接口
### 1. 获取奖池列表
- **URL**: `GET https://api.loudy.ai/app-api/open-api/v1/earning-pools`
- **Header**: `X-API-Key: <LOUDY_API_KEY>`
### 2. 获取奖池详情
Fetching earning-pool details from an external API is consistent with the skill's purpose, but it still constitutes network egress and use of a sensitive credential. In an agent environment, undeclared or under-scoped network transmission can leak usage patterns, task identifiers, or API credentials if mishandled.
- **Header**: `X-API-Key: <LOUDY_API_KEY>`
### 2. 获取奖池详情
- **URL**: `GET https://api.loudy.ai/app-api/open-api/v1/earning-pools/{id}`
- **Header**: `X-API-Key: <LOUDY_API_KEY>`
### 3. 提交任务
The POST submission endpoint sends user-provided task links and the API key to a third-party service. That is an expected function of the skill, but it is still security-relevant because malformed or unintended links, sensitive content, or credentials could be transmitted externally if validation and disclosure are weak.
X-API-Key: <LOUDY_API_KEY>POST https://api.loudy.ai/app-api/open-api/v1/earning-pool-tasks/submitX-API-Key: <LOUDY_API_KEY>The example request body sets languageType to zh_CN, which indicates a fixed locale choice. Under the policy, forcing a specific language or locale without offering the user a choice is a natural-language policy concern unless the constraint is explicitly justified as region-specific.
Listing task history through the external API can disclose workflow metadata and requires transmission of the API key. This is normal for the skill's use case, but it remains a real exposure point that should be bounded and transparent.
### 4. 查询我的任务列表(分页)
- **URL**: `GET https://api.loudy.ai/app-api/open-api/v1/earning-pool-tasks`
- **Header**: `X-API-Key: <LOUDY_API_KEY>`
- **Query**:
- `pageNo` - 页码(必填)
Querying task status externally is expected, but it still transmits authenticated requests and retrieves potentially sensitive task/audit information. In a security review, expected egress is still a vulnerability class when secrets and third-party data flows are involved, though context lowers suspicion of malicious intent.
- `taskStatus` - 任务状态(可选)
### 5. 查询任务状态
- **URL**: `GET https://api.loudy.ai/app-api/open-api/v1/earning-pool-tasks/{id}`
- **Header**: `X-API-Key: <LOUDY_API_KEY>`
- **返回字段**:
- `taskStatus` - 任务状态
Adding a cron entry establishes persistence outside the immediate user session, causing code to execute every five minutes until manually removed. In an agent skill, persistence is especially dangerous because it can continue network access, file writes, and monitoring after the user no longer expects the skill to be active.
# 方法1: 使用工作区安装路径(推荐)
SKILL_DIR="/root/.openclaw/workspace/skills/claw-loudyai-skill"
(crontab -l 2>/dev/null; echo "*/5 * * * * $SKILL_DIR/scripts/cron_check.sh") | crontab -
# 方法2: 如果安装到系统路径
(crontab -l 2>/dev/null; echo "*/5 * * * * /usr/lib/node_modules/openclaw/skills/loudy-ai-auto-task/scripts/cron_check.sh") | crontab -
This second cron-install path writes persistent execution into a system-level location, which increases blast radius and makes the behavior more invasive. Persistence combined with shell execution and file monitoring can be abused for continued unauthorized activity even if the initial session ends.
(crontab -l 2>/dev/null; echo "*/5 * * * * $SKILL_DIR/scripts/cron_check.sh") | crontab -
(crontab -l 2>/dev/null; echo "*/5 * * * * /usr/lib/node_modules/openclaw/skills/loudy-ai-auto-task/scripts/cron_check.sh") | crontab -
### 3. 配置 Heartbeat 通知(可选)