file and offset
that prove it.
The catalog
Severity is a fixed function of the risk id — never a judgment made at scan time — so output is deterministic.
Every risk carries a
detail list naming the exact evidence — the dotted callables, the
matched gadgets, the specific op — plus the occurrence that located it.
Four of the five inspect an artifact (the bytes of a model file).
unsafe-load is a
code risk: it rides on the library the call uses (torch), with the call’s
file:line as evidence. That path is extensible — see Extending the
catalog.How risks appear in output
- CycloneDX
- SARIF
- Native (json / yaml)
- CI gate
Risks project into the top-level
vulnerabilities[] array — a non-CVE id with
source.name: airom, ratings[].method: other (no CVSS is fabricated), and
affects[].ref pointing at the affected component’s bom-ref.CycloneDX with a vulnerabilities[] block
Legacy
airom:pickle.risk / airom:pickle.imports component properties are still emitted
alongside the CycloneDX vulnerabilities[] entry for one release, then retire.Coverage bounds
Extending the catalog
Code-level risks extend without Go. Any rule pack can attach a catalog risk to a match with arisk: field:
A rule that attaches a risk
airom rules lint like any other error. See writing rules.
It stays deterministic and offline — no LLM, no vulnerability database, no network. The
same bytes produce the same risks on every run.
Where to next
Exit codes & --fail-on
The gate grammar, including the
risk terms.Evidence model
How every risk is anchored to a file and an offset.