Back to skill

Security audit

fco-monitor

Security checks for vulnerabilities and agentic risk

Overview

The skill’s website monitoring purpose is understandable, but installation can create privileged system changes and persistence without enough explicit user control.

Read the installer before using it. Prefer running the monitor as an unprivileged user, avoid enabling the systemd service unless you really need boot-time persistence, and move config/state/log files out of shared /tmp for any serious deployment.

Vulnerability Patterns
  • System PersistenceInstalls backdoors, hooks, services, or scheduled tasks that survive the run
  • 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 (2)

T06 · System Persistence

Warning
Location
install.sh:133
Finding

Unconditional Installation of a System-Wide Persistence Definition

Content
View full analysis
"$service_file" << EOF [Unit] Description=FC Online website monitoring service After=network.target [Service] Type=simple User=$USER WorkingDirectory=/root/.openclaw/workspace/skills/fco-monitor ExecStart=/usr/bin/node openclaw-integration.js check-now Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target EOF echo "Service file created: $service_file" echo "Use the following commands to enable the service:" echo " sudo systemctl daemon-reload" echo " sudo systemctl enable fco-monitor" echo " sudo systemctl start fco-monitor" } ``` The installer invokes this function without an option or confirmation: ```bash # Create service (optional) create_service ``` ### Technical Analysis The installer labels service creation as optional, but `create_service` is always called by the main installation flow. It writes a unit directly to `/etc/systemd/system/fco-monitor.service`, which is a system-wide persistence location and normally requires root privileges. The unit does not hard-code a dedicated, restricted service account. Instead, it uses `User=$USER`. When the installer is run as root—as encouraged by its hard-coded `/root` paths and required by the write to `/etc/systemd/system`—the generated service can be configured to execute as root. Although the installer does not automatically execute `systemctl enable` or `systemctl start`, it leaves a dormant system-wide persisten ...[truncated 1925 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
fco-monitor.sh:171
Finding

Predictable Shared Temporary Files Allow Symlink and State-Tampering Attacks

