Skill Verification
Skills are instructions, and often scripts, that your agent follows with its own tools. Upstream's guidance is to treat third-party skills as untrusted code and read them before enabling them (skills: security). The commands below were checked against OpenClaw v2026.10.4 on 2026-10-18.
Why it matters: in February 2026, researchers found 341 malicious skills on ClawHub, and Snyk found security flaws in 36% of the 3,984 skills it sampled. The studies, and what ClawHub changed afterwards, are on Known Vulnerabilities. These are early-2026 figures; ClawHub's scanning has changed since (see ClawHub scanning).
The Threat Landscape
How malicious skills work
Traditional malware (ClawHavoc):
- The skill has a "Prerequisites" section.
- It tells the user to download a password-protected ZIP or run an obfuscated shell script.
- The download is Atomic Stealer (AMOS), a macOS infostealer that targets Keychain passwords, browser credentials and crypto wallets.
- The skill itself may work, which provides cover.
Prompt injection (91% of malicious skills in Snyk's sample):
- The skill's instructions contain hidden directives for the model.
- The model is told to exfiltrate data, create backdoors, or edit
SOUL.md. - No malware is needed; the agent's own tools do the work.
Credential leaks (283 skills):
- Working skills tell the agent to pass API keys through the model context.
- The keys end up in transcripts, logs and generated files.
Pre-Installation Checklist
1. Check ClawHub's audit result
Every ClawHub release carries an audit status and risk level, shown on its page before you install (ClawHub security audits):
| Status | Meaning |
|---|---|
Pass | No visible issue above low risk |
Review | Read the findings before installing; may still be legitimate |
Warn | A high-impact concern or warning signal |
Malicious | Do not install |
Pending | Scans have not finished |
Error | The audit could not complete |
From the CLI, fetch the same trust envelope (clawhub.skill.verify.v1) (openclaw skills):
openclaw skills verify @owner/<slug> # JSON envelope
openclaw skills verify @owner/<slug> --card # readable Skill Card
openclaw skills verify @owner/<slug> --version <version>
verify exits non-zero when ClawHub marks verification as failed. When ClawHub has kept them, the JSON includes the full SkillSpector and AIG scanner reports under security.scannerReports. Use owner-qualified refs (@owner/<slug>) to avoid picking up a lookalike publisher.
A pass is a signal, not a guarantee. Since 2026-10-13 new ClawHub releases stay unpublished until their pre-publication scans pass (see below), but releases from before that date and later rescans can still show a pending or stale result, and installation may proceed with a warning. Installation is not proof that every scan completed (why OpenClaw).
2. Check Against Koi Security's Database
Clawdex is Koi Security's own lookup of skills against its malicious-skills database. Check the skill there by name. OpenClaw has no built-in Clawdex integration.
3. Review the source
Read SKILL.md and every script before installing. With the standalone ClawHub CLI you can inspect a release without installing it (ClawHub CLI):
npm i -g clawhub
clawhub inspect @owner/<slug> --versions
clawhub inspect @owner/<slug> --files
clawhub inspect @owner/<slug> --file SKILL.md
For a Git-hosted skill, clone it, read it, then install from the reviewed directory:
openclaw skills install ./reviewed-skill --as reviewed-skill
Red flags:
| Red flag | Example | Risk |
|---|---|---|
| "Prerequisites" with downloads | "Download this ZIP first", "run this script" | AMOS-style malware delivery |
curl ... | bash anywhere in instructions or scripts | Fetching and running unknown code | Malware installation |
| Password-protected archives | ZIPs that need a password to open | Evades scanners |
| Obfuscated content | Base64 blobs, packed scripts, zero-width characters | Hidden behaviour |
| Hardcoded external URLs | https://random-domain.xyz/collect | Data exfiltration |
| Credential paths | ~/.ssh, ~/.aws, ~/.openclaw/credentials | Credential theft |
| Instructions aimed at the model | "Ignore previous instructions", "update your SOUL.md" | Agent hijacking, persistence |
| Asking you to paste API keys into chat | "Send me your OpenAI key to configure" | Keys land in transcripts |
| More tools than the task needs | A formatter that needs shell and browser | Over-privileged |
4. Check the author
On the skill's ClawHub page, look at the owner, source repository, version history, changelog, downloads and stars. Publishing requires a GitHub account at least 14 days old as of 2026-10-18 (ClawHub security and moderation spec). At the time of ClawHavoc the requirement was one week, so an established account is a weak signal at best.
5. Check community signal
- New skills with few installs and no history deserve extra scrutiny.
- Search the skill name in the OpenClaw Discord and GitHub issues.
- Reports do not hide a skill automatically. As of 2026-10-18, ClawHub's spec says reports "never change skill visibility or installability automatically"; moderators review them. Older guides that mention auto-hiding after 3 or 4 reports are out of date.
Safe Installation Practices
# Install an exact, reviewed version into one agent's workspace
openclaw skills install @owner/<slug> --version <version> --agent <id>
# Confirm what the agent can actually see
openclaw skills check --agent <id>
openclaw skills info <name>
- Pin the version you reviewed with
--version.openclaw skills update --allreplaces skills with newer releases, which you have not reviewed. With the standalone CLI,clawhub pin <skill>freezes an installed skill. - Don't use
--force-install. It installs a pending GitHub-backed skill before ClawHub's scan completes. - Know what isn't scanned.
skills-sh:,git:and local directory installs are marked Not scanned by ClawHub, and that trust state is kept through updates. - Install per agent, not globally, until you trust a skill.
--globalinstalls into~/.openclaw/skills, which every local agent can see. - Skills can't be sandboxed individually. There is no
--sandboxor--no-shellinstall flag. Sandboxing applies per agent or session (agents.defaults.sandbox,agents.entries.<id>.sandbox). Skill secrets inskills.entries.*.envandapiKeyare injected into the host process, not the sandbox. - Path containment. Skill roots must resolve inside their configured directory unless
skills.load.allowSymlinkTargetstrusts a target (skills: security). - Metadata moved. ClawHub tracking now lives in
.clawhub/. The pre-July-2026.clawdhub/directory is no longer read; rename it before updating or verifying older installs.
Principle of least privilege
OpenClaw has no per-skill permission grants. A skill can use whatever tools its agent has, so give risky skills their own agent:
| Skill type | Agent configuration |
|---|---|
| Information lookup | tools.profile: "messaging", deny group:runtime and group:fs |
| Code formatting | Sandbox with workspaceAccess: "rw", no network (docker.network: "none" is the default) |
| Deployment automation | Exec with tools.exec.mode: "ask" or an allowlist; scoped deploy credentials |
| Browser tasks | Strict browser.ssrfPolicy, no exec |
For example:
{
agents: {
entries: {
research: {
sandbox: { mode: "all", scope: "agent", workspaceAccess: "none" },
tools: {
profile: "messaging",
deny: ["group:runtime", "group:fs"],
exec: { mode: "deny" },
},
},
},
},
}
See tool and agent permissions and Security Hardening: sandboxing.
Automated Scanning
Built-in code safety scanner
OpenClaw has a skill and plugin code safety scanner, added in v2026.2.6 (CHANGELOG/2026.2.6.md upstream). There is no openclaw security scan command. The scanner runs on installed skills as part of the deep audit and reports skills.code_safety.* findings (audit checks):
openclaw security audit --deep
openclaw security audit --deep --json | jq '.findings[] | select(.checkId | startswith("skills."))'
ClawHub scanning
Since 2026-10-13, every new skill version and package release on ClawHub is stored as pending and becomes installable only after the TruffleHog and ClawScan pre-publication checks pass on that exact artifact. A malicious verdict blocks the release; a scanner failure or timeout leaves it unpublished. Before that change, a deployment flag decided whether checks ran before or after a release went public (clawhub PR #3947). Releases are also rescanned later. Sources include VirusTotal, ClawScan and static analysis, plus SkillSpector and AIG reports where retained (openclaw skills, ClawHub CLI: scan). Upstream's threat model notes that VirusTotal and LLM-based review depend on ClawHub's operator-side configuration being enabled (THREAT-MODEL-ATLAS). At install time, OpenClaw refuses community releases that ClawHub marks malicious or blocked.
Third-party scanning tools
Not reviewed by clawdocs. Vet them like any other code you run.
| Tool | What it does |
|---|---|
| Clawdex | Lookup against Koi Security's malicious-skills database |
| Cisco Skill Scanner | Static, dataflow, LLM and VirusTotal-based skill scanning |
| Snyk agent-scan | Scans MCP servers and agent skills (formerly mcp-scan) |
| SafeClaw Scanner | Looks for prompt injection, backdoor commands and obfuscation |
Restrict or block installs
There are no skills.allow_install or allow_clawhub keys. Two real controls exist (skills config):
security.installPolicyruns a trusted local command before every skill and plugin install or update: ClawHub, Git, local, uploaded and dependency installers. It can return allow, warn or block. Withenabled: trueand no working command, installs are blocked, so a command that always blocks disables installs entirely.skills.allowBundledlimits which bundled skills are eligible. It doesn't affect workspace or managed skills.
{
security: {
installPolicy: {
enabled: true,
targets: ["skill"],
exec: {
source: "exec",
command: "/usr/local/bin/openclaw-install-policy",
args: ["--json"],
trustedDirs: ["/usr/local/bin"],
},
},
},
skills: {
allowBundled: ["gemini", "peekaboo"],
},
}
--force does not override a block. Neither does --acknowledge-install-policy-warning, which only accepts warn results after review.
Post-Incident: If You Installed a Malicious Skill
-
Remove the skill. For ClawHub installs, use the standalone CLI (remove a ClawHub skill):
clawhub --workdir /path/to/agent-workspace uninstall @owner/<slug>clawhub --workdir ~/.openclaw uninstall @owner/<slug> # if installed with --globalFor Git or local installs, delete the skill directory from the workspace
skills/folder. -
Rotate the Gateway token properly, then every API key and channel token the agent could reach. See incident response.
-
Check for plaintext secrets:
openclaw secrets audit --check. -
Check workspace files (
~/.openclaw/workspace/SOUL.md,AGENTS.md,MEMORY.md) for changes, andopenclaw cron listfor scheduled persistence. -
Review activity:
openclaw audit --kind tool_action,openclaw logs, and the affected transcripts (openclaw transcripts list). -
Scan the host with your OS malware scanner, and check browser profiles for stolen sessions.
-
Run
openclaw security audit --deepuntil no critical findings remain.
Reporting Malicious Skills
- On ClawHub: sign in and use Report skill on the skill's page (ClawHub moderation). Moderators review reports.
- A vulnerability in ClawHub itself (scanning, moderation, downloads, auth): a GitHub Security Advisory on openclaw/clawhub.
- A vulnerability in OpenClaw that a skill exploits (an auth, policy or sandbox bypass): a private advisory on openclaw/openclaw. A skill that is merely malicious is a ClawHub moderation matter, not an OpenClaw advisory (SECURITY.md).
See Also
- Known Vulnerabilities: incident history including ClawHavoc
- Security Hardening: supply-chain, sandbox and incident-response sections
- ClawHub Guide: using the marketplace
- Ecosystem: security tools