Some checks failed
ClawSweeper Dispatch / dispatch (push) Has been cancelled
CodeQL / Security High (actions) (push) Has been cancelled
CodeQL / Security High (channel-runtime-boundary) (push) Has been cancelled
CodeQL / Security High (core-auth-secrets) (push) Has been cancelled
CodeQL / Security High (mcp-process-tool-boundary) (push) Has been cancelled
CodeQL / Security High (network-ssrf-boundary) (push) Has been cancelled
CodeQL / Security High (plugin-trust-boundary) (push) Has been cancelled
CodeQL / Security High (process-exec-boundary) (push) Has been cancelled
Docs Sync Publish Repo / sync-publish-repo (push) Has been cancelled
Docs / docs (push) Has been cancelled
OpenClaw Stable Main Closeout / Resolve stable release closeout inputs (push) Has been cancelled
OpenClaw Stable Main Closeout / Verify stable main closeout (push) Has been cancelled
Workflow Sanity / no-tabs (push) Has been cancelled
Workflow Sanity / actionlint (push) Has been cancelled
Workflow Sanity / generated-doc-baselines (push) Has been cancelled
CI / runner-admission (push) Has been cancelled
CI / preflight (push) Has been cancelled
CI / security-fast (push) Has been cancelled
CI / pnpm-store-warmup (push) Has been cancelled
CI / build-artifacts (push) Has been cancelled
CI / native-i18n (push) Has been cancelled
CI / ${{ matrix.check_name }} (push) Has been cancelled
CI / ${{ matrix.checkName }} (push) Has been cancelled
CI / checks-node-compat-node22 (push) Has been cancelled
CI / check-bundled-channel-config-metadata (push) Has been cancelled
CI / check-dependencies (push) Has been cancelled
CI / check-guards (push) Has been cancelled
CI / check-lint (push) Has been cancelled
CI / check-prod-types (push) Has been cancelled
CI / check-shrinkwrap (push) Has been cancelled
CI / check-test-types (push) Has been cancelled
CI / check-additional-boundaries-a (push) Has been cancelled
CI / check-additional-boundaries-bcd (push) Has been cancelled
CI / check-additional-extension-bundled (push) Has been cancelled
CI / check-additional-extension-channels (push) Has been cancelled
CI / check-additional-extension-package-boundary (push) Has been cancelled
CI / check-additional-runtime-topology-architecture (push) Has been cancelled
CI / check-session-accessor-boundary (push) Has been cancelled
CI / check-session-transcript-reader-boundary (push) Has been cancelled
CI / check-docs (push) Has been cancelled
CI / skills-python (push) Has been cancelled
CI / macos-swift (push) Has been cancelled
CI / ios-build (push) Has been cancelled
CI / ci-timings-summary (push) Has been cancelled
Native App Locale Refresh / Refresh native fa (push) Has been cancelled
Native App Locale Refresh / Refresh native fr (push) Has been cancelled
Native App Locale Refresh / Refresh native hi (push) Has been cancelled
Native App Locale Refresh / Refresh native id (push) Has been cancelled
Native App Locale Refresh / Refresh native it (push) Has been cancelled
Native App Locale Refresh / Refresh native ja-JP (push) Has been cancelled
Control UI Locale Refresh / plan (push) Has been cancelled
Control UI Locale Refresh / Refresh ${{ matrix.locale }} (push) Has been cancelled
Control UI Locale Refresh / Commit control UI locale refresh (push) Has been cancelled
Live Media Runner Image / Build live media runner image (push) Has been cancelled
Native App Locale Refresh / Refresh native ar (push) Has been cancelled
Native App Locale Refresh / Refresh native de (push) Has been cancelled
Native App Locale Refresh / Refresh native es (push) Has been cancelled
Native App Locale Refresh / Refresh native ko (push) Has been cancelled
Native App Locale Refresh / Refresh native nl (push) Has been cancelled
Native App Locale Refresh / Refresh native pl (push) Has been cancelled
Native App Locale Refresh / Refresh native pt-BR (push) Has been cancelled
Native App Locale Refresh / Refresh native ru (push) Has been cancelled
Native App Locale Refresh / Refresh native sv (push) Has been cancelled
Native App Locale Refresh / Refresh native th (push) Has been cancelled
Native App Locale Refresh / Refresh native tr (push) Has been cancelled
Native App Locale Refresh / Refresh native uk (push) Has been cancelled
Native App Locale Refresh / Refresh native vi (push) Has been cancelled
Native App Locale Refresh / Refresh native zh-CN (push) Has been cancelled
Native App Locale Refresh / Refresh native zh-TW (push) Has been cancelled
Native App Locale Refresh / Commit native locale refresh (push) Has been cancelled
Plugin Init Scaffold Validation / Validate provider scaffold (push) Has been cancelled
Plugin NPM Release / preview_plugins_npm (push) Has been cancelled
Plugin NPM Release / Validate release publish approval (push) Has been cancelled
Plugin NPM Release / preview_plugin_pack (push) Has been cancelled
Plugin NPM Release / publish_plugins_npm (push) Has been cancelled
Sandbox Common Smoke / sandbox-common-smoke (push) Has been cancelled
Website Installer Sync / static (push) Has been cancelled
Website Installer Sync / linux-docker (push) Has been cancelled
Website Installer Sync / macos-installer (push) Has been cancelled
Website Installer Sync / windows-installer (push) Has been cancelled
Website Installer Sync / sync-website (push) Has been cancelled
Adolf is a fork/vendored clone of github.com/openclaw/openclaw (v2026.6.11), free to diverge. Tree copied sans upstream .git; upstream remote added for future syncs. Node pinned to 24 (.nvmrc); engines already require >=22.19. Preserves docs/ARCHITECTURE.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LeqyaxJF2nbRXJtae2kNB2
137 lines
5.9 KiB
Markdown
137 lines
5.9 KiB
Markdown
# Security tooling
|
|
|
|
This directory holds OpenClaw's shipped OpenGrep security rulepack and the
|
|
supporting tooling that validates and runs it. Maintainer-only advisory triage
|
|
and detector-generation prompts live outside the public repo; this repo keeps the
|
|
durable artifacts needed to block regressions in PRs and support local rule
|
|
validation.
|
|
|
|
## Layout
|
|
|
|
```text
|
|
security/
|
|
├── README.md <- this file
|
|
└── opengrep/
|
|
├── README.md <- precise rulepack details + compile recipe
|
|
└── precise.yml <- compiled super-config: precise rules
|
|
```
|
|
|
|
The related scripts are:
|
|
|
|
- `security/opengrep/compile-rules.mjs` — gathers source OpenGrep rule YAMLs from
|
|
a folder and appends new compiled rule IDs to `security/opengrep/precise.yml`.
|
|
- `security/opengrep/check-rule-metadata.mjs` — enforces that every committed
|
|
rule carries durable source/provenance metadata.
|
|
- `scripts/run-opengrep.sh` — runs the compiled precise rulepack locally or in
|
|
CI with consistent paths and exclusions.
|
|
|
|
## Rule lifecycle
|
|
|
|
Maintainers investigate advisories and generate candidate rules outside the public repo.
|
|
Once a candidate rule has been validated and reviewed, put the shippable source
|
|
rule YAML in any local folder and compile it into this repo:
|
|
|
|
```bash
|
|
node security/opengrep/compile-rules.mjs \
|
|
--rules-dir <folder-with-source-rule-yaml>
|
|
```
|
|
|
|
Commit the resulting `security/opengrep/precise.yml` diff. Durable rule
|
|
provenance lives in each compiled rule's metadata and is checked by
|
|
`pnpm check:opengrep-rule-metadata`.
|
|
|
|
Rule quality contract: precise rules must catch the vulnerable behavior they were
|
|
written for, should be silent on corresponding fixed behavior when a fix exists,
|
|
and should keep current findings limited to verified regressions or variants.
|
|
|
|
## Writing precise OpenGrep rules
|
|
|
|
A rule is appropriate for `security/opengrep/precise.yml` only when the dangerous
|
|
shape is stable enough to block PRs. Prefer, in order:
|
|
|
|
1. **Variant detector** — source-to-sink or missing-guard detection across the
|
|
same bug family.
|
|
2. **Scoped behavioral regression** — a narrow subsystem-specific rule anchored
|
|
on the affected API or trust boundary.
|
|
3. **Exact regression canary** — a labelled canary for the original vulnerable
|
|
shape when broader variants would be noisy.
|
|
4. **No OpenGrep rule** — if runtime state, product policy, or external data is
|
|
required to distinguish vulnerable and safe behavior.
|
|
|
|
Before compiling a rule, validate it against vulnerable/fixed/current code when
|
|
those surfaces exist. Every current finding must be classified as a true original
|
|
issue or true variant, or the rule must be tightened/dropped before it ships.
|
|
|
|
## Running the rules locally
|
|
|
|
The wrapper script handles paths, exclusions, and output formatting so local
|
|
scans match CI exactly.
|
|
|
|
```bash
|
|
scripts/run-opengrep.sh # precise rules, human output
|
|
scripts/run-opengrep.sh --json # write .opengrep-out/precise.json
|
|
scripts/run-opengrep.sh --sarif # write .opengrep-out/precise.sarif
|
|
scripts/run-opengrep.sh --changed # scan changed first-party paths
|
|
scripts/run-opengrep.sh -- src/agents/ # scan a single dir
|
|
```
|
|
|
|
If you'd rather invoke `opengrep` directly, the equivalent is:
|
|
|
|
```bash
|
|
opengrep scan --no-strict --no-git-ignore \
|
|
--config security/opengrep/precise.yml \
|
|
src/ extensions/ apps/ packages/ scripts/
|
|
```
|
|
|
|
Both forms read `.semgrepignore` at the repo root automatically — that's the
|
|
single source of truth for which paths are skipped (test files, fixtures, mocks,
|
|
QA-tooling extensions, test-orchestration scripts, …). Add a glob there if a new
|
|
test naming convention shows up.
|
|
|
|
## Running the rules in CI
|
|
|
|
There are two OpenGrep workflows:
|
|
|
|
- **OpenGrep — PR Diff** (`.github/workflows/opengrep-precise.yml`) runs on pull
|
|
requests and executes `scripts/run-opengrep.sh --changed --sarif --error` so
|
|
findings stay scoped to changed first-party paths.
|
|
- **OpenGrep — Full** (`.github/workflows/opengrep-precise-full.yml`) is manual
|
|
dispatch only and executes `scripts/run-opengrep.sh --sarif --error` across
|
|
the full first-party source set for maintainers who want a repository-wide
|
|
audit.
|
|
|
|
Both workflows:
|
|
|
|
- Inherit the same `.semgrepignore` exclusions used by the local wrapper
|
|
- Upload SARIF to GitHub Code Scanning under stable OpenGrep categories
|
|
- Fail on precise findings so the rulepack acts as a regression firewall
|
|
- Enforce committed rule provenance with `pnpm check:opengrep-rule-metadata`
|
|
|
|
## Editing, silencing, or removing rules
|
|
|
|
`precise.yml` is the checked-in compiled rulepack. Prefer editing source rule
|
|
YAML and recompiling instead of hand-editing compiled rules, because the compiler
|
|
normalizes rule IDs, metadata, duplicates, and OpenGrep validation. The compiler
|
|
appends new rule IDs by default; use `--replace-precise` only when intentionally
|
|
rebuilding the rulepack from a complete source folder.
|
|
|
|
To drop a noisy rule:
|
|
|
|
1. Delete the offending source rule from the local source-rule folder.
|
|
2. Re-run `node security/opengrep/compile-rules.mjs --rules-dir <folder-with-source-rule-yaml>`.
|
|
3. Commit the resulting `security/opengrep/precise.yml` diff.
|
|
|
|
To narrow a rule's path scope, edit the source rule's `paths.include` /
|
|
`paths.exclude` fields in the same local artifact location and recompile.
|
|
|
|
## Tracing a finding back to its source
|
|
|
|
Every compiled rule's `id` is `<source-id>.<original-id>`. For GHSA-backed rules,
|
|
`<source-id>` is the lower-case GHSA ID. For other source-backed rules, use a
|
|
stable source identifier without dots such as a CVE, OSV ID, internal advisory ID, or other
|
|
review identifier. Rule `metadata` must include `advisory-url`,
|
|
`detector-bucket`, and `source-rule-id`, plus either `ghsa` or `advisory-id`.
|
|
New compilations also add `source-file` when available.
|
|
`pnpm check:opengrep-rule-metadata` enforces these durable source fields so each
|
|
committed rule is traceable without a separate committed manifest.
|