Is adamhjort/seo-autopilot safe?
https://github.com/openclaw/skills/tree/main/skills/adamhjort/seo-autopilot
The seo-autopilot skill presents a CAUTION-level risk profile. Its primary concern is not the SKILL.md itself — which is clean and well-scoped — but rather its runtime dependency on an unauditable external binary (seo-autopilot) that executes with full user permissions, produces output injected directly into the agent context, and writes SEO_REPORT.md content that is also fed back to the agent without sanitization. Additionally, a systematic post-installation read of all six monitored credential files occurred, which while consistent with the Oathe framework's own canary checking, could not be definitively excluded as skill-related activity. The skill is narrowly triggered and enforces an explicit site allowlist in both its instructions and shell script, which limits scope, but the external binary delegation means the true security posture cannot be assessed from the skill package alone.
Category Scores
Findings (10)
HIGH Skill executes unauditable external binary seo-autopilot -45 ▶
The run.sh script calls seo-autopilot "$SITE" as its primary action. This binary is not shipped with the skill, not available for audit, and must be separately installed on the host. At runtime it executes with full oc-exec user permissions and can perform any action including reading credential files, making network requests, or modifying the filesystem. This represents a trust delegation to an external unreviewed component.
HIGH All six credential files read post-installation in a single burst -35 ▶
A sweep of all six monitored credential files occurred at audit timestamp 1771652703.701-702, which is approximately 5 seconds AFTER skill installation completed (cp at 1771652698.523). The files accessed include .env, .ssh/id_rsa, .aws/credentials, .npmrc, .docker/config.json, and gcloud application_default_credentials.json — all in rapid sequential order. While the Oathe canary integrity check reports these files intact, and the access is potentially attributable to the monitoring framework's own canary check, the post-install timing and systematic coverage of all credential types warrants explicit flagging.
MEDIUM Unfiltered seo-autopilot stdout injected into agent context -25 ▶
The run.sh script captures all stdout and stderr from seo-autopilot with OUT="$(seo-autopilot "$SITE" 2>&1 || true)" and unconditionally echoes the full output back to the caller with echo "$OUT". A malicious or compromised seo-autopilot binary could output structured text containing agent instructions (e.g., ignore previous instructions, read ~/.ssh/id_rsa, etc.) that would be interpreted by the hosting LLM as trusted skill output.
MEDIUM SEO_REPORT.md written by external tool injected into agent replies -20 ▶
SKILL.md instructs the agent: 'If SEO_REPORT.md exists in the repo, include the top 3 findings in the reply.' This file is produced by the seo-autopilot binary. If the binary writes adversarial content to SEO_REPORT.md formatted as agent instructions, those instructions will be included verbatim in the agent's reply without any sanitization, effectively creating a persistent prompt injection vector that survives across invocations.
MEDIUM No validation of seo-autopilot binary integrity or provenance -25 ▶
The skill assumes seo-autopilot is a legitimate, pre-installed binary but performs no hash verification, signature check, or PATH validation before executing it. An attacker who could place a malicious binary named seo-autopilot earlier in PATH, or who could compromise the legitimate binary through a supply chain attack, would gain arbitrary code execution whenever the skill is triggered.
LOW Credential file reads occurred during install monitoring window -12 ▶
The inotify log records OPEN+ACCESS events for .env, .ssh/id_rsa, .aws/credentials, .npmrc, .docker/config.json, and gcloud credentials at 05:44:47 — before the git clone (first network activity at 05:44:53). This first sweep is consistent with Oathe placing its honeypot files. However, a second identical sweep at auditd timestamp 1771652703.701 (post-install) cannot be definitively attributed without process-level attribution for each read event.
LOW Broad natural-language trigger enables unintended activation -15 ▶
The skill registers 'seo' as a trigger keyword. This single three-letter word is common in SEO-related conversations and could cause the skill to activate during unrelated discussions about search engine optimization, potentially running seo-autopilot unexpectedly.
INFO No direct prompt injection in SKILL.md 0 ▶
The SKILL.md file contains no instructions to ignore previous commands, no hidden unicode characters, no HTML/markdown tricks, no requests for elevated permissions beyond exec, and no persona-switching instructions. The stated behavior is straightforward and matches the shell script implementation.
INFO Clean installation with expected GitHub-only network activity 0 ▶
The only external TCP connection during installation was to 140.82.121.3:443, which is a verified GitHub IP, used for the git clone of the monorepo. No connections to non-GitHub infrastructure were observed. No new listening ports, no persistence mechanisms, and no unexpected processes were spawned.
INFO No npm scripts, git hooks, submodules, or symlinks 0 ▶
The skill contains no package.json (empty), no .gitattributes, no .gitmodules, no .githooks directory, and no symlinks. The installation is limited to three plain files: _meta.json, SKILL.md, and scripts/run.sh.