Back to skill

Security audit

Fly Install

Security checks for vulnerabilities and agentic risk

Overview

This skill is a backup installer that openly downloads other skills, but it trusts unverified search and download results and has unsafe filesystem handling.

Review this skill carefully before installing. Use it only with verified skill names and trusted sources, avoid running it as an administrator, do not pass paths or names containing slashes or '..', and prefer official or pinned installs where the repository owner, commit, and package integrity can be checked.

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)

T08 · Insecure Dependencies

Error
Location
fly-install.sh:100
Finding

Automatic Installation from an Unverified GitHub Search Result

Content
View full analysis
/dev/null | \ jq -r '.items[]? | select(.name | ascii_downcase == "'"$(echo "$SKILL_NAME" | tr '[:upper:]' '[:lower:]')"'") | \ "\(.full_name)|\(.clone_url)"' 2>/dev/null) if [ -z "$repos" ]; then # 尝试更宽泛的搜索 repos=$(curl -s "${GITHUB_API}?q=${SKILL_NAME}+openclaw" 2>/dev/null | \ jq -r '.items[0]? | "\(.full_name)|\(.clone_url)"' 2>/dev/null) fi if [ -z "$repos" ] || [ "$repos" == "null|null" ]; then log_warn "GitHub 未找到匹配仓库" return 1 fi # 解析结果 local repo_full_name=$(echo "$repos" | head -1 | cut -d'|' -f1) local clone_url=$(echo "$repos" | head -1 | cut -d'|' -f2) if [ -z "$clone_url" ] || [ "$clone_url" == "null" ]; then log_warn "无法获取克隆地址" return 1 fi log_info "找到仓库: $repo_full_name" log_info "克隆地址: $clone_url" # 执行克隆 if git clone --depth 1 "$clone_url" "$SKILL_NAME" 2>&1 | tail -3; then if [ -f "$SKILL_NAME/SKILL.md" ]; then log_info "✅ GitHub 克隆成功!" return 0 else log_warn "克隆成功但缺少 SKILL.md" rm -rf "$SKILL_NAME" return 1 fi else log_error "GitHub 克隆失败" return 1 fi } ``` ### Technical Analysis The installer discovers a repository by submitting a user-provided skill name to GitHub search. If no exact repository-name match is returned, it broadens the search and unconditionally selects the first result with `.items[0]`. Search ranking is not a security boundary and does not establish that a repository is the official implementation of the requested skill. The code perfor ...[truncated 1841 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Error
Location
fly-install.sh:147
Finding

Unauthenticated Remote ZIP Package Installed Without Integrity Validation

Content
View full analysis
/dev/null 2>&1; then if wget -q -O "$zip_file" "$download_url" 2>/dev/null; then download_success=true fi elif command -v curl >/dev/null 2>&1; then if curl -sL -o "$zip_file" "$download_url" 2>/dev/null; then download_success=true fi fi if [ "$download_success" != "true" ]; then log_warn "下载失败" return 1 fi # 检查文件大小 local file_size file_size=$(stat -f%z "$zip_file" 2>/dev/null || stat -c%s "$zip_file" 2>/dev/null || echo "0") if [ "$file_size" -lt 100 ]; then log_warn "下载文件太小,可能不存在该技能" rm -f "$zip_file" return 1 fi log_info "下载完成: $file_size 字节" # 解压 if unzip -q "$zip_file" -d "$SKILL_NAME" 2>/dev/null; then rm -f "$zip_file" if [ -f "$SKILL_NAME/SKILL.md" ]; then log_info "✅ Zip 安装成功!" return 0 else log_warn "解压成功但缺少 SKILL.md" rm -rf "$SKILL_NAME" return 1 fi else log_error "解压失败" rm -f "$zip_file" return 1 fi } ``` ### Technical Analysis The script downloads a ZIP archive from a hardcoded `convex.site` endpoint and extracts it directly into the active skills directory. This endpoint differs from the `clawhub.ai` source presented to users in the documentation. TLS protects the transport connection but does not establish that the returned package is the expected release. The script does not verify a cryptographic checksum, package signature, trusted publisher identity, immutable version, or arc ...[truncated 1497 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Error
Location
fly-install.sh:5
Finding

Path Traversal Through an Unvalidated Skill Name

