Your OpenClaw agent reads your messages, remembers your conversations, holds your keys, and acts on your behalf. That power is exactly what attackers want to borrow: one poisoned message or one malicious skill can quietly turn your agent against you.
ClawSecCheck is a security check-up for your agent. It examines your setup,
grades it AβF, and explains β in plain language, right in your chat β what
is risky and why. It reports, it doesn't remediate: it never touches your OpenClaw
config, needs no API key, and the scanner itself makes no network calls β no
telemetry, no uploads, ever. (One narrow, opt-in exception: --apply-ignore-proposals
can append entries to its own suppression file β see
Safe to run below.)
π Start in one minute β no terminal needed
1. Tell your agent:
Install the clawseccheck skill from ClawHub.
β¦or with a command: openclaw skills install @gl0di/clawseccheck Β· skill page on ClawHub
2. Then ask:
Audit my OpenClaw setup with clawseccheck.
3. Your grade and the most urgent problems appear right in the chat. Done.
What you'll see β a real report against a deliberately vulnerable test setup:
π¬ You talk β it audits
No flags, no commands. Everything works as a conversation:
| You say | You get |
|---|---|
| "Audit my OpenClaw setup" | A chat-sized card β your AβF grade, an inventory by subject, and the urgent problems most dangerous first β with a PDF companion carrying the rest: every installed skill/plugin/MCP server vetted, the riskiest capability chains, a behavioral replay, and a second opinion on any borderline call |
| "Is this skill safe to install?" | A pre-install risk verdict with the reasons β flags suspicious and dangerous skills before you enable them |
| "Am I vulnerable to prompt injection?" | An optional canary self-test you run against your own agent, alongside the static audit |
| "Watch my setup for changes" | Alerts when something changes β a new skill, config drift, a dropped score |
| "What's the most important thing to look at?" | A prioritised next-steps list based on your findings |
| "Share my grade" | A badge with the grade only β your findings stay private |
| "I think I've been hacked" | An evidence-preservation bundle for investigation |
π What it checks
| Area | The question it answers |
|---|---|
| π Exposure & network | Can strangers reach your agent β open gateway, open DMs, missing TLS? |
| β‘ Privilege & execution | Could one injected message run commands or write files on your machine? |
| π§© Installed skills & plugins | Is anything you installed malicious β hidden payloads, credential theft, supply-chain traps? |
| π Prompt-injection surface | Can untrusted text steer your agent through chat context or bootstrap files? |
| π Secrets & data at rest | Are your tokens, keys, and conversations lying around readable? |
| π‘ Monitoring & readiness | Would you even notice a compromise β and could you investigate it? |
On top of the 184 individual checks, a risk engine hunts for deadly combinations β chains like "untrusted input β reachable secrets β outbound tool" that make an attack trivial. Full list: check catalog.
π Why ClawSecCheck
- Private by architecture. Unlike scanners that upload your configuration for analysis, ClawSecCheck's engine runs entirely on your machine. No account, no API key β and the scanner contains no telemetry client and makes no network requests.
- Sees what the built-in audit misses. OpenClaw's own audit doesn't inspect
your bootstrap files (
SOUL.md,AGENTS.md, β¦) β the ones injected straight into the model as trusted context. ClawSecCheck checks them for injection. It also runs the native audit for you and folds the results into one report. - Protects you before it's too late. After the ClawHavoc wave of credential-stealing skills, "check before install" matters: ask it to vet any skill, plugin, or MCP server before you enable it.
- Honest by design. What it can't determine is reported as
UNKNOWNβ never quietly counted as safe. An open CRITICAL finding hard-caps your score: you can never get a pretty "A" with a real hole in it. - Not a rebadged lookup. No network calls means no verdict borrowed from someone else's reputation database and presented as ours. Every finding traces to a real check with its own fixture and test, an AST layer that reasons about code structure, and a combinational risk engine for the attacks that only show up as a combination of individually-ordinary capabilities β plus a documented zero-false-positive-FAIL release discipline: an alarm reaching you is a specific, reproducible, test-pinned condition in your own config, not a keyword match dressed up as a scan.
- Built like it matters. 14,100 automated tests run on every change, a false alarm is treated as a release-blocking bug, and every release is cryptographically signed.
- Free and readable. MIT-licensed, pure Python standard library, zero dependencies β the entire engine is source you can read.
π Safe to run
The tool that audits your agent survives an audit itself: it is read-only
with respect to your OpenClaw setup, its engine is offline by design, and
by default it writes only its own local history under ~/.clawseccheck/ β
removable any time by asking your agent to "purge the clawseccheck data".
A few flags write local files only when you explicitly ask for them
(--save, --badge, --html, --sarif, --pdf, --monitor, --log) β see the
User guide for the full list. The one exception that touches
the audited home itself is also opt-in and confirmation-gated:
--apply-ignore-proposals can append entries β never invent them β to its
own .clawseccheckignore suppression file there.
The widest read that reaches outside your OpenClaw home is on by default: to
catch a dependency that would run code the moment it is installed, the tool
locates your installed OpenClaw package through your PATH (no subprocess),
then walks that package's node_modules to read each dependency's manifest,
its build config, and the in-package files those name as install-time targets.
Bounded to 2,000 packages, symlinks are never followed, and nothing is ever
executed β --no-deptree skips the walk. (The host-posture scan and the
listening-socket scan also read outside the home; --no-host and --no-sockets
skip those.) See the
security model for the complete, itemized capability
surface.
One honest nuance: when you use it through OpenClaw chat, the report text becomes part of your conversation and is handled by whatever model provider your agent already uses β the scanner itself adds no channel of its own. Details: security model Β· FAQ.
The bundled known-bad IOC catalog is the same story: a small, dated, provenance-tagged dataset that ships in-repo with each release and is never fetched β no feed, no update endpoint, not even opt-in. See Bundled IOC dataset for the provenance policy and how staleness is surfaced.
Every release ships a SHA256SUMS.txt signed with keyless
cosign; clawseccheck --verify-self
prints your copy's digest to compare.
# Get the release assets (adjust the version):
curl -LO https://github.com/gl0di/clawseccheck/releases/download/vX.Y.Z/SHA256SUMS.txt
curl -LO https://github.com/gl0di/clawseccheck/releases/download/vX.Y.Z/SHA256SUMS.txt.bundle
cosign verify-blob \
--bundle SHA256SUMS.txt.bundle \
--certificate-identity-regexp "^https://github.com/gl0di/clawseccheck/" \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
SHA256SUMS.txt
A passing verification proves the reference digest was produced by this repo's release workflow and hasn't been altered since.
ClawSecCheck is also a full standalone CLI (zero dependencies, Python 3.9+):
pipx install "git+https://github.com/gl0di/[email protected]" # pin a release tag (recommended)
pipx install git+https://github.com/gl0di/clawseccheck # or track the latest source
clawseccheck # audits ~/.openclaw by default
clawseccheck --json # machine-readable result
clawseccheck --sarif results.sarif # SARIF 2.1.0 for GitHub Code Scanning
clawseccheck --html report.html # standalone HTML report (private)
clawseccheck --pdf report.pdf # complete audit as a paginated PDF (attach into chat)
clawseccheck --exhaustive # raise the scan caps: slower, maximum coverage
clawseccheck --fail-under 70 # CI gate: exit 1 if score < 70
The User guide covers the modes and recipes β vetting engines,
drift monitoring, attestation, red-team self-tests. clawseccheck --help is the
complete flag list.
[!IMPORTANT] An honest limit: a clean report means "no known attack pattern matched" β not "provably safe." Most checks are static: they bound what your agent can do, not how it behaves under a live attack. The optional self-tests exercise selected live paths but are graded by your own agent, so they can't prove safety against arbitrary attacks either.
UNKNOWNis always shown asUNKNOWN, never hidden. The full, unvarnished list of limitations is in the User guide.
π Documentation
| Document | What it covers |
|---|---|
| User guide | Recipes, monitoring modes, and trust details |
| Check catalog | All 184 checks: what they verify and how to remediate |
| Threat coverage | OWASP LLM Top 10 / Agentic threat mapping |
| Bundled IOC dataset | Provenance policy, refresh cadence, and freshness discipline for the known-bad catalog |
| Output schema | The frozen --json / SARIF contract |
| FAQ | Common questions, incl. the compromised-host protocol |
| Troubleshooting | ClawSecCheck itself won't run, crashes, or OpenClaw doesn't see it |
| Security model | ClawSecCheck's own capability surface and self-defense |
| Contributing | Dev setup, tests, how to author a new check |
| Support | Where a report goes β issue, discussion, or private advisory |
π Feedback, security, license
- Something looks wrong? Open an issue β false alarms are treated as bugs. If the tool itself won't run or crashes, try Troubleshooting first.
- Questions, false positives, or an attack class we don't cover yet? Start a discussion β see SUPPORT.md for where each kind of report goes.
- Found a vulnerability? Report privately via SECURITY.md.
- License: MIT for the code. The ClawSecCheck name and logo are not covered by it β see TRADEMARK.md. Contributors sign a short CLA. Maintained by gl0di.
No comments yet
Be the first to share your take.