Skip to content

Releases: atomdrift-project/scan

v2.4.0

Choose a tag to compare

@tstromberg tstromberg released this 25 Jul 19:02

Dependency scanning

  • Fetching on by default (--fetch=all); every fetched dependency gets its own verdict, not a slice of its parent's.
  • Worker mode scans all resolvable dependencies; interactive scans stay gated to fresh releases — now including correctly-dated Go pseudo-versions.

Correctness

  • Never posts a verdict it didn't compute — an unreached dependency no longer gets an invented "benign" that would bless a bad package.

Scale & speed

  • Files up to 16 GiB (streamed — a 16 GiB sample scans on an 8 GiB host).
  • Lockfile-heavy scans faster: registry JSON no longer YARA-scanned (~20s saved on 851 records).
  • Worker count back to physical (non-E) cores — better throughput on hybrid CPUs.

LLM (optional)

  • Legacy --interpret flag was renamed to --llm
  • Now auto-picks the largest model served.

Project

  • Rust 1.94, moved to GitHub, dependency updates.

v2.3.0 (migrated from Codeberg)

Choose a tag to compare

@tstromberg tstromberg released this 24 Jul 05:16

Features

  • --format=interpret: print the LLM prompt locally; no LLM call. Works with scan and ps.
  • SCAN_FORMAT env var sets default output format.
  • SCAN_NO_ANALYSIS_CACHE=1 disables all analysis caches.
  • Reports record provenance: registry sidecars, fetch URLs, embedded file id/sha256.
  • Machine formats now emit all files; --show only filters the terminal view.

Fixes

  • Trait floor read the wrong JSON key and never fired on current cleave reports.
  • Crit-5 traits now escalate a benign model verdict to hostile, not suspicious.
  • Benign archive members no longer inherit their container's hostile verdict.
  • Hostile transitive dependencies now surface at the archive root, not just the manifest.
  • Unparseable PURLs no longer produce bloom-filter keys.
  • All PURL spellings normalize to one canonical form.
  • FreeBSD worker stop no longer hangs or orphans the scanning child.

Optimizations

  • 30-60 MB lower peak RSS via jemalloc arena cap.
  • 800 MB less retained worker memory: dependency reports kept as text, not parsed trees.
  • Capped uploader sha set; prune stale cache versions.
  • Worker shutdown drain: 60s to 15s.

v2.2.1

Choose a tag to compare

@tstromberg tstromberg released this 24 Jul 05:16
  • Performance improvements: fixed intermittent purl/url hangs
  • New --registry-map FILE flag

v2.2.0

Choose a tag to compare

@tstromberg tstromberg released this 24 Jul 05:16

