cna-match
Determine which CVE Numbering Authority (if any) covers this repository, so disclosures can be routed to the CNA's security contact rather than only the…
Skill by lukehinds
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/lukehinds-cna-match
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: security
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/cna-match
What's inside
- Skill name
cna-match- Description
- Determine which CVE Numbering Authority (if any) covers this repository, so disclosures can be routed to the CNA's security contact rather than only the maintainer. Reads scrutineer's cached CNA list and matches the repo's owner, project name, and published packages against each CNA's published scope.
- License
- MIT
- Metadata
- scrutineer.version: 1 · scrutineer.output_file: report.json · scrutineer.output_kind: maintainers
- Instructions
- 60 lines in SKILL.md · view on GitHub
Files (4)
- SKILL.md
- SKILL.md.bundle
- schema.json
- schema.json.bundle
SKILL.md (first lines)
# cna-match
Decide whether a CVE Numbering Authority covers this repository. When one does, the disclosure should go to that CNA's security contact (and usually the maintainer in CC), because the CNA is who issues the CVE ID and coordinates the advisory.
## Workspace
- `./src` — the cloned repository. Useful mainly for `SECURITY.md`, which sometimes names the CNA directly.
- `./context.json` — read `repository.url` and `repository.full_name`, plus the `scrutineer` block with `api_base`, `token`, `repository_id`. The owner is the part of `full_name` before the `/`.
- `./report.json` — write your result here.
- `./schema.json` — the JSON schema your report must validate against.
## Data
Call these with `Authorization: Bearer {token}`:
- `GET {api_base}/repositories/{repository_id}` — owner, full name, html_url.
- `GET {api_base}/repositories/{repository_id}/packages` — published package names and ecosystems. A CNA scope often names the package, not the repo.
- `GET {api_base}/cnas` — the full CNA list (short_name, organization, scope, email, contact_url, policy_url, root, types). Pass `?q={term}` to narrow by substring across short_name/organization/scope; useful for checking the obvious candidate first (e.g. `?q=apache` when the owner is `apache`).
Also read `./src/SECURITY.md` and `./src/.github/SECURITY.md` if present. Projects under a CNA usually say so there ("Report to security@apache.org", "We are our own CNA", "Report via GitHub Security Advisories").
## Matching
CNA scopes are free-text prose, not patterns. Match in this order and stop at the first hit:
1. **SECURITY.md names a CNA or its contact directly.** If the file says report to a specific security@ address or names a CNA programme, find that entry in `/cnas` and use it.
2. **Owner matches a CNA's organization or scope.** Repo owner `apache` → CNA `apache` ("All Apache Software Foundation projects"). Owner `kubernetes` or `kubernetes-sigs` → CNA `kubernetes`. Owner `nodejs` → CNA `nodejs`. Check `?q={owner}` first.
3. **Package or project name matches a single-project CNA scope.** Package `curl` or `libcurl` → CNA `curl`. Package `openssl` → CNA `openssl`. These CNAs have narrow scopes naming the project explicitly.
A scope like "Vendor X products only" or "issues discovered by our researchers" does not cover an unrelated open-source repo even if a keyword overlaps. Read the scope sentence, not just the keyword.
If steps 1-3 find nothing, that is a valid result: most projects have no dedicated CNA and disclosure goes to the maintainer. For a repo hosted on github.com you may still record GitHub (`GitHub_M`) as the fallback CNA in the `cna` block with `match_rule: "github_fallback"`, since GitHub can issue a CVE via the advisory form, but do not set `disclosure_channel` from it. The maintainer contact (set by the `maintainers` skill) is the right first stop; the analyst can escalate to GitHub for a CVE ID later.
## Output
Write `./report.json` matching `./schema.json`. The `output_kind` is `maintainers` so scrutineer's existing parser updates `Repository.DisclosureChannel` from the `disclosure_channel` field; `maintainers` stays an empty array. The `cna` block records which CNA matched and why so an analyst can review the reasoning in the scan report.
When a CNA matched via steps 1-3, set `disclosure_channel` to its email if it has one, otherwise its `contact_url`. Append the organization name in parentheses so the repo page shows where the address came from, e.g. `security@apache.org (Apache Software Foundation CNA)`.
When nothing matched, or only the github.com fallback applied, leave `disclosure_channel` as `""`. The parser ignores empty values so any contact the `maintainers` skill set is left alone regardless of which skill ran first.
```json
{
"maintainers": [],
"disclosure_channel": "security@apache.org (Apache Software Foundation CNA)",
"cna": {
"short_name": "apache",
"organization": "Apache Software Foundation",
"email": "security@apache.org",
"contact_url": "https://www.apache.org/security/",
"policy_url": "https://www.apache.org/security/",
"scope": "All Apache Software Foundation projects",
"match_rule": "owner",
"match_reason": "repo owner 'apache' matches ASF CNA scope"
}
}
```From lukehinds/scrutineer-attest-test, MIT.
More from lukehinds/scrutineer-attest-test
- 0.479score
sbom
lukehinds
Generate a CycloneDX Software Bill of Materials for the repository.
SkillCFreshness: CClaude Code +9 - 0.476score
zizmor
lukehinds
Audit the repository's GitHub Actions workflows for common security issues (credential mishandling, untrusted inputs, template injection, overly permissive…
SkillCFreshness: CClaude Code +9 - 0.476score
dependencies
lukehinds
Index every dependency declared in the repository's manifest and lockfile files (package.json, Gemfile, go.mod, requirements.txt, etc.) and record each one…
SkillCFreshness: CClaude Code +9 - 0.476score
semgrep
lukehinds
Run semgrep static analysis with the security-audit and secrets rulesets, then map each hit into scrutineer's findings shape so it surfaces alongside…
SkillCFreshness: CClaude Code +9 - 0.474score
maintainers
lukehinds
Identify the real maintainers of a repository and the best way to contact them about a security issue.
SkillCFreshness: CClaude Code +9 - 0.474score
disclose
lukehinds
Draft the disclosure content for a finding in GitHub Security Advisory shape.
SkillCFreshness: CClaude Code +9 - 0.474score
reachability
lukehinds
Check whether known sinks in this application's dependencies are reachable from its own trust boundaries.
SkillCFreshness: CClaude Code +9 - 0.474score
posture
lukehinds
Assess a repository's security posture and its readiness to receive a vulnerability report.
SkillCFreshness: CClaude Code +9 - 0.474score
repo-overview
lukehinds
Produce a structured plain-language overview of what a repository does, who maintains it, its activity level, and the shape of its codebase.
SkillCFreshness: CClaude Code +9 - 0.474score
security-deep-dive
lukehinds
Audit first-party source for security vulnerabilities using an inventory-first, six-step per-sink methodology.
SkillCFreshness: CClaude Code +9 - 0.474score
fork
lukehinds
Fork the scanned repository into the configured GitHub organisation, enable private vulnerability reporting on the fork, record the scan as a git note, and…
SkillCFreshness: CClaude Code +9 - 0.471score
patch
lukehinds
Propose a code patch for a finding.
SkillCFreshness: CClaude Code +9
Signals
- Stars
- 0
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- Jun 11, 2026 (4 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from lukehinds
- 0.479score
sbom
lukehinds
Generate a CycloneDX Software Bill of Materials for the repository.
SkillCFreshness: CClaude Code +9 - 0.476score
zizmor
lukehinds
Audit the repository's GitHub Actions workflows for common security issues (credential mishandling, untrusted inputs, template injection, overly permissive…
SkillCFreshness: CClaude Code +9 - 0.476score
semgrep
lukehinds
Run semgrep static analysis with the security-audit and secrets rulesets, then map each hit into scrutineer's findings shape so it surfaces alongside…
SkillCFreshness: CClaude Code +9 - 0.476score
dependencies
lukehinds
Index every dependency declared in the repository's manifest and lockfile files (package.json, Gemfile, go.mod, requirements.txt, etc.) and record each one…
SkillCFreshness: CClaude Code +9 - 0.474score
fork
lukehinds
Fork the scanned repository into the configured GitHub organisation, enable private vulnerability reporting on the fork, record the scan as a git note, and…
SkillCFreshness: CClaude Code +9 - 0.474score
maintainers
lukehinds
Identify the real maintainers of a repository and the best way to contact them about a security issue.
SkillCFreshness: CClaude Code +9
Cite this page
cna-match skill. Agent Mart. https://agentmart.dev/skills/lukehinds-cna-match (last updated 2026-10-24)