v1.14.0: Bloom-filtered OSV checks and lifecycle-script content sniffing
Two new opt-in supply-chain layers on top of the v1.13 gates: a ~380 KB bloom-filter prefilter that lets plain reinstalls cheaply probe the OSV MAL-* set without pulling the 200 MB mirror, and a regex-based content sniff that flags dangerous shapes in dependency preinstall/install/postinstall scripts before you click through aube approve-builds.
Added
-
(install) OSV bloom-filter prefilter for lockfile installs (#680 by @jdx) — New
advisoryBloomChecksetting (on/required/off, defaultoff) adds a fourth route to the post-resolve OSV decision table. Plain reinstalls probe the resolved transitive graph against a ~380 KB bloom filter fetched fromendevco/osv-bloom— regenerated upstream every 10 minutes from OSV'sMAL-*archive — and only escalate bloom hits to the live/querybatchAPI for exact(name, version)confirmation. Bloom FPR is ~0.1%, so a typical 1000-package lockfile triggers zero or one extra live-API round trip per install. When both are configured, the bloom branch wins over the 200 MBall.zipmirror — under 1 MB on the wire, same live-API oracle, sameERR_AUBE_MALICIOUS_PACKAGEon a confirmed hit. Cached under$XDG_CACHE_HOME/aube/osv-bloom/and short-circuits the download when upstream'sset_digest_sha256is unchanged. New warningWARN_AUBE_OSV_BLOOM_REFRESH_FAILED: underoninstall continues against the previously cached filter; underrequiredit fails closed withERR_AUBE_ADVISORY_CHECK_FAILED. -
(install) Content-sniff dependency lifecycle scripts before approve-builds (#685 by @jdx) — aube's existing supply-chain gates (OSV
MAL-*, downloads floor, bun-compat scanner,BuildPolicyallowlist) are all name-based; none inspects whatpostinstallactually does, which leaves an OSV-ingest-lag window of 12–48h that the 2024–2026 wave of unobfuscatedcurl … | shpostinstalls walked right through. New regex matcher fires advisory warnings for known-dangerous shapes in lifecycle script bodies:Signal Catches ShellPipecurl … | sh,wget … | bash,… | nodeEvalDecodeeval(atob(…)),Function(atob(…)),eval(Buffer.from(…))CredentialFileRead~/.ssh,~/.aws,~/.npmrc,~/.config/ghreadsSecretEnvReadprocess.env.*(TOKEN|SECRET|API_KEY|PASSWORD|ACCESS_KEY|PRIVATE_KEY|AUTH)ExfilEndpointDiscord/Telegram webhooks, OAST hosts ( oast.pro,interactsh,webhook.site,pipedream.net,ngrok.io, …)BareIpHttpBare-IP HTTP fetch targets (literal IPv4 hosts over plain HTTP) Sniff is advisory —
allowBuildsstill gates execution — and shows up in three places: end-of-install emits oneWARN_AUBE_SUSPICIOUS_LIFECYCLE_SCRIPTper flagged package alongside the existingWARN_AUBE_IGNORED_BUILD_SCRIPTS;aube approve-buildsannotates picker rows with⚠ suspicious: <category>and prints a pre-picker summary of the matched hook+description;aube ignored-buildsindents⚠ <hook> — <description>lines under eachname@version. Findings are re-derived per install rather than persisted, so the regex set can evolve without a state-file migration. Works offline, doesn't degrade to advisory in headless CI.
Changed
- Refreshed
benchmarks/results.jsonagainst v1.13.1 and Bun 1.3.14 (#687) — public ratios update to warm installs 3× Bun / 6× pnpm, repeat test 6× Bun / 45× pnpm.
Full Changelog: https://github.com/endevco/aube/compare/v1.13.1...v1.14.0
💚 Sponsor aube
aube is part of en.dev — an independent developer-tooling studio run by @jdx, also behind mise. Work on aube is funded entirely by sponsors.
If aube is saving your team install time or CI minutes, please consider sponsoring at en.dev. Individual and company sponsorships are what keep the project fast, free, and independent.