Features

  • Bloom-filter matching — scans consult bloom filters before doin work: known-good & known-bad, known-good samples are skipped by default. Tune with --mode: fast (bloom only), balanced default), or slow (always full scan).
  • Dependency fetchin by default — interactive scans fetch and scan a sample's declared dependencies and install-command packages
  • Renamed CLI to atomscan (avoids clashing with avast's scan); fs→path, pkg→purl (old names aliased).
  • New "purl" subcommand: purl npm/left-pad@1.3.0 scans a package straight from its PURL.
  • New "url" subcommand to scan a remote URL
  • Adaptive --interpret templates
  • Auto-refreshes rules/models when stale (--no-update to disable); --hopper upload in server mode; --show=all keeps all archive members.
  • Handles registry records, provenance, and local references, including offline registry maps.

Fixes

  • Recalibrated thresholds (hostile L25, suspicious L3000); confident-but-opaque ML "hostile" held at suspicious, not cleared.
  • Fixed bloom bucket loading, progress-bar glitches, FreeBSD build, and tar.gz extraction.
  • Removed obsolete flags (--slow-rule-ms, --models-repo, --no-update-check).

Performance

  • Caches fetched-dependency analysis by content hash, skipping repeat disassembly across scans.
  • Parallel dependency fetching and scanning.

v2.1.2

Choose a tag to compare

@tstromberg tstromberg released this 24 Jul 05:15
  • Sync with cleave 2.1.2: which allows building under rust 1.94 again
  • interpret: use / instead of !! in paths to avoid confusing the LLM

v2.1.0

Choose a tag to compare

@tstromberg tstromberg released this 24 Jul 05:15

Highlights for operators:

  • Experimental --fetch feature to fetch and scan remote dependencies
  • New "pkg" and "url" subcommands to scan remote samples directly.
  • Hopper upload — --hopper/--upload pushes refreshed scan data upstream.
  • Faster scans — dropped tract (CPU hotspot) for a leaner model engine; parallelized ps and specialist startup; dynamic admission sizing.
  • v8 model migration — more reliable model releases, models pulled via git, per-file typing.
  • Leaner output — slimmer JSON payloads from workers.
  • Broader worker support — added SUSE, Void, and Fedora (on top of illumos, FreeBSD, Arch, etc)
  • cleave v2.1.0 - which has it's own changelog: https://codeberg.org/atomdrift/cleave/releases/tag/v2.1.0

v2.0.0

Choose a tag to compare

@tstromberg tstromberg released this 24 Jul 05:15

Since the last official release — v1.2.1

  • Now generally available, running ONNX-only inference (pure Rust, no XGBoost/LightGBM) on the
    new azoth model.
  • Rethought severity — scored as false positives per 100M files instead of a 1–9 scale;
    "suspicious" is now a bounded middle ground.
  • LLM interpretation and tiny output, on top of a new analysis engine (cleave 2.0 / filefacts).
  • Signed model and trait updates delivered as compressed bundles, replacing the old git-based
    updater.
  • Steadier under load — memory-aware scheduling, smallest-job-first ordering, and larger thread
    stacks that fix archive crashes.
  • Much deeper diagnostics — crash dumps, worker census, thread dumps, breadcrumbs.
  • Rebrand — litmus is now Atomdrift Scan.

Since 2.0.0-rc.5:

  • LLM second opinion — a new --interpret mode sends tricky samples to a local LLM for a verdict
    and one-line reason, then blends it with the ML score. Fails silently if the model is
    unreachable.
  • Smarter job ordering — the worker now runs the smallest job first instead of
    first-in-first-out, so quick scans stop waiting behind slow archives.
  • Better diagnostics — worker census, thread dumps, crash dumps, and tracing breadcrumbs for
    debugging stuck or aborted scans.
  • New output — --format=tiny for LLM context; cleaner, more readable v7 JSON.
  • Internal cleanup — core scan engine refactored and admission control simplified.

v2.0.0-rc.5

v2.0.0-rc.5 Pre-release
Pre-release

Choose a tag to compare

@tstromberg tstromberg released this 24 Jul 05:15

Features

  • Added R2-backed model updates with sha256 verification, staged load validation, atomic install, and update/
    check support.
  • Added signed model publishing via compat-tested .tar.zst bundles for azoth.
  • Updated to cleave 2.0.0-rc.5, filefacts 0.9.5, and stng 1.6.0 for newer package, PE/CLR, archive, and string
    signals.
  • Added crash-time in-flight analysis dumps to identify likely files behind stack-overflow aborts.
  • Added trait-floor escalation: confident high-severity cleave findings can raise a model-benign verdict to
    suspicious.
  • Added severity-fraction aggregate features for sparse high-risk finding clusters.

Performance

  • Replaced git-based model and trait updates with compressed R2 bundles.
  • Removed old git updater code and rollback paths; model bundles are validated before going live.
  • Model publishing now reuses cleave’s manifest generator with cached compatibility validation.

Bugfixes

  • Suspicious verdicts are now capped at level 20000, preventing very loose grid hits from becoming suspicious.
  • Raised max CLI severity level to 25000 while keeping suspicious bounded.
  • Preserves rare anti-analysis metrics like AST depth capping for model features.
  • Validation output now reports level and decision threshold, making model failures easier to triage.
  • Removed a temporary benign-sample validation waiver so validation reflects current model behavior.

v2.0.0-rc.4

v2.0.0-rc.4 Pre-release
Pre-release

Choose a tag to compare

@tstromberg tstromberg released this 24 Jul 05:15

Severity levels & verdicts

  • Severity levels are now expressed as false positives per 100M benign files (default L50); the old 1–9
    scale is gone
  • Each model bundle ships its own default level; -l still overrides
  • Every file reports l: the strictest level at which it fires
  • "Suspicious" now means a file fires above the hostile budget but within the calibrated grid — no
    separate calibration
  • Output shows the matched level and raw route scores; calibrated percentages were dropped (they saturate
    to 1.0)

Models

  • ONNX is now the only model format; LightGBM and XGBoost loaders removed
  • validate fails bundles with feature-layout drift instead of silently scoring zeros; features are matched
    by name, so reordered specs can't misalign
  • Archive routing treats tar.gz as tar, matching training labels
  • New validate --skip-traits checks a model independently of trait updates

Worker

  • Memory-aware admission: large archives run one at a time instead of co-residing and exhausting RAM
  • Analyses share one thread pool with larger stacks, fixing overflows under concurrent deep archives
  • Oversized results post the verdict without the raw report rather than losing the analysis
  • New heartbeat API reports liveness, load, queue depth, and throughput even while busy
  • Native FreeBSD deploy support; correct CPU detection on illumos/Solaris
  • bench_hopper: a local mock server for benchmarking the worker end to end

Other

  • Daily zero-telemetry update check; a hosted manifest also pins the matching models ref
  • scan accepts files and directories together in one run
  • Dependency updates

v2.0.0-rc.3

v2.0.0-rc.3 Pre-release
Pre-release

Choose a tag to compare

@tstromberg tstromberg released this 24 Jul 05:15

Features:

  • The big change is feature extraction. litmus now computes the full set of fields the latest azoth model wants
  • The ML JSON output is now unambiguous. Schema v=5 replaces the old oclass/oprob and threshold pair with a single self-consistent

Fixes:

  • Repaired the json→model plumbing: reading the ff/m/ms fields out of filefacts had broken.
  • scan.rs lost ~350 lines in the process; same behavior, less machinery.

Operational:

  • The WORKERS knob is honored across all worker scripts (alpine, bastille, debian, macos, omnios, openbsd), with better update logging.
  • scan-no-deadlock now emits logs so a hang is diagnosable.