git clone https://github.com/ComeOnOliver/skillshub
T=$(mktemp -d) && git clone --depth=1 https://github.com/ComeOnOliver/skillshub "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/prompt-security/clawsec/clawsec-scanner" ~/.claude/skills/comeonoliver-skillshub-clawsec-scanner && rm -rf "$T"
skills/prompt-security/clawsec/clawsec-scanner/SKILL.mdClawSec Scanner
Comprehensive security scanner for agent platforms that automates vulnerability detection across multiple dimensions:
- Dependency Scanning: Analyzes npm and Python dependencies using
andnpm audit
with structured JSON output parsingpip-audit - CVE Database Integration: Queries OSV (primary), NVD 2.0, and GitHub Advisory Database for vulnerability enrichment
- SAST Analysis: Static code analysis using Semgrep (JavaScript/TypeScript) and Bandit (Python) to detect hardcoded secrets, command injection, path traversal, and unsafe deserialization
- DAST Framework: Agent-specific dynamic analysis with real OpenClaw hook execution harness (malicious input, timeout, output bounds, event mutation safety)
- Unified Reporting: Consolidated vulnerability reports with severity classification and remediation guidance
- Continuous Monitoring: OpenClaw hook integration for automated periodic scanning
Features
Multi-Engine Scanning
The scanner orchestrates four complementary scan types to provide comprehensive vulnerability coverage:
-
Dependency Scanning
- Executes
andnpm audit --json
as subprocessespip-audit -f json - Parses structured output to extract CVE IDs, severity, affected versions
- Handles edge cases: missing package-lock.json, zero vulnerabilities, malformed JSON
- Executes
-
CVE Database Queries
- OSV API (primary): Free, no authentication, broad ecosystem support (npm, PyPI, Go, Maven)
- NVD 2.0 (optional): Requires API key to avoid 6-second rate limiting
- GitHub Advisory Database (optional): GraphQL API with OAuth token
- Normalizes all API responses to unified
schemaVulnerability
-
Static Analysis (SAST)
- Semgrep for JavaScript/TypeScript: Detects security issues using
or--config auto--config p/security-audit - Bandit for Python: Leverages existing
configurationpyproject.toml - Identifies: hardcoded secrets (API keys, tokens), command injection (
,eval
), path traversal, unsafe deserializationexec
- Semgrep for JavaScript/TypeScript: Detects security issues using
-
Dynamic Analysis (DAST)
- Real hook execution harness for OpenClaw hook handlers discovered from
metadataHOOK.md - Verifies: malicious input resilience, timeout behavior, output amplification bounds, and core event mutation safety
- Note: Traditional web DAST tools (ZAP, Burp) do not apply to agent platforms - this provides agent-specific testing
- Real hook execution harness for OpenClaw hook handlers discovered from
Unified Reporting
All scan types emit a consistent
ScanReport JSON schema:
{ scan_id: string; // UUID timestamp: string; // ISO 8601 target: string; // Scanned path vulnerabilities: Vulnerability[]; summary: { critical: number; high: number; medium: number; low: number; info: number; } }
Each
Vulnerability object includes:
: CVE-2023-12345 or GHSA-xxxx-yyyy-zzzzid
: npm-audit | pip-audit | osv | nvd | github | sast | dastsource
: critical | high | medium | low | infoseverity
: Package name (or 'N/A' for SAST/DAST)package
: Affected versionversion
: First version with fix (if available)fixed_version
: Short descriptiontitle
: Full advisory textdescription
: URLs for more inforeferences
: ISO 8601 timestampdiscovered_at
OpenClaw Integration
Automated continuous monitoring via hook:
- Runs scanner on configurable interval (default: 86400s / 24 hours)
- Triggers on
andagent:bootstrap
eventscommand:new - Posts findings to
array with severity summaryevent.messages - Rate-limited by
environment variableCLAWSEC_SCANNER_INTERVAL
Installation
Prerequisites
Verify required binaries are available:
# Core runtimes node --version # v20+ npm --version python3 --version # 3.10+ # Scanning tools pip-audit --version # Install: uv pip install pip-audit semgrep --version # Install: pip install semgrep OR brew install semgrep bandit --version # Install: uv pip install bandit # Utilities jq --version curl --version
Option A: Via clawhub (recommended)
npx clawhub@latest install clawsec-scanner
Option B: Manual installation with verification
set -euo pipefail VERSION="${SKILL_VERSION:?Set SKILL_VERSION (e.g. 0.1.0)}" INSTALL_ROOT="${INSTALL_ROOT:-$HOME/.openclaw/skills}" DEST="$INSTALL_ROOT/clawsec-scanner" BASE="https://github.com/prompt-security/clawsec/releases/download/clawsec-scanner-v${VERSION}" TEMP_DIR="$(mktemp -d)" trap 'rm -rf "$TEMP_DIR"' EXIT # Pinned release-signing public key # Fingerprint (SHA-256 of SPKI DER): 711424e4535f84093fefb024cd1ca4ec87439e53907b305b79a631d5befba9c8 cat > "$TEMP_DIR/release-signing-public.pem" <<'PEM' -----BEGIN PUBLIC KEY----- MCowBQYDK2VwAyEAS7nijfMcUoOBCj4yOXJX+GYGv2pFl2Yaha1P4v5Cm6A= -----END PUBLIC KEY----- PEM ZIP_NAME="clawsec-scanner-v${VERSION}.zip" # Download release archive + signed checksums curl -fsSL "$BASE/$ZIP_NAME" -o "$TEMP_DIR/$ZIP_NAME" curl -fsSL "$BASE/checksums.json" -o "$TEMP_DIR/checksums.json" curl -fsSL "$BASE/checksums.sig" -o "$TEMP_DIR/checksums.sig" # Verify checksums manifest signature openssl base64 -d -A -in "$TEMP_DIR/checksums.sig" -out "$TEMP_DIR/checksums.sig.bin" if ! openssl pkeyutl -verify \ -pubin \ -inkey "$TEMP_DIR/release-signing-public.pem" \ -sigfile "$TEMP_DIR/checksums.sig.bin" \ -rawin \ -in "$TEMP_DIR/checksums.json" >/dev/null 2>&1; then echo "ERROR: checksums.json signature verification failed" >&2 exit 1 fi EXPECTED_SHA="$(jq -r '.archive.sha256 // empty' "$TEMP_DIR/checksums.json")" if [ -z "$EXPECTED_SHA" ]; then echo "ERROR: checksums.json missing archive.sha256" >&2 exit 1 fi ACTUAL_SHA="$(shasum -a 256 "$TEMP_DIR/$ZIP_NAME" | awk '{print $1}')" if [ "$EXPECTED_SHA" != "$ACTUAL_SHA" ]; then echo "ERROR: Archive checksum mismatch" >&2 exit 1 fi echo "Checksums verified. Installing..." mkdir -p "$INSTALL_ROOT" rm -rf "$DEST" unzip -q "$TEMP_DIR/$ZIP_NAME" -d "$INSTALL_ROOT" chmod 600 "$DEST/skill.json" find "$DEST" -type f ! -name "skill.json" -exec chmod 644 {} \; echo "Installed clawsec-scanner v${VERSION} to: $DEST" echo "Next step: Run a scan or set up continuous monitoring"
Usage
On-Demand CLI Scanning
SCANNER_DIR="${INSTALL_ROOT:-$HOME/.openclaw/skills}/clawsec-scanner" # Scan all skills with JSON output "$SCANNER_DIR/scripts/runner.sh" --target ./skills/ --output report.json --format json # Scan specific directory with human-readable output "$SCANNER_DIR/scripts/runner.sh" --target ./my-skill/ --format text # Check available flags "$SCANNER_DIR/scripts/runner.sh" --help
CLI Flags:
: Directory to scan (required)--target <path>
: Write results to file (optional, defaults to stdout)--output <file>
: Output format (default: json)--format <json|text>
: Verify all required binaries are installed--check
OpenClaw Hook Setup (Continuous Monitoring)
Enable automated periodic scanning:
SCANNER_DIR="${INSTALL_ROOT:-$HOME/.openclaw/skills}/clawsec-scanner" node "$SCANNER_DIR/scripts/setup_scanner_hook.mjs"
This creates a hook that:
- Scans on
andagent:bootstrap
eventscommand:new - Respects
rate limiting (default: 86400 seconds / 24 hours)CLAWSEC_SCANNER_INTERVAL - Posts findings to conversation with severity summary
- Recommends remediation for high/critical vulnerabilities
Restart the OpenClaw gateway after enabling the hook, then run
/new to trigger an immediate scan.
Environment Variables
# Optional - NVD API key to avoid rate limiting (6-second delays without key) export CLAWSEC_NVD_API_KEY="your-nvd-api-key" # Optional - GitHub OAuth token for Advisory Database queries export GITHUB_TOKEN="ghp_your_token_here" # Optional - Scanner hook interval in seconds (default: 86400 / 24 hours) export CLAWSEC_SCANNER_INTERVAL="86400" # Optional - Allow unsigned advisory feed during development (from clawsec-suite) export CLAWSEC_ALLOW_UNSIGNED_FEED="1"
Architecture
Modular Design
Each scan type is an independent module that can run standalone or as part of unified scan:
scripts/runner.sh # Orchestration layer ├── scan_dependencies.mjs # npm audit + pip-audit ├── query_cve_databases.mjs # OSV/NVD/GitHub API queries ├── sast_analyzer.mjs # Semgrep + Bandit static analysis ├── dast_runner.mjs # Dynamic security testing orchestration └── dast_hook_executor.mjs # Isolated real hook execution harness lib/ ├── report.mjs # Result aggregation and formatting ├── utils.mjs # Subprocess exec, JSON parsing, error handling └── types.ts # TypeScript schema definitions hooks/clawsec-scanner-hook/ ├── HOOK.md # OpenClaw hook metadata └── handler.ts # Periodic scan trigger
Fail-Open Philosophy
The scanner prioritizes availability over strict failure propagation:
- Network failures → emit partial results, log warnings
- Missing tools → skip that scan type, continue with others
- Malformed JSON → parse what's valid, log errors
- API rate limits → implement exponential backoff, fallback to other sources
- Zero vulnerabilities → emit success report with empty array
Critical failures that exit immediately:
- Target path does not exist
- No scanning tools available (all bins missing)
- Concurrent scan detected (lockfile present)
Subprocess Execution Pattern
All external tools run as subprocesses with structured JSON output:
import { spawn } from 'node:child_process'; // Example: npm audit execution const proc = spawn('npm', ['audit', '--json'], { cwd: targetPath, stdio: ['ignore', 'pipe', 'pipe'] }); // Handle non-zero exit codes gracefully // npm audit exits 1 when vulnerabilities found (not an error!) proc.on('close', code => { if (code !== 0 && stderr.includes('ERR!')) { // Actual error reject(new Error(stderr)); } else { // Vulnerabilities found or success resolve(JSON.parse(stdout)); } });
Troubleshooting
Common Issues
"Missing package-lock.json" warning
requires lockfile to runnpm audit- Run
in target directory to generatenpm install - Scanner continues with other scan types if npm audit fails
"NVD API rate limit exceeded"
- Set
environment variableCLAWSEC_NVD_API_KEY - Without API key: 6-second delays enforced between requests
- OSV API used as primary source (no rate limits)
"pip-audit not found"
- Install:
oruv pip install pip-auditpip install pip-audit - Verify:
which pip-audit - Add to PATH if installed in non-standard location
"Semgrep binary missing"
- Install:
ORpip install semgrepbrew install semgrep - Requires Python 3.8+ runtime
- Alternative: use Docker image
returntocorp/semgrep
"TypeScript hook not executable in DAST harness"
- The DAST harness executes real hook handlers and transpiles
files when a TypeScript compiler is availablehandler.ts - Install TypeScript in the scanner environment:
(or providenpm install -D typescript
/handler.js
)handler.mjs - Without a compiler, scanner reports an
-level coverage finding instead of a high-severity vulnerabilityinfo
"Concurrent scan detected"
- Lockfile exists:
/tmp/clawsec-scanner.lock - Wait for running scan to complete or manually remove lockfile
- Prevents overlapping scans that could produce inconsistent results
Verification
Check scanner is working correctly:
# Verify required binaries ./scripts/runner.sh --check # Run unit tests node test/dependency_scanner.test.mjs node test/cve_integration.test.mjs node test/sast_engine.test.mjs node test/dast_harness.test.mjs # Validate skill structure python ../../utils/validate_skill.py . # Scan test fixtures (should detect known vulnerabilities) ./scripts/runner.sh --target test/fixtures/ --format text
Development
Running Tests
# All tests (vanilla Node.js, no framework) for test in test/*.test.mjs; do node "$test" || exit 1 done # Individual test suites node test/dependency_scanner.test.mjs # Dependency scanning node test/cve_integration.test.mjs # CVE database APIs node test/sast_engine.test.mjs # Static analysis node test/dast_harness.test.mjs # DAST harness execution
Linting
# JavaScript/TypeScript npx eslint . --ext .ts,.tsx,.js,.jsx,.mjs --max-warnings 0 # Python (Bandit already configured in pyproject.toml) ruff check . bandit -r . -ll # Shell scripts shellcheck scripts/*.sh
Adding Custom Semgrep Rules
Create custom rules in
.semgrep/rules/:
rules: - id: custom-security-rule pattern: dangerous_function($ARG) message: Avoid dangerous_function - use safe_alternative instead severity: WARNING languages: [javascript, typescript]
Update
scripts/sast_analyzer.mjs to include custom rules:
const proc = spawn('semgrep', [ 'scan', '--config', 'auto', '--config', '.semgrep/rules/', // Add custom rules '--json', targetPath ]);
Integration with ClawSec Suite
The scanner works standalone or as part of the ClawSec ecosystem:
- clawsec-suite: Meta-skill that can install and manage clawsec-scanner
- clawsec-feed: Advisory feed for malicious skill detection (complementary)
- openclaw-audit-watchdog: Cron-based audit automation (similar pattern)
Install the full ClawSec suite:
npx clawhub@latest install clawsec-suite # Then use clawsec-suite to discover and install clawsec-scanner
Security Considerations
Scanner Security
- No hardcoded secrets in scanner code
- API keys read from environment variables only (never logged or committed)
- Subprocess arguments use arrays to prevent shell injection
- All external tool output parsed with try/catch error handling
Vulnerability Prioritization
Critical/High severity findings should be addressed immediately:
- Known exploits in dependencies (CVSS 9.0+)
- Hardcoded API keys or credentials in code
- Command injection vulnerabilities
- Path traversal without validation
Medium/Low severity findings can be addressed in normal sprint cycles:
- Outdated dependencies without known exploits
- Missing security headers
- Weak cryptography usage
Info findings are advisory only:
- Deprecated API usage
- Code quality issues flagged by linters
Roadmap
v0.0.2 (Current)
- Dependency scanning (npm audit, pip-audit)
- CVE database integration (OSV, NVD, GitHub Advisory)
- SAST analysis (Semgrep, Bandit)
- Real OpenClaw hook execution harness for DAST
- Unified JSON reporting
- OpenClaw hook integration
Future Enhancements
- Automatic remediation (dependency upgrades, code fixes)
- SARIF output format for GitHub Code Scanning integration
- Web dashboard for vulnerability tracking over time
- CI/CD GitHub Action for PR blocking on high-severity findings
- Container image scanning (Docker, OCI)
- Infrastructure-as-Code scanning (Terraform, CloudFormation)
- Comprehensive agent workflow DAST (requires deeper platform integration)
Contributing
Found a security issue? Please report privately to security@prompt.security.
For feature requests and bug reports, open an issue at: https://github.com/prompt-security/clawsec/issues
License
AGPL-3.0-or-later
See LICENSE file in repository root for full text.
Resources
- ClawSec Homepage: https://clawsec.prompt.security
- Documentation: https://clawsec.prompt.security/scanner
- GitHub Repository: https://github.com/prompt-security/clawsec
- OSV API Docs: https://osv.dev/docs/
- NVD API Docs: https://nvd.nist.gov/developers/vulnerabilities
- Semgrep Registry: https://semgrep.dev/explore
- Bandit Documentation: https://bandit.readthedocs.io/