Skip to content

v2.0.0-rc.4

Pre-release
Pre-release

Choose a tag to compare

@tstromberg tstromberg released this 24 Jul 05:16

Update notifications (initial implementation, not yet live)

  • Once-a-day update check against a static TOML manifest (no telemetry); disable with --no-update-check or CLEAVE_NO_UPDATE_CHECK
  • New manifest tooling: manifest-gen (Go, soak-gated beta/stable channels) and update-manifest (bash, one-shot builds with cosign signing)

Memory & performance

  • Memory-aware admission gate: large archives serialize while small files fill the pool, using live available-memory readings so concurrent instances share the host
  • Archive members analyzed in bounded byte-windows instead of all-resident; per-member reports folded and dropped immediately
  • Trait regexes moved to a bounded LRU cache — the old design leaked every compiled engine (~7.7 GB RSS on member-heavy archives)
  • word:/substr: matching via SIMD literal searchers, no regex engine; ASCII raw patterns skip the unicode engine entirely
  • Evidence values capped at storage time; exact match counts computed only when a rule needs them
  • Accurate physical-core detection (SMT siblings excluded, Apple Silicon P-cores, illumos, FreeBSD/arm64 sysctl fix) drives pool sizing
  • Instantaneous RSS readings on FreeBSD/illumos so the memory gate can reopen; optional memprofile feature for phase-tagged heap accounting

Matching semantics & correctness

  • AST query cache made unbounded with serialized compiles — fixes nondeterministic finding loss during parallel archive analysis
  • UTF-16 scripts normalized to UTF-8 before text matching — a UTF-16 VBS now matches like its UTF-8 twin
  • not: exact: is now case-sensitive, so excluding PowerShell doesn't excuse pOwErShElL
  • AST walks bounded by CPU time, not wall clock — starved threads no longer silently drop detections
  • Markdown code blocks treated as documentation, not embedded scripts
  • New trait surface: type: comment, type: path (basename/dirname scopes), import alias: filters, multi-arg args: matching, is: valid_ip, bare section names (rsrc,
    __cstring) for PE/Mach-O
  • Cache-hit reports re-stamp file.basename/file.stem — no more phantom diffs between identical files

Analyzers

  • Chrome/WebExtension manifests now emit neutral per-permission and per-host capability traits instead of hardcoded risk scores
  • XML parsing rejects pathologically deep documents (stack-overflow DoS guard)
  • VBA identifier metrics (length, entropy, distinct triggers); compact JSON schema bumped to v6 with smaller evidence locations

Rule validation

  • New checks: scope: archive with non-archive for:, repeated inline unless: exclusions, duplicate detection scoped to matching sections
  • Explicit for: type limit relaxed to 8; per-condition-type caps removed; hardware/gpu taxonomy section added

API & maintenance

  • New scan_files() library entry point (explicit path list, shared resources, streaming callback)
  • Symbol source field removed from output; deadlock detection now an opt-in feature
  • Dependency updates