Artifact Keeper 1.5.0
Highlights
Know who did what. A functional audit log now records security-relevant events (artifact upload/download/delete, user/role/repository changes, and permission denials), queryable through a new admin endpoint with filters and pagination.
Know who pulled what, and from where. Every download across all 40+ formats now captures the real client IP (proxy-aware) and the user, into per-download telemetry with new admin views by IP and by user. This also closes a trusted-proxy header-spoofing gap on the download path.
Answer "who is affected by this CVE?" New CVE blast-radius endpoints join a vulnerability to the users and IPs that actually downloaded the affected artifact, plus a per-repository exposure classification that flags "public repo, everyone exposed" without enumerating unbounded populations.
First-class artifact versioning. Opt-in per-repository versioning for generic and mlmodel artifacts. Re-uploading to an existing path appends an immutable revision instead of overwriting, with a version selector on download and full revision history. Off by default; existing artifacts and release-immutability are unaffected.
Tighter access control. Repository RBAC now enforces action-specific permissions (a read-only grantee can no longer write or delete), and sensitive admin surfaces (dependency-track, CVE status, webhook creation, scan triggers, cache invalidation) are gated to admins, with each denial recorded in the audit log.
A coherent SSRF story. Internal-service clients reach their private-network endpoints through a dedicated trusted path, webhook and SSO fetches honor their private-IP toggles at connect time, and attacker-influenceable upstream/proxy paths stay fail-closed. Cloud-metadata, loopback, and link-local addresses remain hard-blocked everywhere.
Security housekeeping. The Trivy code-scanning backlog was burned down (scanner tool bumps on a patched Go toolchain, base-image refresh, and cache-busting so OS errata re-resolve on every publish), and filesystem/incus scans are back to first-class Trivy coverage on the hardened CLI-free image.
Upgrade notes
- New audit-log and download-telemetry tables are populated by the included migrations; no manual action required.
- Artifact versioning is opt-in per repository (
versioning_enabled), defaults off. Turning it on changes re-upload behavior from overwrite to append-revision for that repo. - If you previously hit the #2354 SSRF over-block on private-network scanner adapters or toggle-enabled webhook/SSO targets, this release resolves it. Review
WEBHOOK_ALLOW_PRIVATE_IPS/SSO_ALLOW_PRIVATE_IPSif you rely on private targets.
Full detail for every item is in CHANGELOG.md under 1.5.0. The complete PR-by-PR breakdown is below.
What's Changed
- ci: add docs-only shim workflow for path-filtered required checks by @brandonrc in #2379
- docs(changelog): reconstruct 1.2.1 through 1.4.1 from GitHub Releases by @brandonrc in #2375
- ci(release): require a CHANGELOG entry for the release version; add RELEASING.md by @brandonrc in #2377
- feat(audit): functional audit log — emit events + admin query endpoint (#2366) by @brandonrc in #2373
- feat(rpm): Phase-1 proxy hardening — SSRF connect-time IP check, RPM cache classification, content integrity, mirrorlist rejection by @brandonrc in #2354
- docs(changelog): record 1.5.0 Unreleased entries (audit log, RPM + private-IP caveat) by @brandonrc in #2381
- feat(telemetry): capture real client IP + user for downloads across all formats by @brandonrc in #2384
- feat(scanner): route filesystem & incus scans through the scanner-adapter by @brandonrc in #2387
- feat(security): CVE blast-radius — users who downloaded a vulnerable artifact + per-repo access exposure by @brandonrc in #2388
- feat(artifacts): first-class versioning for generic/mlmodel artifacts (retain history, no overwrite) by @brandonrc in #2385
- security: burn down Trivy code-scanning CVE backlog (scanner bumps, Go 1.26.5, base refresh, cache-bust) by @brandonrc in #2393
- fix(telemetry): record download statistics for virtual content serves via /artifacts/{path} by @brandonrc in #2396
- fix(scanner): exempt operator-configured internal-service clients from the connect-time SSRF private-IP gate by @brandonrc in #2395
- fix(authz): action-specific write/delete gate on generic REST + OCI artifact paths (#2321 G2) by @brandonrc in #2399
- fix(authz): deny-by-default admin gates for dependency-track, CVE-status, webhook-create, scan-trigger, cache-invalidate (#2321) by @brandonrc in #2400
- feat(audit): embed actor username in the admin audit response by @brandonrc in #2401
- fix(versions): serialize uploaded_by in ArtifactVersionResponse by @brandonrc in #2402
- fix(telemetry): record downloads on download_artifact virtual-member-local branch by @brandonrc in #2403
- fix(ssrf): honor per-target private-IP toggles for webhook and SSO connect-time checks by @brandonrc in #2404
- fix: de-duplicate path/query param name on downloads by-ip/by-user by @brandonrc in #2409
- chore(release): bump version to 1.5.0 by @brandonrc in #2411
Full Changelog: v1.4.2...v1.5.0