Repository navigation
Releases: casareanderson/sieve
Release list
sieve 0.3.1: on PyPI (pipx install sieve-scan)
Packaging release: sieve is now on PyPI as sieve-scan.
pipx install sieve-scan
The command is still sieve. No code change from 0.3.0.
sieve 0.3.0: SBOMs, in and out
sieve 0.3.0 adds SBOMs, both directions: export what a scan found, and scan an SBOM that another tool made.
New
sieve <scan> --sbom cyclonedx|spdx— emit a CycloneDX 1.6 or SPDX 2.3 SBOM of exactly what the scan read: host, containers, a project directory (sieve path), or a remote machine (sieve remote). No OSV call needed for a plain export. Package URLs carrydistro=,upstream=and the rpm epoch the way syft writes them, so other tools can read them.--with-vulnsembeds the findings as CycloneDXvulnerabilitieslinked to their packages.sieve sbom FILE ...— scan an SBOM made by syft, trivy, cdxgen or GitHub's dependency graph (CycloneDX 1.4–1.6, SPDX 2.2/2.3 JSON) with sieve's usual OSV + CISA KEV + EPSS + malicious-package ranking. OS packages go back through the same distro mapping a host scan uses. Components it can't check (no package URL, no version, a type OSV doesn't cover) are counted and mark the scan partial — never silently dropped.
Still one runtime dependency (requests). The SBOM code is standard-library only and is loaded only when you ask for it, so a normal scan is unchanged. Output is validated against the official CycloneDX and SPDX schemas in CI.
Upgrading
- The GitHub Action's
v1tag now points at 0.3.0; pin@v0.3.0if you'd rather it didn't move.
178 tests. AGPL-3.0.
sieve 0.2.0: malicious packages, what is actually running, tamper checks, remote and rpm
sieve 0.2.0 goes from "scan this Linux box" to four new questions: is a known-malicious package installed, is the vulnerable code actually running, has anything installed been changed, and what about the machines I'm not logged into? It still needs no scanner binary and no vulnerability database, and its only dependency is still requests.
New
- Known-malicious packages, ranked above everything. OSV.dev carries OpenSSF's malicious-package reports (
MAL-…). sieve now treats those as their own top tier, above CISA KEV:☠ MALWARE, never hidden by a filter, exit code 1. Checked against the real thing: a lockfile pinningflatmap-stream@0.1.1(the 2018 event-stream backdoor) comes back asMAL-2025-20690. sieve path DIR: scan a project before you install it, frompackage-lock.json,yarn.lock,pnpm-lock.yaml,node_modules,requirements*.txt,poetry.lock,uv.lockand virtualenvs.sieve hostalso reads global npm installs now (no node needed): on the test box that was 221 packages no scan had looked at before.- In use: is it actually loaded? Every finding says whether its package's code is mapped into a running process right now (
yes/no/?), with↻when an upgrade replaced a file but the old copy is still running. Loaded findings sort first within their tier, and--in-use-onlykeeps just those. On a Docker host with 11 images, 1,162 of 6,771 findings (17%) were in running code. Without root it says how much it could see, and never claims "not loaded". sieve verify: has any installed file changed since its package manager put it there? It re-hashes files against the checksums already on disk (dpkg, apk, rpm, pip RECORD). A Proxmox node's 70,795 files took 34 seconds. It's a tripwire, not proof: someone with root can rewrite the checksum lists too. npm keeps no per-file checksums, so it can't be verified.sieve remote user@host: scan another machine over SSH, host and running containers, with onlypython3needed there. Nothing is copied or written on the other side, and the in-use check runs there too.- RPM distributions: AlmaLinux, Rocky, RHEL and UBI, openSUSE Leap and Tumbleweed. The rpm database (SQLite, ndb or BerkeleyDB) is read directly, with no
rpmbinary needed. Fedora, CentOS Stream, Oracle and Amazon Linux are counted, with a note that OSV has no feed for them. - SARIF 2.1.0 (
--sarif, and asarifinput on the GitHub Action) for GitHub code scanning, validated against the OASIS schema.
Fixed along the way
- Container scans on rpm images would have read the Docker host's rpm database, because SQLite resolves
/proc/<pid>/rootback to the host. It now reads a private copy. - One openSUSE record in OSV lists bash's fix as version 7.0, which made every Tumbleweed box show Shellshock as known-exploited. Records of that type now trust the build named in their title.
Upgrading
- The advisory cache schema is now 4, so the first scan after upgrading refetches advisories once.
- The table's first column is now
ALERT(wasKEV), and a newIN USEcolumn sits afterSEVERITY. If you parse the table, use--json. - The Action's
v1tag now points at 0.2.0; pin@v0.2.0if you'd rather it didn't move.
162 tests. AGPL-3.0.
sieve 0.1.0
sieve 0.1.0 is the first release. It's the vulnerability scanner from warden, split out so it can be used on its
own: it reads the package lists already on a Linux box and in its running containers, asks OSV.dev which
advisories affect those exact versions, and ranks what it finds by CISA KEV and EPSS. Its only dependency is
requests; there's no scanner binary or vulnerability database to download.
What it does
- Scans the host (
sieve host), every running Docker container (sieve containers, needs root) or both
(sieve all). - Covers dpkg and apk OS packages, plus Python, npm, Go and Rust (cargo-auditable) packages inside images.
Debian, Ubuntu and Alpine have OS advisory feeds; other distributions get their language packages checked. - Puts known-exploited (KEV) findings first, then fixable findings with an EPSS of 10% or more, then fixable
CRITICAL ones. Most of the rest is "affected, no fix yet", and the filters (--fixable-only,
--min-severity,--kev-only) let you hide it. - Exits 1 when a known-exploited finding is in the output and 2 when part of the scan failed, so it fits in cron
or CI.--jsongives the full report. - Scans containers on another machine with a standalone collector script:
sieve collector | ssh root@dockerhost python3 - > packages.tgz, thensieve containers --from-tar packages.tgz.
Ways to run it
- pipx:
pipx install git+https://github.com/casareanderson/sieve - Docker:
docker run --rm -v /:/host:ro ghcr.io/casareanderson/sieve host --root /host - GitHub Actions:
uses: casareanderson/sieve@v1. Thev1tag follows the latest 0.x release; pin@v0.1.0
if you'd rather it didn't move.
Things to know
- Package names and versions are sent to OSV.dev. Scanning needs outbound HTTPS to
api.osv.dev,
secdb.alpinelinux.org,www.cisa.govandepss.empiricalsecurity.com. - Vendored, forked or renamed packages can't be matched, and OSV can lag the original advisories by hours or
occasionally days. - Kernel packages are skipped by default (
--kernelincludes them). - The Docker image can't scan running containers itself; pipe the collector into
containers --from-tar -
as shown in the README.
Licensed under AGPL-3.0. The full list of changes is in CHANGELOG.md.