Content
View full analysis
> "$LOG_FILE" if [ "$level" = "ERROR" ] || [ "$level" = "WARN" ]; then echo "[$level] $message" >&2 fi } init_config() { if [ ! -f "$CONFIG_FILE" ]; then echo "$DEFAULT_CONFIG" > "$CONFIG_FILE" log "INFO" "Initialized default configuration" fi } ``` The previous-check state is also overwritten at a predictable path: ```bash # Save current check results echo "{\"timestamp\":\"$(date +%s)\",\"news\":\"$news_list\"}" > "$LAST_CHECK_FILE" ``` ### Technical Analysis `/tmp` is normally writable by every local user. The sticky bit restricts deletion of files owned by other users, but it does not prevent an attacker from pre-creating a predictable pathname before the monitor first uses it. The script neither creates a private state directory nor validates that these paths are regular files owned by the expected service identity. Standard shell `>` and `>>` redirection can follow symbolic links. Consequently, a local attacker may pre-create one of the paths as a symbolic link or attacker-controlled regular file. This becomes especially significant when combined with the installer's systemd unit, which may run the monitor as root. On systems where protected-symlink kernel settings do not block the operation, a ...[truncated 2391 chars]
Remediation
View remediation
"$tmp_file" chmod 600 "$tmp_file" mv -f -- "$tmp_file" "$STATE_DIR/last-check.json" ``` 7. Use a JSON-aware tool such as `jq -n --arg` to serialize downloaded titles rather than manually interpolating them into JSON. 8. Before reading existing files, verify that they are regular files, are not symbolic links, and are owned by the current service identity. 9. If temporary storage is unavoidable, use a private runtime directory created by systemd through `RuntimeDirectory=fco-monitor` and enable `PrivateTmp=true`. 10. Run the monitor as a dedicated unprivileged user so any residual file-handling flaw has a limited impact. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (22)

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The webhook example shows forwarding monitoring output to Discord/Slack via an external URL, but it does not warn that activity data will leave the local environment or require explicit user consent. In an agent skill context, this can lead to unintended data exfiltration of monitored content, timestamps, URLs, or future expanded payloads to third-party services.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

该发布指南从标题到全部步骤说明均仅以中文呈现,没有说明是否支持其他语言,也没有提供用户可选择的语言/locale 选项。根据规则,若技能或相关说明强制特定语言且未提供用户选择,属于自然语言层面的语言/locale 策略违规。

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The quick-start section instructs users to run an installation script and set up recurring monitoring tasks, but it does not warn that these actions can modify system state, create scheduled jobs, and write configuration or log files. In a security-sensitive agent/skill ecosystem, undocumented side effects reduce informed consent and can cause users to execute privileged or persistent changes they did not expect.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

The README forces a specific language for all user-facing instructions and examples, and nowhere offers an alternative language or opt-in. Under the policy, language constraints should either be optional for users or clearly justified as region-specific.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% 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 146)May include surrounding context.

md
## 🌟 Star 历史

[![Star History Chart](https://api.star-history.com/svg?repos=openclaw/skill-fco-monitor&type=Date)](https://star-history.com/#openclaw/skill-fco-monitor&Date)

---

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This shell script includes help text and operational messages only in Chinese, which effectively forces a specific language on users. The file does not provide any opt-in, alternative locale, or justification that it is intended solely for a Chinese-speaking or region-specific environment.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The script attempts to install missing packages with yum or apt-get automatically and without user approval. This can trigger privileged package operations, modify the host environment unexpectedly, and normalize running untrusted installers with elevated permissions.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The installer writes configuration data into /root/.openclaw/config and copies files into OpenClaw skill directories without any prompt, dry-run mode, or explicit consent. Even if this is normal installer behavior, silent modification of privileged and user-specific paths increases the risk of unintended system changes, overwriting existing files, or abuse when a user runs an untrusted skill installer.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The installer creates a systemd unit under /etc/systemd/system without an explicit opt-in gate. Writing persistent service definitions is security-sensitive because it establishes future execution of code and modifies system boot/runtime behavior.

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
70% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

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

sh
echo "✅ 服务文件创建完成: $service_file"
  echo "   使用以下命令启用服务:"
  echo "   sudo systemctl daemon-reload"
  echo "   sudo systemctl enable fco-monitor"
  echo "   sudo systemctl start fco-monitor"
}

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
70% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

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

sh
echo "✅ 服务文件创建完成: $service_file"
  echo "   使用以下命令启用服务:"
  echo "   sudo systemctl daemon-reload"
  echo "   sudo systemctl enable fco-monitor"
  echo "   sudo systemctl start fco-monitor"
}

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
70% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

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

sh
echo "✅ 服务文件创建完成: $service_file"
  echo "   使用以下命令启用服务:"
  echo "   sudo systemctl daemon-reload"
  echo "   sudo systemctl enable fco-monitor"
  echo "   sudo systemctl start fco-monitor"
}

Session Persistence

Medium
Category
Rogue Agent
Confidence
92% confidence
Finding

The script prepares a systemd service and instructs the user to enable it, which establishes persistent execution across restarts. In the context of an untrusted skill installer, persistence is security-relevant because it turns a one-time install into ongoing code execution tied to system startup.

Content

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

sh
echo "✅ 服务文件创建完成: $service_file"
  echo "   使用以下命令启用服务:"
  echo "   sudo systemctl daemon-reload"
  echo "   sudo systemctl enable fco-monitor"
  echo "   sudo systemctl start fco-monitor"
}

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The helper executes shell commands via execSync, which is a safety-relevant operation for code files. Although there is an internal comment noting it runs shell commands, there is no user-facing warning, confirmation prompt, or disclosure in this file that invoking the skill will execute external shell commands.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
72% confidence
Finding

The file consistently presents the skill interaction, commands, and assistant responses in Chinese only, including a direct example of how the assistant should respond. Because no opt-in or language selection is offered, this may conflict with an organizational policy requiring user choice of language or locale.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The natural-language instructions and usage guidance are entirely in Chinese, and the file does not indicate that the skill is region-specific or provide an opt-in language choice. Under the stated policy, forcing a specific language without user choice or justification is a natural-language policy concern.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill describes periodic website monitoring and later documents local log writes to /tmp, but it does not clearly warn users up front that enabling the skill causes recurring network requests and local file creation. This is a real transparency and consent issue because users may unknowingly enable background activity that affects privacy, system footprint, or network policy compliance, even though the behavior itself is not overtly malicious.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
97% confidence
Finding

All user-facing messages and usage text in the script are presented only in Chinese, with no indication that the skill is region- or language-specific or that users may select another language. This can violate language/locale policy when a skill imposes a single language without opt-in.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The testConnection function uses curl to contact an external website, which is a network operation covered by the warning requirement for code files. While it logs that it is testing the site connection, it does not explicitly disclose that it will make an outbound HTTP request to a third-party domain.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The command-line help and operational messages are presented only in Chinese, which can constitute a language policy issue when no user opt-in or alternative locale is offered. There is no indication that the skill is intentionally restricted to a Chinese-speaking or region-specific audience.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The package description forces Chinese-language user-facing metadata without stating that the skill is China-specific or offering any language/locale opt-in. Under the policy, fixed language constraints should be justified or optional rather than implicitly imposed.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The displayName, description, category, and tags are all presented only in Chinese, but the manifest does not explain that the skill is region-specific or limited to a Chinese locale. This creates a natural-language locale-policy issue because users are not given a choice or clear justification for the language constraint.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.dangerous_exec

Shell command execution detected (child_process).

Critical
Code
suspicious.dangerous_exec
Location
openclaw-integration.js:24