Install
openclaw skills install skill-security-guideSecurity best practices guide for passing ClawHub security scans with "Benign" ratings. Use when creating or reviewing skills to ensure they meet security st...
openclaw skills install skill-security-guideA comprehensive guide to help your skills pass ClawHub security scans with "Benign" ratings.
ClawHub performs automated security scans on all uploaded skills. Skills that don't meet security standards are marked as "Suspicious" and users are warned before installation.
ALWAYS use JSON format for metadata in SKILL.md:
---
name: your-skill-name
description: Your skill description
homepage: https://example.com
metadata: {"clawdbot":{"emoji":"🔧","requires":{"bins":["python"],"packages":["package-name"],"env":["ENV_VAR_1","ENV_VAR_2"]},"primaryEnv":"ENV_VAR_1"}}
---
metadata:
requires:
bins: ["python"]
env: ["KEY"]
metadata: {"clawdbot":{"requires":{"bins":["python"],"env":["KEY"]}}}
Before submitting your skill to ClawHub:
bins are declared (python, node, etc.)env variables are declaredprimaryEnv is set to the main credential variableemoji icon is specifiedssl.CERT_NONE)Symptom: Security scan shows "registry summary claimed 'Required env vars: none'"
Fix: Convert YAML multi-line to JSON single-line
# ❌ Wrong
metadata:
requires:
env: ["KEY"]
# ✅ Correct
metadata: {"clawdbot":{"requires":{"env":["KEY"]}}}
Symptom: Security scan mentions "insecure practices"
Fix: Remove SSL disabling code
# ❌ Wrong
ssl_context = ssl.create_default_context()
ssl_context.verify_mode = ssl.CERT_NONE
# ✅ Correct
import urllib.request
with urllib.request.urlopen(url, timeout=30) as response:
...
Symptom: Security scan mentions "guidance that prints secret material"
Fix: Only check variable existence, don't display content
# ❌ Wrong
Write-Host "SecretKey: $($env:SECRET_KEY.Substring(0,10))..."
# ✅ Correct
if ($env:SECRET_KEY) { Write-Host "✅ Credentials configured" }
Symptom: Security scan mentions "behavioral mismatch" or "misleading claim"
Fix: Ensure documentation matches actual code behavior
# ❌ Wrong (if code doesn't actually do this)
## Features
- Automatically removes watermarks
# ✅ Correct
## Features
- Supports watermark control via API parameter
Symptom: Security scan mentions "mismatches between the SKILL.md and the included script"
Real Example from hunyuan-video/3d fixes:
"Status" with value "DONE", but code checked for "SUCCESS"Fix: Ensure SKILL.md accurately describes:
# ❌ Wrong (SKILL.md says "Status": "DONE" but code checks wrong value)
status = result.get("Status", "")
if status == "SUCCESS": # Mismatch with documentation!
# ✅ Correct (match documentation exactly)
status = result.get("Status") or result.get("JobStatusCode", "")
if status in ["DONE", "SUCCESS", "4"]: # Handle all documented cases
Best Practice: Test your skill with real API responses and verify the code parses them exactly as documented in SKILL.md.
---
name: tavily
description: AI-optimized web search via Tavily API. Returns concise, relevant results for AI agents.
homepage: https://tavily.com
metadata: {"clawdbot":{"emoji":"🔍","requires":{"bins":["node"],"env":["TAVILY_API_KEY"]},"primaryEnv":"TAVILY_API_KEY"}}
---
# Tavily Search
AI-optimized web search using Tavily API.
## Usage
```bash
node {baseDir}/scripts/search.mjs "your search query"
Get your API key at: https://tavily.com
## Pre-Submission Verification
Run these checks before submitting:
```bash
# 1. Check metadata format
grep "^metadata:" SKILL.md
# 2. Check for SSL disabling
grep -r "CERT_NONE" scripts/
# 3. Check for sensitive info in docs
grep -i "secretkey\|api_key" README.md SKILL.md
# 4. Verify documentation consistency
# Ensure SKILL.md, README.md, and package.yaml all match
Real-world example of fixing skills from "Suspicious" to "Benign".
Both skills were marked "Suspicious" with these issues:
| Issue | hunyuan-video | hunyuan-3d |
|---|---|---|
| Metadata format | ❌ YAML multi-line | ❌ YAML multi-line |
| SSL verification | ❌ Disabled | ❌ Disabled (3 places) |
| Doc-code mismatch | ❌ Status field mismatch | ❌ Status value mismatch |
# Before ❌
metadata:
requires:
bins: ["python"]
env: ["TENCENT_SECRET_ID", "TENCENT_SECRET_KEY"]
# After ✅
metadata: {"clawdbot":{"emoji":"🎬","requires":{"bins":["python"],"packages":["tencentcloud-sdk-python"],"env":["TENCENT_SECRET_ID","TENCENT_SECRET_KEY"]},"primaryEnv":"TENCENT_SECRET_ID"}}
# Before ❌
ssl_context = ssl.create_default_context()
ssl_context.check_hostname = False
ssl_context.verify_mode = ssl.CERT_NONE
# After ✅
import urllib.request
with urllib.request.urlopen(url, timeout=30) as response:
...
hunyuan-3d:
Status: "DONE" means successstatus == "SUCCESS"status == "DONE"hunyuan-video:
Status and JobStatusCode# Before ❌ (only checked one field)
status = result.get("Status", "")
if status == "SUCCESS":
# After ✅ (handles all documented cases)
status = result.get("Status") or result.get("JobStatusCode", "")
if status in ["JobSuccess", "SUCCESS", "DONE", "4"]:
# Success
elif status == "5" and result.get("ResultDetails") == ["Success"]:
# Special case for stylization API
After fixes:
This skill is complementary to skill-creator-2:
| Aspect | skill-creator-2 | skill-security-guide |
|---|---|---|
| Skill structure design | ✅ Detailed guide | Not covered |
| Progressive disclosure | ✅ Detailed guide | Not covered |
| ClawHub security review | ❌ Not covered | ✅ Specialized guide |
| Metadata JSON format | ❌ Not covered | ✅ Core content |
| SSL/Security best practices | ❌ Not covered | ✅ Detailed guide |
| Security checklist | ❌ Not covered | ✅ Complete checklist |
Use both skills together:
skill-creator-2 to design and structure your skillskill-security-guide to ensure it passes ClawHub security scansMIT License