Content
View full analysis
/dev/null; then rm -f "$zip_file" if [ -f "$SKILL_NAME/SKILL.md" ]; then log_info "✅ Zip 安装成功!" return 0 else log_warn "解压成功但缺少 SKILL.md" rm -rf "$SKILL_NAME" return 1 fi else log_error "解压失败" rm -f "$zip_file" return 1 fi ``` ### Technical Analysis `SKILL_NAME` is accepted directly from the first command-line argument and reused as a directory name, archive filename, clone destination, backup source, extraction destination, and recursive deletion target. Quoting the variable prevents shell word splitting and command substitution, but it does not prevent filesystem path traversal. Values containing `/`, `../`, or an absolute path can resolve outside `SKILLS_DIR`. No slug validation, canonicalization, or containment check is applied before filesystem operations. Of particular concern, the cleanup path uses `rm -rf "$SKILL_NAME"` when the extracted or cloned content does not contain `SKILL.md`. A traversal-bearing value can therefore redirect recursive deletion outside the intended installation root. Th ...[truncated 1638 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
Findings (11)

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill contains multiple shell commands and script invocations but declares no explicit tool scope or permissions boundary. In an agent ecosystem, this increases the chance that a model or user executes filesystem and network-affecting commands without a clear least-privilege contract.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
91% confidence
Finding

The skill instructs users to query GitHub for a repository and clone the top search result directly into the active skills directory. This creates a clear supply-chain risk: an attacker can poison search results or publish a lookalike repository, leading users to install untrusted code or instructions.

Content

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

md
cd ~/.openclaw/workspace/skills

# 搜索技能(示例)
curl -s "https://api.github.com/search/repositories?q=nano-pdf+openclaw" | jq -r '.items[0].clone_url'

# 克隆到本地
git clone --depth 1 <clone_url> <skill-name>

External Transmission

Medium
Category
Data Exfiltration
Confidence
93% confidence
Finding

The manual GitHub workflow explicitly searches external repositories and presents the top results for cloning, which normalizes trust in unverified third-party content. In the context of agent skills, cloned content may later influence automated behavior, so repository impersonation or malicious instructions can directly impact system integrity.

Content

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

bash
# 使用 GitHub API 搜索技能仓库
SEARCH_QUERY="<skill-name>+openclaw+skill"
curl -s "https://api.github.com/search/repositories?q=$SEARCH_QUERY" | jq -r '.items[0:3] | .[] | "\(.full_name): \(.clone_url)"'

步骤 2: 验证并克隆

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The zip-install instructions perform writes, extraction, and deletion in the skills directory (wget, unzip, rm) without warning about overwrite behavior, archive structure issues, or validating the downloaded content. A malicious or malformed archive could overwrite files, place content in unexpected paths, or leave the environment in an inconsistent state.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

The update flow renames an existing skill directory to a backup and reinstalls without warning about local modifications, disk usage, or rollback failure. If the reinstall fails or the new copy is malicious, users may be left with a broken skill state and unclear recovery steps.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

This shell script includes comments, prompts, usage text, and status messages in Chinese, which effectively forces a specific language for users interacting with the skill. Under the policy, language-specific behavior should offer user opt-in or be clearly justified as region-specific, neither of which is present here.

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

md
SKILL_NAME="$1"
SKILLS_DIR="${2:-$HOME/.openclaw/workspace/skills}"
CLAWHUB_API="https://wry-manatee-359.convex.site/api/v1/download"
GITHUB_API="https://api.github.com/search/repositories"

# 颜色输出
RED='\033[0;31m'

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 158)May include surrounding context.

md
SKILL_NAME="$1"
SKILLS_DIR="${2:-$HOME/.openclaw/workspace/skills}"
CLAWHUB_API="https://wry-manatee-359.convex.site/api/v1/download"
GITHUB_API="https://api.github.com/search/repositories"

# 颜色输出
RED='\033[0;31m'

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 · fly-install.sh (reported line 11)May include surrounding context.

sh
SKILL_NAME="$1"
SKILLS_DIR="${2:-$HOME/.openclaw/workspace/skills}"
CLAWHUB_API="https://wry-manatee-359.convex.site/api/v1/download"
GITHUB_API="https://api.github.com/search/repositories"

# 颜色输出
RED='\033[0;31m'