Skip to content

Releases: casareanderson/sieve

sieve 0.3.1: on PyPI (pipx install sieve-scan)

Choose a tag to compare

@casareanderson casareanderson released this 11 Oct 19:49
81625ee

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

Choose a tag to compare

@casareanderson casareanderson released this 11 Oct 19:09
5e54cae

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 carry distro=, upstream= and the rpm epoch the way syft writes them, so other tools can read them. --with-vulns embeds the findings as CycloneDX vulnerabilities linked 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 v1 tag now points at 0.3.0; pin @v0.3.0 if 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

Choose a tag to compare

@casareanderson casareanderson released this 11 Oct 15:31
b0afda4

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 pinning flatmap-stream@0.1.1 (the 2018 event-stream backdoor) comes back as MAL-2025-20690.
  • sieve path DIR: scan a project before you install it, from package-lock.json, yarn.lock, pnpm-lock.yaml, node_modules, requirements*.txt, poetry.lock, uv.lock and virtualenvs. sieve host also 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-only keeps 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 only python3 needed 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 rpm binary 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 a sarif input 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>/root back 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 (was KEV), and a new IN USE column sits after SEVERITY. If you parse the table, use --json.
  • The Action's v1 tag now points at 0.2.0; pin @v0.2.0 if you'd rather it didn't move.

162 tests. AGPL-3.0.

sieve 0.1.0

Choose a tag to compare

@casareanderson casareanderson released this 10 Oct 22:11

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. --json gives the full report.
  • Scans containers on another machine with a standalone collector script:
    sieve collector | ssh root@dockerhost python3 - > packages.tgz, then sieve 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. The v1 tag 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.gov and epss.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 (--kernel includes 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.