Packages & vulnerabilities¶
Delta enumerates installed packages (a lightweight SBOM), captures them into a baseline for drift detection, and matches them against a local CVE advisory feed.
delta --packages # list packages
delta --root /mnt/image --packages --baseline sbom.json # SBOM of an image
delta --root /mnt/image --cve-feed advisories.json --json # vuln scan
Package collection¶
Parsed from the text package databases under the active root (so it works
offline via --root):
Manager |
Database |
Notes |
|---|---|---|
dpkg (Debian/Ubuntu) |
|
only |
opkg (OpenWrt) |
|
same format as dpkg |
apk (Alpine) |
|
|
Delta does not read the rpm database. That database is a binary store (BerkeleyDB or sqlite) and needs librpm. Delta has no third-party runtime dependency.
SBOM drift¶
--packages --baseline records other_packages_present: false plus
packages: [{name, version}]. Checking reports high for a missing /
version-changed package and medium for an unexpected one. See
Baseline capture, Configuration.
CVE feed¶
--cve-feed <file> matches the inventory against a local JSON advisory
feed that you supply (generate it from NVD/OSV with your own tooling — Delta
does the matching, including Debian-style version comparison, and stays
offline).
{
"advisories": [
{ "cve": "CVE-2022-0778", "package": "openssl", "severity": "critical",
"affected": { "lt": "1.1.1n" } },
{ "cve": "CVE-2021-28831", "package": "busybox",
"affected": { "ge": "1.28.0", "lt": "1.32.1" } },
{ "cve": "CVE-2019-5747", "package": "busybox",
"affected": { "versions": ["1.29.0", "1.29.1"] } }
]
}
For each advisory, every installed package with the matching name whose version
falls inside affected produces a vulnerability violation at the
advisory’s severity.
affected semantics:
range operators
lt/le/gt/ge/eq— ANDed (a half-open range);``versions`` — an exact-match OR-list;
omitted — every installed version is affected.
Version comparison follows Debian’s algorithm (optional epoch:, the ~
pre-release marker, numeric segments compared by value so 1.10 > 1.9).
Building the feed from OSV¶
tools/delta-feed.py converts OSV records into the
advisory schema above, so you can drive Delta from a public vulnerability
database without hand-authoring the feed:
# a single record, a directory dump, or stdin
tools/delta-feed.py osv2feed osv-export/ -o advisories.json
tools/delta-feed.py osv2feed CVE-2022-0778.json
Each OSV affected range’s introduced / fixed events become
ge / lt operators, an explicit versions list becomes the exact-match
OR-list, a CVE alias is preferred over the OSV id, and GIT (commit-hash)
ranges are skipped as non-version-comparable. Records are de-duplicated across
inputs. The feed it produces is distributed to devices like any other — e.g.
served from the config_url the control plane already fetches
(Shipping reports to a server).
Exporting an SBOM¶
The same tool exports the collected package inventory as a standard SBOM, so Delta’s view of a device or image plugs into existing supply-chain tooling:
delta --root /mnt/image --packages --baseline sbom-base.json
tools/delta-feed.py sbom --format cyclonedx sbom-base.json -o sbom.cdx.json
tools/delta-feed.py sbom --format spdx sbom-base.json -o sbom.spdx.json
cyclonedx emits CycloneDX 1.5 (components), spdx emits SPDX 2.3
(packages); both carry a pkg:generic/<name>@<version> purl per package.
The tool is dependency-free Python 3; tests/scripts/test_feed_tool.sh smoke-
tests both directions.