agentleFS
OrionicsLtdOrionicsLtd/claude-skills/skills/security-advisories/SKILL.md

security-advisories

Skill1 starsChanged 23 days agoMITView on GitHub

Check a repository, its runtimes and this machine for known vulnerabilities, triage "hot" security news (a CVE, a vendor security release, a compromised package, a list of products in the news) against what is actually used, and fix them with the smallest upgrade that contains the fix. Use whenever the user asks about vulnerabilities, CVEs, advisories, security releases, dependency audits, compromised or malicious packages, or whether something in the news affects them — and before any dependency change made for security reasons.

  • Reads credentials
  • Installs packages

The file

We split this skill into the rules it gives an agent

4 rules. About 0 are common, 2 are distinctive, and 2 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈2

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 2

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Very specific:

    Not covered by the scan, so check by hand when relevant: Foundry/Soldeer libraries (read the version from foundry.lock, soldeer.lock or …

    line 35
  2. Very specific:

    High severity, reachable: Check reachability: find calls to the affected function or uses of the affected feature (git grep).

    line 58
  3. Distinctive:

    Use the lowest version that fixes every advisory against the package (the scan's target, confirmed against the advisory's "patched …

    line 65
  4. Distinctive:

    Stop and tell the user before anything else.

    line 99

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Security advisories

Your knowledge stops at your training cutoff; advisories from last week are not in it. Every claim about a vulnerability — that it exists, what it affects, what fixes it — comes from a live source fetched now. Your job is matching, judging reachability and making the fix. All sources here are free; never use a paid one.

1. Scan

python3 -I ~/.claude/skills/security-advisories/scripts/run_advisories.py scan <repo>
python3 -I ~/.claude/skills/security-advisories/scripts/run_advisories.py hot --days 30

scan runs osv-scanner over every lockfile git does not ignore (PyPI, npm, pnpm, yarn, Go, Cargo and more, including OpenSSF malicious-package records), marks advisories CISA lists as exploited in the wild, adds EPSS exploitation probabilities, and checks Node, Python and Go — installed here or pinned in .nvmrc, .python-version and Dockerfiles — against their release lines. hot lists what CISA added to its exploited catalog recently. If osv-scanner is missing, ask the user to brew install osv-scanner.

Not covered by the scan, so check by hand when relevant: Foundry/Soldeer libraries (read the version from foundry.lock, soldeer.lock or lib/<name>/package.json and query OSV for the matching npm package, e.g. @openzeppelin/contracts), vendored code, CI images and pinned CI actions.

2. Triage news the user brings

For each item (a pasted list, a vendor page, a CVE id):

  1. Find out what it is from a primary source — the vendor advisory, GHSA, NVD or OSV entry. Some sites can't be fetched (x.com, for one); ask the user to paste the text instead of guessing.
  2. Match it against what is used, in three places:
    • the repo: git grep -il <name> -- '*lock*' pyproject.toml package.json go.mod Cargo.toml
    • this machine: command -v <tool>, brew list --versions <tool>, the version manager in use
    • services: CI config, deploy config and docs naming the service (GitLab, a host, an API)
  3. Classify each as affects the repo, affects this machine, affects a service the user runs or uses, or not relevant — with the evidence for the match.

3. Prioritise

  1. Malicious package installed — an incident, not an upgrade (section 5).
  2. Exploited in the wild (CISA catalog) and the vulnerable code is reachable.
  3. High severity, reachable. Check reachability: find calls to the affected function or uses of the affected feature (git grep); for Go, govulncheck checks the call graph. Unreachable is still worth fixing, just later.
  4. Everything else, batched.

4. Fix

Use the lowest version that fixes every advisory against the package (the scan's target, confirmed against the advisory's "patched versions"). Read the changelog between the installed and target versions for breaking changes before upgrading.

EcosystemUpgrade one package
uvuv lock --upgrade-package <name>; a direct dependency's floor goes in pyproject.toml; a transitive one blocked by a parent's cap goes in [tool.uv] constraint-dependencies
poetrypoetry update <name>, or raise the constraint with poetry add <name>@^<target>
npm / yarnnpm install <name>@<target> if direct; overrides (npm) or resolutions (yarn) if transitive
pnpmpnpm update <name>; transitive via pnpm overrides (check where your pnpm version reads them)
Gogo get <module>@v<target> && go mod tidy
Cargocargo update -p <name> --precise <target>
Dockerbump the base tag to the fixed patch (or pin a digest)
This machinetell the user the command for their version manager; don't change it unasked

Then: run the tests, run scan again and confirm the advisory is gone, and check the lockfile diff touches only the intended packages. Follow dependency-safety for everything else — a security fix is a reason to change a dependency, not licence to change others.

No fix released yet: mitigate (disable the feature, change config, block the input) and record the decision where the scanner reads it, with a reason and an expiry, so it resurfaces:

# osv-scanner.toml, next to the lockfile
[[IgnoredVulns]]
id = "GHSA-xxxx-xxxx-xxxx"
ignoreUntil = 2026-12-01
reason = "No fix released; feature X disabled in config/app.toml"

5. Malicious or compromised package

Stop and tell the user before anything else. Upgrading is not enough:

  • Find when the bad version entered (git log -p -- <lockfile>, git log -S'<name>') and every machine and CI run that installed it since.
  • Assume every secret that environment could read is exposed — .env files, package registry tokens, cloud and CI credentials, SSH and wallet keys — and list them for rotation.
  • Pin to a known-good version, clear package caches (npm cache clean --force, uv cache clean <name>), reinstall from the cleaned lockfile.

Report

Lead with what needs action now. One table per scope (repo, this machine, services): package or product, installed → fixed version, exploited or not, reachable or not, and the action taken or recommended. End with what was not checked — unscanned ecosystems, unreachable feeds, items you could not identify.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.