This page explains the NRDAX concepts as this client represents them, and the versioning policy. The models mirror the canonical NRDAX schema exactly; nothing here is invented.
A technique's id has the form NRDAX-Tnnnn (for example NRDAX-T0006). Ids are
opaque, stable, and never reused. An id never changes across releases, so it is
safe to cite. Family is an attribute, not part of the id - a technique can be
reclassified without breaking its citation.
The citable unit.
| Field | Meaning |
|---|---|
id |
Permanent NRDAX-Tnnnn identifier. |
name |
Stable slug / alias (opaque, citeable). |
display_name |
Human-readable label (presentation only; may improve across releases). |
mechanism |
Prose description of how the attack works. |
family |
One family from the fixed taxonomy. |
status |
Lifecycle: active, deprecated, or superseded. |
first_seen |
Date (YYYY-MM-DD). |
instances |
Chain-specific occurrences (evidence). |
external_references |
Links to CVEs, advisories, briefs. |
provenance_note |
Set when the technique arrived via an accepted submission. |
The human label to show is display (the display_name if present, else name).
A chain-specific occurrence of a technique - the evidence for its cross-chain claim.
| Field | Meaning |
|---|---|
chain |
The chain the occurrence was observed on. |
primitive_id |
The pipeline primitive that reproduces it. |
bundle_ref |
Reference to the evidence bundle. |
fidelity |
How faithfully it reproduces the real attack on the wire. |
discovery_origin |
How the finding was discovered. |
external_references |
Instance-level references. |
Fidelity classes, weakest to strongest evidence: stub, proxy, lab,
production-derived, production-captured.
Discovery origins (a distinct axis from capture provenance):
original-research, reverse-engineered-cve, disclosed-advisory.
Reproduction status is derived, not stored: a technique is reproduced if it has
at least one instance, otherwise known (a catalogued public disclosure names it,
but no instance reproduces it). This is a different axis from the lifecycle status.
In the current dataset most techniques are known; a minority are reproduced.
kind is one of cve, ghsa, vendor-advisory, nr-advisory, nr-brief; id is
the reference identifier; url is optional. Reference ids are preserved exactly as
published and are never rewritten; when an id is not a clean short identifier, match
it with --reference --reference-contains (or by_reference(..., contains=True)).
Families are a fixed taxonomy with two groups: fine-grained families carried by
reproduced techniques, and a coarser class axis carried by known-but-not-reproduced
techniques. nrdax schema lists them all. families() returns every family with its
count, including zero-count families.
The coverage matrix is technique x chain, computed from the data (never stored):
- cells - reproduced pairs, recording the strongest fidelity and instance count.
- known - pairs a disclosure names, with no reproduced instance.
- Anything in neither is a gap (implicit, to keep the payload proportional).
The chain axis is ordered most-covered first (ties by name). This client's derivation
is byte-compatible with the canonical feed's coverage-matrix.json.
NRDAX has no asserted technique-to-technique relationship field (no
parent/child/"related" edges). related() therefore surfaces only relationships
derivable from canonical fields:
- family - sibling techniques in the same family;
- chain - techniques with an instance on a shared chain;
- reference - techniques sharing a reference id (e.g. the same CVE) - the strongest link;
- instances, advisories, briefs - the technique's own evidence and links.
STIX is an export format for NRDAX, not its internal model. Each technique becomes
a STIX attack-pattern SDO:
- The NRDAX id is anchored in
external_referencesundersource_name: "nrdax". - NRDAX-specific fields ride as custom properties:
x_nrdax_family,x_nrdax_status,x_nrdax_chains. - Ids are deterministic UUIDv5 under a fixed namespace; timestamps come from
first_seen. The export is byte-identical to the canonical NRDAX emitter, so identity round-trips.
Parsing STIX back is lossy (see NRDAX.from_stix): it recovers identity, name,
mechanism, family, status, first_seen, references, and the chain list (preserved in
extra['x_nrdax_chains']), but not per-instance detail (primitive id, bundle ref,
fidelity, discovery origin), because STIX flattens instances. Treat STIX as an
interchange format, not a full backup.
Four versions are tracked independently:
| Version | Where it lives | Changes when |
|---|---|---|
| Package | nrdax.__version__ / pyproject.toml |
The library/CLI code changes. |
| CLI | equals the package version | with the package. |
| Dataset | index.json / API registry_version (e.g. v0.1-import) |
NullRabbit publishes new data. |
| Schema | nrdax.vocab.NRDAX_SCHEMA_VERSION (e.g. 1.4) |
The field set changes. |
- A package release does not imply the dataset changed.
- A dataset release does not require a new package unless the schema changed.
- The schema version is tool-tracked because the feed carries no
schema_versionfield.
Pin an exact dataset for reproducible research by keeping a copy of a static feed
and loading it with --source feed:/path (or NRDAX.from_feed). nrdax update
fetches the current dataset into the cache; the package bundles no data, so a pinned
feed copy is the way to hold a fixed version.
- No
implementationorsurfacefield exists;--implementationand surface search are derived text heuristics. - No DOI is minted yet; citations omit it.
- No historical versioned releases are published; cross-version
changesneeds two snapshots you supply. - The static feed is not yet hosted at a stable public URL;
nrdax updateuses the live API by default. - The feed's
coverage-matrix.jsonexposesknown; the API's/coveragedocumentsgapsin its OpenAPI. This client models the feed (known).