Repository navigation
Releases: ntavakol/OSS-Intake
Release list
0.8.0
Scanner signatures that can actually pass, hardening against hostile input, and a weekly re-scan workflow.
Added
--trivy-archive/--grype-archiveand--trivy-checksums/--grype-checksums: before the scanner runs,
cosign checks the release's Sigstore bundle on the checksums file (or the archive), the checksums file must list
the archive's SHA-256 (matched by name, or by hash when the archive was saved under another name), and the
executable must be byte-for-byte the one inside the archive. An archive with neither a checksums file nor a
bundle is compared but noted as unanchored.--govulncheck-sha256(checked before govulncheck runs) and--govulncheck-version. The Docker or crane
executable used to copy binaries out of an image is recorded with its SHA-256 in assessment.json.examples/scheduled-rescan: a GitHub workflow that re-scans an inventory weekly, carries decisions forward,
keeps the reports as an artifact (also when a run fails) and opens an issue listing the Act now findings no
decision has set aside and releases under a week old. A fingerprint in the issue title means the same list is
reported once while its issue is open. It needs onlycontents: readandissues: writeand never commits.- A warning when
--sbom,--trivy-arg/--grype-arg,--image-src,--release-tag, a scanner pin for a
scanner that does not run, or a govulncheck option without--reachabilitywould have no effect.
Changed
--trivy-cosign-bundleand--grype-cosign-bundleneed the matching--*-archive(B10). Trivy signs its
release archives and checksums file and Grype only its checksums file; neither signs the extracted executable,
so a bundle checked against the executable could never pass on a real release (confirmed on Trivy 0.76.1).- Option abbreviations are refused (
--offlinno longer means--offline), and--top,--timeout,
--grace-daysand--unshipped-daysare range checked before any work.
Fixed
- A
.tar.gzor.zipwithout PKG-INFO (apache-tomcat-9.0.98.tar.gz) was looked up on PyPI and reported as
not published; it is now unsupported (B20). - A missing scanner left an empty output folder behind (B24).
Security
- pom.properties and package.json larger than 1 MB are never read; a small archive could inflate to gigabytes in
memory (S2). packages.csvheader cells and values joined with;,,or a tab are guarded against spreadsheet formulas,
not only a leading=(signed numbers such as-1are left alone), and reading findings.csv back undoes the
guard exactly, even for notes that already contain a quote before=(S3, S4).- summary.md escapes Markdown and HTML in every line built from data (title, headings, paragraphs, lists and
tables), so a package name, tag or advisory title cannot add links, images or raw HTML (S5). - Registry identities read from inside an artifact must be valid coordinates (no path segments or
..) and are
URL-quoted, so a tampered file cannot steer the checksum lookup to another package (S6). - Advisory text and workflow files are length-capped before pattern matching, which could take seconds on crafted
input (S7). - Unreadable archives no longer crash the run, and the temporary copy of an artifact is always removed (S8).
- govulncheck is pinned like Trivy and Grype (S9).
0.7.0
Decisions and versions you can trust, a check for brand-new releases, and a CI gate.
Added
- New-release check: every language package version the run knows about (inventory entries, or the image's or
lockfile's package list) is looked up on deps.dev, and versions published fewer than--release-age-daysago
(default 7;0turns it off) are flagged in a warning, a "New releases" tile and section, the executive summary,
andpackages.csv(newpublishedandnew_releasecolumns). Compromised releases are usually live for hours
or days before they are pulled and before any advisory exists. Up to 400 lookups per run. --fail-onfor CI: exit 3 when any ofmalicious,kev,act,critical,high,recentormismatchis
found, naming which. Findings set aside by evidence or an assessor decision do not count; malicious packages
always do. A gate whose check is turned off (--offline,--release-age-days 0,--no-registry-check) is
refused, and one whose check could not run fully (deps.dev errors, no package list) exits 1 rather than pass.- findings.csv column
triage_justification(optional OpenVEX justification), so decisions survive
findings.csv to OpenVEX and back unchanged. - Issue templates; security reports are pointed to private advisories.
Changed
- Breaking for existing findings.csv files:
mitigatedintriage_statusnow means not affected with the
justificationinline_mitigations_already_exist(CycloneDXprotected_by_mitigating_control), not fixed: a
compensating control is not a fix. Amitigatedrow now needstriage_notes; one without stops the run
(exit 2), where 0.6 read it asfixed. Rows already saved asfixedare unchanged. - A decision for another version of a finding that is still present is no longer listed as resolved.
- An inventory's "upgrade to" is the lowest listed fix that is fixed for every finding on its release line.
- PyPI metadata: current summary, Python 3.10 to 3.13 classifiers, Documentation and Sample report links. CI also
runs Python 3.11 and 3.12.
Fixed
- Two decisions for one vulnerability in one package at two versions overwrote each other; the one for the
installed version now wins (B3). - The tool could not read back its own openvex.json for OS packages (
pkg:deb/ubuntu/libc6loaded as package
ubuntu/libc6); the distro namespace is dropped, the epoch qualifier read, and encoded versions decoded
(7.88.1-10%2Bdeb12u14) (B4). - Notes starting with
-,=,+or@gained a quote, and multi-line notes were flattened, after a round trip
(B18, B21). - OSV commit hashes from GIT ranges could become the fix and "upgrade to" version (B5).
- Letter-patched versions sorted wrong (OpenSSL
1.1.1mbelow1.1.1l), so their fixes were missed; OpenSSL's
letters past z (0.9.8zato0.9.8zh) sort afterz, and PEP 440 pre-releases such as1.0astay before
1.0(B6). - "Upgrade to at least" could name a version that still had a vulnerability fixed on another release line (B7).
- PyPI names in an inventory
purlcolumn were not normalised, so OSV's fixes never matched (B8). - The same Go fix appeared twice when sources disagreed on the
vprefix (B19). - The sdist now contains the test fixtures, so its tests run (B11).
- A malformed pinned hash (
--trivy-sha256,--grype-sha256,verify --sha256) is an input error, exit 2 (B16). - Placeholder versions such as
4.x,4.1.Xand31.+are refused in an inventory (B17).
0.6.1
Fixes from the 0.6.0 review: no report may look cleaner than the checks behind it.
Fixed
- Sources that did not run (CISA KEV, exploit indexes, EPSS, OSV malicious package data) were shown as green
zeros, and Routine reasons said "no exploit indexed, EPSS below 0.1" even with--offline. They now show as
"not checked" with the reason, Routine reasons name only the checks that ran, a warning says a zero means not
checked, and the summary line addsnot_checked=. Fix-date coverage no longer blames an ecosystem when dates
were not looked up. - A wrong or empty file given to
--from-trivy-jsonor--from-grype-json(for example Grype JSON as Trivy, or
{}) gavefindings=0and exit 0. It is now refused with exit 2, saying what the file looks like (an SBOM is
named as such). UTF-16 files, as Windows PowerShell 5.1 redirection writes them, are read. An imported Trivy or
Grype report for a different image than--image(another repository, tag or digest) gives a warning. - An
renv.lockscan whose OSV lookup failed reported green zeros and exit 0; with OSV its only source, it now
stops with exit 1, as does an inventory (previously exit 2 there). - An impossible date (
--as-of 2026-02-30, or one in scanner, API or Debian and Go release data) crashed the
run; it is now a usage error, or skipped in data. verifyprintedOK sha256and then failed on a missing--cosign-identity; all options are checked first.
Security
- With
--trivy-sha256or--grype-sha256, the scanner's hash (and cosign signature, if given) is checked
before the binary is executed at all; previously its--versionran first. Cosign now runs once per scanner,
not twice.doctorrecords the hash before
running--versionand notes that the binary was not verified.
v0.6.0
v0.5.0
Assessor decisions carry between runs: --decisions reads an earlier findings.csv or OpenVEX, sets aside not_affected and fixed findings with the note as the reason, and writes openvex.json. README example and likelihood tables are now generated from the code. See CHANGELOG.md.
v0.4.0
Upgrade comparison for package inventories: what is still known to affect the minimum fix version and the latest stable release, with major-version warnings. --no-latest skips the latest-release lookup. Go fix versions carry the v prefix. See CHANGELOG.md.
v0.3.0
Package inventory input: pass a CSV of packages (ecosystem,name,version or purl, plus owner or system columns) to check what an organisation already uses against OSV, with a per-package packages.csv and report section. Malicious releases are flagged. See CHANGELOG.md.
v0.2.4
v0.2.3
Compromised releases of trusted packages are flagged reliably: CWE-506 malware advisories count as malicious even without an OpenSSF MAL- entry (ua-parser-js 0.7.29, event-stream 3.3.6), npm scoped names are decoded, and MAL- entries merge with their GitHub advisory. See CHANGELOG.md.
v0.2.2
Report fixes for path scans without a repository: findings.csv always written, n/a instead of a green 0 when there is no release date, a Project health hint instead of empty rows, fewer false 'Check conditions', and a cleaner plan line. See CHANGELOG.md.