Container Security
hardw00t/ai-security-arsenal
Container and Kubernetes security assessment — image vulnerability scanning, SBOM diff analysis, K8s cluster auditing, RBAC privilege mapping, NetworkPolicy review, container escape testing, and…
A skill your agent uses when adding, updating, or removing CVE/GHSA suppressions in .openvex.json — the OpenVEX document consumed by the weekly image vulnerability scan workflow.
$ npx skills add NVIDIA/aicr --skill aicr-managing-openvex -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install NVIDIA/aicr aicr-managing-openvex --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/NVIDIA/aicr.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/aicr-managing-openvex .claude/skills/aicr-managing-openvex && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "aicr-managing-openvex" agent skill from https://github.com/NVIDIA/aicr/tree/main/.agents/skills/aicr-managing-openvex into .claude/skills/aicr-managing-openvex/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aicr-managing-openvex", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/NVIDIA/aicr/tree/main/.agents/skills/aicr-managing-openvexType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add NVIDIA/aicr --skill aicr-managing-openvex -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install NVIDIA/aicr aicr-managing-openvex --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/NVIDIA/aicr.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/aicr-managing-openvex .agents/skills/aicr-managing-openvex && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "aicr-managing-openvex" agent skill from https://github.com/NVIDIA/aicr/tree/main/.agents/skills/aicr-managing-openvex into .agents/skills/aicr-managing-openvex/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aicr-managing-openvex", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add NVIDIA/aicr --skill aicr-managing-openvex -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install NVIDIA/aicr aicr-managing-openvex --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/NVIDIA/aicr.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/aicr-managing-openvex .cursor/skills/aicr-managing-openvex && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "aicr-managing-openvex" agent skill from https://github.com/NVIDIA/aicr/tree/main/.agents/skills/aicr-managing-openvex into .cursor/skills/aicr-managing-openvex/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aicr-managing-openvex", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/NVIDIA/aicr.git --path .agents/skills/aicr-managing-openvex--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add NVIDIA/aicr --skill aicr-managing-openvex -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install NVIDIA/aicr aicr-managing-openvex --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/NVIDIA/aicr.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/aicr-managing-openvex .gemini/skills/aicr-managing-openvex && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "aicr-managing-openvex" agent skill from https://github.com/NVIDIA/aicr/tree/main/.agents/skills/aicr-managing-openvex into .gemini/skills/aicr-managing-openvex/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aicr-managing-openvex", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install NVIDIA/aicr aicr-managing-openvexInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add NVIDIA/aicr --skill aicr-managing-openvex -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/NVIDIA/aicr.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/aicr-managing-openvex .github/skills/aicr-managing-openvex && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "aicr-managing-openvex" agent skill from https://github.com/NVIDIA/aicr/tree/main/.agents/skills/aicr-managing-openvex into .github/skills/aicr-managing-openvex/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aicr-managing-openvex", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add NVIDIA/aicr --skill aicr-managing-openvex -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install NVIDIA/aicr aicr-managing-openvex --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/NVIDIA/aicr.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/aicr-managing-openvex .opencode/skills/aicr-managing-openvex && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "aicr-managing-openvex" agent skill from https://github.com/NVIDIA/aicr/tree/main/.agents/skills/aicr-managing-openvex into .opencode/skills/aicr-managing-openvex/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "aicr-managing-openvex", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
aicr-managing-openvexA skill your agent uses when adding, updating, or removing CVE/GHSA suppressions in .openvex.json — the OpenVEX document consumed by the weekly image vulnerability scan workflow.
Aicr Managing Openvex is an agent skill from NVIDIA/aicr, published by the product's own GitHub organization. Use when adding, updating, or removing CVE/GHSA suppressions in .openvex.json — the OpenVEX document consumed by the weekly image vulnerability scan workflow. Triggers on "VEX", "OpenVEX", ".openvex.json", "suppress CVE", "ignore CVE", "vulnerability suppression", "aiperf-bench CVE", or any request to act on findings reported by Weekly Image Vulnerability Scan for the aiperf-bench image. Keeps the file current: adds reachability-evidenced statements for new HIGH+ findings, drops statements that no longer apply…
Its SKILL.md is about 5.9k tokens, which your agent loads only when the skill is triggered. The skill folder holds 1 other file (for example `vex-state.yaml`).
It sits in Security, covering Vulnerability scanning and Container orchestration. The repository describes itself as: Tooling for optimized, validated, and reproducible GPU-accelerated AI runtime in Kubernetes. The licence is Apache-2.0.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit e8f18da. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
jqghdockermakeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use gh and docker, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Aicr Managing Openvex loads about 5.9k tokens when it runs. Until then it costs about 225 tokens; SKILL.md has 2,725 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from NVIDIA/aicr at commit e8f18da, republished under its Apache-2.0 licence (© NVIDIA). 2,725 words, ~5,867 tokens.
.claude/skills/aicr-managing-openvex/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub..openvex.json.openvex.json carries per-CVE reachability evidence used to suppress
vulnerability findings in the aiperf-bench container image. The file is
consumed by the Weekly Image Vulnerability Scan workflow
(.github/workflows/vuln-scan-images.yaml) via the vex: input on
anchore/scan-action@v7.4.0, which passes it to grype as --vex .openvex.json.
It is also the source for the OpenVEX attestation each release publishes on
every platform manifest. .github/actions/sbom-and-attest validates this file,
then runs tools/openvex-bind to rewrite each statement's bare
pkg:oci/<image> products to pkg:oci/<image>@sha256:<platform-digest> and
signs that projection. Edit this file only: the published document is
generated, never committed. Three consequences for edits here: a statement whose
product PURL does not name a released image is silently dropped from every
projection; statuses, justifications and impact statements are published
verbatim to a public registry, signed, on every released image; and
document-level tooling is not published at all, because the projection
replaces it with an identifier of the generator (invariant 5).
This skill exists because the file has non-obvious invariants — most notably the product-PURL matching rule — and getting them wrong silently no-ops every statement in the document.
Weekly Image Vulnerability Scan run reports HIGH+ CVE(s) on the
aiperf-bench image and a maintainer needs to add a suppression after
verifying reachability.validators/performance/requirements.txt
and AIPERF_VERSION in validators/performance/aiperf-bench.Dockerfile)
or its dependency pins, fixing a CVE that was previously suppressed → the entry must be
removed.These are the rules that, when violated, cause silent suppression failures. Verify each one before claiming a statement is correctly applied.
products[].purl must equal the grype image PURLGrype derives the OCI image PURL from the registry repository
basename, not from org.opencontainers.image.title. For the aiperf-bench
image:
ghcr.io/nvidia/aicr-validators/aiperf-bench:<tag> →
grype PURL pkg:oci/aiperf-bench.aicr-aiperf-bench:test (matching the title
label) → grype PURL pkg:oci/aicr-aiperf-bench.Every statement in this repo therefore carries both product entries:
"products": [
{ "@id": "pkg:oci/aicr-aiperf-bench", "identifiers": { "purl": "pkg:oci/aicr-aiperf-bench" } },
{ "@id": "pkg:oci/aiperf-bench", "identifiers": { "purl": "pkg:oci/aiperf-bench" } }
]If you add a statement, include both. If you rename the image or add a
new image to the VEX scope, derive the new PURL by repeating the local
reproduction below and checking .source.target.userInput against the
generated PURL — do not guess from labels.
vulnerability.name must equal grype's primary IDGrype emits a single primary ID per match (the .vulnerability.id field
of .matches[]). For ecosystem advisories with both a GHSA and a CVE,
the primary ID is usually the GHSA; the CVE shows up only as a
relatedVulnerabilities[].id alias. OpenVEX matching is by exact name —
a CVE in the VEX file will not match a GHSA primary ID even though they
describe the same advisory.
Use the ID that appears in the HIGH+: line of the scan artifact /
Slack notification (which prints <pkg> <primary-id> (<aliases>)), or
extract it directly from the JSON:
jq -r '.matches[] | select(.vulnerability.severity == "High" or .vulnerability.severity == "Critical")
| "\(.artifact.name) \(.vulnerability.id) (\(.relatedVulnerabilities|map(.id)|join(",")))"' \
<(grype <image> --only-fixed -c .grype.yaml --vex .openvex.json -o json)Allowed values for not_affected status:
component_not_present — package isn't in the image at all.vulnerable_code_not_present — package is in the image but the
specific vulnerable symbol/file/build is absent (e.g., conditionally
compiled out, removed in the shipped version).vulnerable_code_not_in_execute_path — code exists but the workload
never invokes it.vulnerable_code_cannot_be_controlled_by_adversary — code is
reachable but inputs are not attacker-influenced.inline_mitigations_already_exist — runtime hardening (seccomp,
caps drop, etc.) blocks the trigger.vulnerable_code_not_in_execute_path is the most common choice for
this image; vulnerable_code_not_present is used when the symbol is
conditionally compiled out (e.g., Windows-only APIs in a Linux glibc).
impact_statement must cite concrete evidenceEvery statement requires a substantive impact_statement — not a
hand-wave. Reviewers and downstream consumers (auditors, customers
reading SBOMs) read this. Cite at least one of:
grep -rn -E '^(import|from) (gzip|lzma|bz2)').aiperf/plot/dashboard/server.py is only
reached via the aiperf plot subcommand).See existing statements for the expected density; CI does not enforce this but reviewers will.
OpenVEX v0.2.0 defines exactly nine document-level fields: @context,
@id, author, role, timestamp, last_updated, version,
tooling and statements. Each is short, structured metadata -- an IRI,
an author or role string, an RFC 3339 timestamp, an integer, a generator
identifier -- and statements is the only one that carries substance.
None of them is a free-form prose field, and there is no notes or
changelog field.
So anything not scoped to a single CVE has no home in the document at
all: what a revision changed and how it was verified goes in that
revision's PR description, and work that is not finished yet goes in
vex-state.yaml (see Carried state below).
tooling is where this went wrong. Each revision appended its own
rationale to it because it was the only free-form string available, and
it reached 8,010 bytes. Since v0.21.0 every release signs it onto all
seven images, six of which project to zero statements, so the field was
publishing one image's dependency triage as a claim about the others
(NVIDIA/aicr#2706). Two mechanisms now stop a repeat, and both are
load-bearing rather than advisory:
tools/openvex-bind replaces tooling with a fixed identifier of
itself in every projection, so a committed value cannot be published..github/actions/sbom-and-attest/openvex-guard.sh rejects any
document-level string over 256 bytes, in both source and projection
mode. A tooling that regrows fails the release, and
TestReleaseOpenVEXValidation in tests/releasepolicy fails the PR
first.Per-statement version and last_updated are deliberately unused too.
version numbers a statement's own revisions, not the document revision
it was introduced at, so either reading is a field no consumer reads and
the next editor has to remember. last_updated would always equal the
document timestamp, because the stale audit below re-verifies every
statement on every edit.
| Kind of rationale | Destination |
|---|---|
| Why this CVE cannot be exploited, and the evidence for it | that statement's impact_statement (with vulnerability.description for the advisory summary) |
| What this revision changed, why, what it retired, and how it was verified | the PR description |
| A check that can only run later, a negative result nobody should repeat, a decision not to act | vex-state.yaml beside this skill |
| Anything else | nowhere: if it is worth keeping it is one of the three above |
The PR description is the record of a revision, not a copy of one: it is reviewable, linkable, carries the scan-run references, and needs no maintenance afterwards. Do not restate it in the document, and do not open a changelog file for it.
vex-state.yaml is the opposite thing, and the distinction is what keeps
both small. It holds unfinished work, not history, and every entry
states what would invalidate it so it can be deleted when that happens.
The next section is its contract.
vex-state.yaml)Some of this work does not finish inside one session. A statement's real
confirmation is a CI run that has not happened yet; a bump you checked and
found unavailable will be worth re-checking only when upstream moves; a
decision not to suppress something is invisible to whoever reads the
document next. None of that fits in a VEX statement, and writing it into
the document is what grew tooling to 8,010 bytes.
.agents/skills/aicr-managing-openvex/vex-state.yaml carries it instead.
Read it first, update it last, on every invocation:
deferred_verifications. For each,
run the check it names. If it passes, delete the entry and say so in
the PR description. If it fails, that failure is the finding you are
now triaging, ahead of whatever brought you here.known_negatives. If the
bump you are about to evaluate is already recorded as unavailable and
nothing named in invalidated_by has happened, do not re-derive it.deliberate_exclusions. A finding that is deliberately unsuppressed
must stay unsuppressed until its invalidated_by condition fires.The lifecycle is the whole point. Entries are deleted when they resolve, not rewritten as history: a file that only ever grows is the failure this replaced. Evidence caveats ride on the entry they qualify. A deletion validated against a scan of the new base rather than against rebuilt bytes is a weaker claim than it looks, so it is recorded on the deferred verification that will settle it, and both go when the scan confirms.
The only way to be certain a statement applies is to run the same
grype invocation CI runs and confirm the finding moves from .matches[]
to .ignoredMatches[]. The recipe:
# 1. Build the image locally with the title label the workflow sets
docker buildx build \
--load \
--platform linux/amd64 \
-f validators/performance/aiperf-bench.Dockerfile \
-t aicr-aiperf-bench:test \
--label "org.opencontainers.image.title=aicr-aiperf-bench" \
.
# 2. Install the exact grype version the workflow pins
# (lives in GrypeVersion.js of anchore/scan-action@v7.4.0)
GRYPE_VERSION=v0.110.0 # cross-check with .github/workflows/vuln-scan-images.yaml
gh release download "${GRYPE_VERSION}" --repo anchore/grype \
--pattern "grype_*_darwin_arm64.tar.gz" -O /tmp/grype.tgz
tar -xzf /tmp/grype.tgz -C /tmp grype && mv /tmp/grype /tmp/grype-vex
# 3. Reproduce the CI scan flags exactly
/tmp/grype-vex aicr-aiperf-bench:test \
--fail-on high --only-fixed --vex .openvex.json -c .grype.yaml \
-o json --file /tmp/scan.json
# 4. Inspect what survived (these MUST be empty for a passing scan)
jq '[.matches[] | select(.vulnerability.severity == "High" or .vulnerability.severity == "Critical")
| {id: .vulnerability.id, pkg: .artifact.name}]' /tmp/scan.json
# 5. Confirm the suppression landed. NOTE: ignoredMatches entries carry
# `vulnerability` at the top level (NOT under `.match`) in grype 0.110.
jq '[.ignoredMatches[]? | select(.vulnerability.severity == "High" or .vulnerability.severity == "Critical")
| {id: .vulnerability.id, rules: .appliedIgnoreRules}]' /tmp/scan.jsonA new statement is correct only when step 4 returns [] for the
vulnerability it targets and step 5 lists it under appliedIgnoreRules
with namespace = "vex".
The scan workflow builds and pushes every image with tag
scan-<full-head-sha> before scanning. Those tags stay on GHCR, so you
can scan the exact bytes CI scanned — all seven matrix images, not
just aiperf-bench — without a local docker build:
SHA=$(gh run list -R NVIDIA/aicr --workflow vuln-scan-images.yaml \
--limit 1 --json headSha --jq '.[0].headSha')
/tmp/grype-vex "ghcr.io/nvidia/aicr-validators/aiperf-bench:scan-${SHA}" \
--only-fixed --vex .openvex.json -c .grype.yaml -o json --file /tmp/scan.jsonUse this for triage and the stale audit (it covers aicr-gate and
aicr, which have no local Dockerfile build path). Use the docker-build
recipe above only when validating a Dockerfile change before it is
pushed. Caveat: a local grype DB newer than this morning's CI run can
surface advisories CI hasn't seen yet — treat those as incoming
findings, not discrepancies.
The weekly scan (Thursdays, 06:00 UTC) emits HIGH+ identifiers in the per-image artifact and Slack notification:
aiperf-bench: 0 critical, 2 high, 6 medium, 0 low, 0 negligible (10 VEX-suppressed)
HIGH+: pillow GHSA-pwv6-vv43-88gr (CVE-2026-42311), pillow GHSA-whj4-6x5x-4v2j (CVE-2026-40192)Before the per-ID work, clear vex-state.yaml: resolve any outstanding
deferred_verifications and re-read the known_negatives and
deliberate_exclusions that bear on this image.
For each ID:
aiperf in
validators/performance/requirements.txt and AIPERF_VERSION in
validators/performance/aiperf-bench.Dockerfile together (the build
fails on a mismatch), run make python-licenses, verify with the local
repro above, and skip the rest of this section.impact_statement:grep -rn patterns).aiperf profile <text-llm> invoked
by validators/performance/inference_perf_constraint.go) reaches
the code path even transitively.python:3.13-slim is
Debian trixie / glibc / Linux only, so Windows-only and
glibc-only-on-certain-locales conditions are inert).[] for the new ID.gh workflow run "Weekly Image Vulnerability Scan" --repo NVIDIA/aicr --ref main, watch with gh run watch <id> --exit-status,
inspect the aiperf-bench scan-result artifact.deferred_verifications entry to vex-state.yaml
naming the check and how to run it, so the next invocation resolves
and deletes it.Statements rot: dependencies get upgraded past fixes, advisories get withdrawn, components leave the image. A stale statement is invisible — it applies to nothing, silently — so the audit runs on every change to the file, not just before releases. (The audit that introduced this rule found 12 dead statements out of 70.)
Scan every image the document has product entries for (currently
aiperf-bench alone; the aicr-gate and aicr statements were retired
at revisions 12 and earlier) using the scan-<sha> shortcut above, then
diff declared statements against applied rules:
# Applied: unique vuln IDs suppressed via the vex namespace
jq -r '[.ignoredMatches[]? | select((.appliedIgnoreRules//[]) | any(.namespace=="vex"))
| .vulnerability.id] | unique[]' /tmp/scan-<image>.json | sort > /tmp/applied.txt
# Declared: statement names scoped to that image's product PURL
jq -r '.statements[] | select([.products[]["@id"]] | any(test("<image>")))
| .vulnerability.name' .openvex.json | sort > /tmp/declared.txt
comm -23 /tmp/declared.txt /tmp/applied.txt # stale candidatesFor each candidate, classify before deleting — three distinct cases:
grep <id> /tmp/scan-<image>.json → 0 hits,
including aliases): the finding no longer exists (package upgraded
past the fix, advisory withdrawn). Delete.fix-state: wont-fix (appears in
.ignoredMatches[] with appliedIgnoreRules[].namespace == ""):
--only-fixed already hides it, so the VEX statement never applies.
Delete — do not keep it "just in case": if the distro ships a
fix, the weekly image rebuild absorbs it automatically, and until it
does the finding must surface rather than be pre-suppressed (a fix
that becomes reachable means bump, not VEX)..matches[] under a different primary ID (a CVE
statement while grype emits the GHSA, or vice versa): NOT stale — a
name mismatch. Fix vulnerability.name per invariant 2.After deleting, re-run the scans for all covered images and confirm the vex-suppressed counts still match the latest CI run for the statements that remain (deleting must be count-neutral).
The workflow counts suppressed rows, not statements: a statement
whose CVE matches two packages counts twice. Revision 14's 18 statements
produced 25 rows (7 openssl CVEs on both libssl3t64 and
openssl-provider-fips, plus 11 single-row pillow/aiohttp GHSAs);
revision 15's 11 statements produce 11. Predict the row count before
reading the scan, or a correct run looks like a discrepancy.
Bump the document version and refresh timestamp in the same edit, and
write what changed, what it retired, and how you verified it into the PR
description (invariant 5). That is the record: nothing about the revision
goes into the document itself.
pkg:oci/<image-title> when CI scans pkg:oci/<repo-basename>.
The label has no effect on grype's image PURL. Always include the
registry-basename form.vulnerability.name when grype emits a GHSA primary.
The two names are NOT interchangeable for OpenVEX matching.impact_statement ("not exploitable", "low risk").
Cite the specific code path, file, or upstream language that supports
the claim. Reviewers will reject thin justifications.timestamp and version at the document
level when materially changing statements. Bump
version on each substantive edit and update timestamp (or
Reviewed: notes) so downstream consumers can detect drift.tooling, or to any other
document-level field. tooling names what generated the document;
it is not a changelog. Appending to it is how it reached 8,010 bytes of
prose that every release signs onto every image. Per-CVE reasoning goes
in the statement, unfinished work in vex-state.yaml, and everything
else in the PR description. The guard now rejects the attempt, but the
point is that there was always a better place for it.vex-state.yaml entry for
the scan that will settle it, and in the PR description that performs
the deletion.vex-state.yaml "for the record". A
confirmed verification is finished; the record is the PR that confirmed
it. Entries that are never removed are exactly how tooling grew..github/workflows/vuln-scan-images.yaml.openvex.json.agents/skills/aicr-managing-openvex/vex-state.yaml.github/actions/sbom-and-attest/action.yml +
tools/openvex-bind (digest binding, tooling normalization) +
.github/actions/sbom-and-attest/openvex-guard.sh (contract and size
bound).grype.yamlvalidators/performance/aiperf-bench.Dockerfilevalidators/performance/requirements.txt (what installs) and
the AIPERF_VERSION ARG in that Dockerfile (must match; Renovate moves both)GrypeVersion.js at the
pinned scan-action SHA in the workflow<short-name>: N critical, N high, N medium, N low, N negligible (N VEX-suppressed)
HIGH+: <pkg> <primary-id> (<aliases>), ...© NVIDIA, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in .agents/skills/aicr-managing-openvex of NVIDIA/aicr.
Open the folder on GitHubat commit e8f18da
Aicr Managing Openvex next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Aicr Managing Openvex this skillNVIDIA/aicr | 440 | — | ~5.9k | Automated safety check: Pass | Apache-2.0 | |
| Container Securityhardw00t/ai-security-arsenal | 105 | — | ~2.8k | Automated safety check: Pass | None | |
| Container Security Hardeningsickn33/agentic-awesome-skills | 47k | 1 repos | ~1k | Automated safety check: Notes | MIT | |
| Performing Container Escape Detectionmukul975/Anthropic-Cybersecurity-Skills | 34k | — | ~648 | Automated safety check: Pass | Apache-2.0 | |
| Alibabacloud Ecs Sec Userspacealiyun/alibabacloud-ecs-troubleshoot-skills | 148 | — | ~2.6k | Automated safety check: Notes | Apache-2.0 | |
| Cloud Infra Supply Chainzhaji2333/CkSKILLS | 115 | — | ~688 | Automated safety check: Warn | MIT |
hardw00t/ai-security-arsenal
Container and Kubernetes security assessment — image vulnerability scanning, SBOM diff analysis, K8s cluster auditing, RBAC privilege mapping, NetworkPolicy review, container escape testing, and…
sickn33/agentic-awesome-skills
Harden Docker/container images and runtime deployments with secure base images, non-root users, CVE scanning, SBOM/signing, seccomp/AppArmor, and Kubernetes pod security controls.
mukul975/Anthropic-Cybersecurity-Skills
Audits container and pod configuration for escape-enabling misconfiguration using the Kubernetes Python client - privileged flags, dangerous capability grants, host path mounts, shared namespaces…
aliyun/alibabacloud-ecs-troubleshoot-skills
Linux 用户态安全入侵检测与取证工具,专为 AI Agent 设计。自动判断服务器是否被入侵, 提供完整证据链和可执行修复建议。51 个安全分析器覆盖进程/网络/认证/持久化/Rootkit/ 恶意软件/内存取证/容器逃逸等 12 类检测维度,10 个数据采集器全面采集系统状态, 映射 103+ MITRE ATT&CK 技术,支持 standalone/docker/k8s 三种部署模式。
zhaji2333/CkSKILLS
当目标涉及云资产(对象存储/云元数据/Serverless)、容器/K8s、运维面板(宝塔/Grafana/Zabbix/Jenkins/GitLab/Nacos等)、消息队列/缓存中间件、CI/CD流水线、第三方回调集成、依赖组件CVE、信息泄露配置时调用。负责未授权访问、弱口令、云配置错误、供应链漏洞与敏感信息挖掘。
mukul975/Anthropic-Cybersecurity-Skills
Runs Trivy across every target type it supports - container images, filesystems, Git repositories, and Kubernetes clusters - for OS and dependency vulnerabilities, IaC misconfiguration, exposed…
NVIDIA/aicr
Multi-agent PR review using Claude Code, Codex, and CodeRabbit.
NVIDIA/aicr
A skill your agent uses when analyzing an AICR snapshot YAML file, reviewing cluster state, comparing provider characteristics, extracting GPU/network topology insights, or generating a cluster…
NVIDIA/aicr
Scaffolds an interactive guided demo script (demos/.sh), live or self-paced, with the Frame → Tell → Show → Close pattern.
NVIDIA/aicr
A skill your agent uses when building a self-contained HTML slide deck or visual talking-point for a technical concept or workflow (e.g.
NVIDIA/aicr
A skill your agent uses when drafting the human-readable GitHub release notes summary for an upcoming AICR release.
NVIDIA/aicr
A skill your agent uses when reviewing the weekly AICR component drift report — the Slack digest and drift-report.json artifact produced by Registry Drift Report (registry-drift.yaml) listing which…
Categories
A skill your agent uses when adding, updating, or removing CVE/GHSA suppressions in .openvex.json — the OpenVEX document consumed by the weekly image vulnerability scan workflow. Aicr Managing Openvex is an agent skill from NVIDIA/aicr, published by the product's own GitHub organization.json — the OpenVEX document consumed by the weekly image vulnerability scan workflow.
Aicr Managing Openvex fits situations like: removing CVE/GHSA suppressions in .openvex.json — the OpenVEX document consumed by the weekly image vulnerability scan workflow; vulnerability suppression; aiperf-bench CVE; any request to act on findings reported by Weekly Image Vulnerability Scan for the aiperf-bench image.
Run `npx skills add NVIDIA/aicr --skill aicr-managing-openvex -a claude-code`. Or copy the skill folder (.agents/skills/aicr-managing-openvex in NVIDIA/aicr) into .claude/skills/aicr-managing-openvex in your project. Claude Code loads it when a task matches its description.
Run `npx skills add NVIDIA/aicr --skill aicr-managing-openvex -a codex`. Or copy the skill folder (.agents/skills/aicr-managing-openvex in NVIDIA/aicr) into .agents/skills/aicr-managing-openvex in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add NVIDIA/aicr --skill aicr-managing-openvex -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/aicr-managing-openvex, .gemini/skills/aicr-managing-openvex, .github/skills/aicr-managing-openvex and .opencode/skills/aicr-managing-openvex in your project.
Going by SKILL.md and its folder, Aicr Managing Openvex needs the command-line tools its instructions call (jq, gh, docker and make).
SKILL.md contains no URLs. Its commands use gh and docker, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Aicr Managing Openvex is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.9k tokens (SKILL.md is roughly 23k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Aicr Managing Openvex: Container Security (hardw00t/ai-security-arsenal, 105 stars), Container Security Hardening (sickn33/agentic-awesome-skills, 47k stars), Performing Container Escape Detection (mukul975/Anthropic-Cybersecurity-Skills, 34k stars) and Alibabacloud Ecs Sec Userspace (aliyun/alibabacloud-ecs-troubleshoot-skills, 148 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
NVIDIA (a GitHub organization, an official publisher) maintains it in NVIDIA/aicr, which has 440 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 10, 2026.
Source: NVIDIA/aicr on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.