verify-skill-supply-chain
Vets and continuously verifies the integrity and provenance of agent skills installed with qvr. Use when a user cares about skill security, trust, signing, tampering, or supply-chain integrity — e.g. "scan this skill for problems", "is this skill safe", "verify the skill hasn't drifted", "who is allowed to author this registry's skills", "check the signature", or "gate CI on skill integrity". Covers qvr scan, lock verify (--fail-on, --repair), trust pin/verify, and provenance.
- License 许可
- MIT
- 所属仓库
- try-agora/qvr
- 最近更新
- 2026-07-01
- Stars
- ★ 26
- Forks
- 0
01 前言 Front Matter
- name
- verify-skill-supply-chain
- metadata
- { "author": "quiver-playground", "version": "1.0.0" }
- description
- Vets and continuously verifies the integrity and provenance of agent skills installed with qvr. Use when a user cares about skill security, trust, signing, tampering, or supply-chain integrity — e.g. "scan this skill for problems", "is this skill safe", "verify the skill hasn't drifted", "who is allowed to author this registry's skills", "check the signature", or "gate CI on skill integrity". Covers qvr scan, lock verify (--fail-on, --repair), trust pin/verify, and provenance.
03 SKILL.md 正文
Verify the skill supply chain with qvr
A skill is code-adjacent: it ships instructions and files an agent will act on. qvr gives four independent checks — a static scan of content, a content hash drift check against the lockfile, an author trust policy per registry, and provenance (source, pinning, signature). This skill combines them into a vetting pass you can run at install time and re-run in CI.
When to use this
- Before trusting a newly added or third-party skill.
- To prove an installed skill hasn't been altered since it was pinned.
- To enforce who is allowed to author skills in a given registry.
- To gate CI on integrity (fail on drift or unverified entries).
The four checks
1. Scan content (static analysis)
qvr scan reads every file as a string — it never executes anything — and reports
categories such as prompt-injection patterns, leaked credentials, hidden/bidi
unicode, and risky permissions. The exit code is controlled by --fail-on
(default error).
qvr scan my-skill # installed name or a path
qvr scan ./skills/my-skill --fail-on critical # only fail on the worst
qvr scan my-skill --severity warning # show warnings and up
qvr scan my-skill --against origin/main # only findings new vs a ref
qvr scan my-skill --format sarif > scan.sarif # machine-readable for CI (scan has no -o; redirect)
Install-time scanning is on by default (security.scan_on_install); qvr add --no-scan opts out for a single install (prefer not to).
2. Verify content integrity (hash drift)
qvr lock verify recomputes each entry's subtree hash from disk and compares it
to the recorded value, reporting ok, drift, unverified (no recorded hash),
missing (worktree gone), link, or failed. It exits non-zero on drift by
default so CI can gate:
qvr lock verify # default: drift/missing/failed are fatal
qvr lock verify --fail-on unverified # also fail when an entry has no recorded hash
qvr lock verify --fail-on none # report only (old behavior, exit 0)
Two repair/maintenance paths:
qvr lock verify --repair # rewrite Verification blocks from current disk
qvr lock upgrade # backfill missing Verification blocks
Only --repair when you trust the current worktree — it re-pins to whatever
is on disk, drift and all.
3. Enforce author trust policy
Pin which commit authors a registry is allowed to ship from, then verify installed skills against that policy:
qvr trust list # trusted authors by registry
qvr trust pin <org>/<repo> "Trusted Author" # allow an author for one registry
qvr trust verify # check installs vs policy
qvr trust verify --all # project + global
qvr trust unpin <org>/<repo> # remove the registry's pins
Use the full <org>/<repo> registry name.
4. Inspect provenance and signatures
qvr provenance my-skill # source, subdir, pinned commit/tree, scan status, signature
qvr provenance my-skill --all # search project + global
provenance is honest about limits: a verified signature means git's
verify-tag / verify-commit was satisfied — it does not by itself mean the
author is trusted (that's what trust is for). An unsigned skill installs unless
security.require_signed is enabled; an invalid signature is refused at install
time.
A vetting pass (recommended order)
qvr scan my-skill --fail-on error— reject obviously hostile content.qvr provenance my-skill— confirm source, pinning, and signature status.qvr trust verify— confirm the author is allowed for that registry.qvr lock verify— confirm nothing has drifted since it was pinned.
In CI, chain the gating forms:
qvr scan --fail-on error ./skills/my-skill && qvr lock verify --fail-on drift
Gotchas
- Scanner reports, never executes. The executable bit is reported, not honoured. A clean scan is necessary, not sufficient — still read what a skill does.
--repaircan launder drift. It re-pins to current disk; use it only after you've confirmed the worktree is the intended content.- Signed ≠ trusted. Pair
provenance(signature valid?) withtrust verify(author allowed?). They answer different questions. --no-scanand--allow-driftare escape hatches, not defaults — keep them out of CI.--fail-on nonehides problems. It restores the old report-only behavior; fine for a dashboard, wrong for a gate.
Troubleshooting
lock verifyreportsunverified— the entry predates Verification blocks. Runqvr lock upgradeto backfill, then re-verify.- Drift you didn't cause — the worktree was edited (maybe an
editeject) or the cache was touched. Inspect withqvr diff <skill>andqvr status; restore withqvr sync(without--allow-drift). trust verifyfails after a fork — the fork registers a new<org>/<repo>; pin the intended author for that registry name.- Signature shows
none— upstream didn't sign the tag/commit. Decide via policy (security.require_signed) rather than ad hoc.
04 同仓库更多 Skills
valid-skill
A valid test skill for unit testing. Use when testing the quiver validation pipeline to ensure correct skills pass all checks.
example-skill
An example skill for testing registry discovery.
malicious-skill-unicode
Fixture for the unicode check. Contains hidden zero-width and bidirectional-override characters that the scanner must flag.
malicious-skill-tool-misuse
Fixture exercising the tool-misuse rule family (TM1a shell=True, TM1b rm -rf root, TM1c --no-verify, TM1d chmod 777, TM3 verify=False) and SC2 curl pipe shell. Used by the scanner integration test as the canonical "tool misuse" sample.
malicious-skill-supply-chain
Fixture for the supply-chain check. Ships a requirements.txt pinning a known-vulnerable pyyaml (CVE-2020-14343), an unpinned requirement, an abandoned package, and a typosquatted name. Drives SC1/SC4/SC5/SC6 simultaneously.
malicious-skill-signatures
Fixture for the YARA-lite signature engine. Carries a small bash reverse-shell script (YR1_bash_reverse_shell) and a minimal PHP eval webshell (YR2_php_eval_shell) so the integration test can assert both critical signature matches in a single scan.