Skip to content

Support dependency-cooldowns / minimum-artifact-age to mitigate short-lived supply chain attacks #3757

@rtyley

Description

@rtyley

See:

  • Dependabot supports configuration of a minimum package age - GitHub Blog, July 2025 - it's now very simple to configure Dependabot with a cooldown time period - a feature we don't yet have in Scala Steward
  • We should all be using dependency cooldowns - yossarian, November 2025 - highlights that the attack-window on many open source supply chain attacks is often only a few days - if an artifact is more than a week old, and has not been flagged by a supply chain security vendor, it is more likely to be safe to apply.
  • Example attacks on Maven Central artifacts
    • Typosquatting Attack on Jackson : Typosquatted domain fasterxml.org was registered on 17th December 2025, artifact published 19th December, analysed & reported by Aikido Security on 25th December. "...reported the domain to GoDaddy, and the package to Maven Central. The package was taken down within 1.5 hours.". Window of vulnerability: 6 days
    • Typosquatting Attack on Maven & Jenkins plugins - Window of vulnerability: 10 days
    • Typosquatting Attack on scribejava-core - Window of vulnerability: January 2024 to March 2025, over 1 year
    • Note - the above are all typosquatting attacks, so would have not involved a dependency-update tool like Scala Steward - these are essentially new artifacts that are accidentally being manually chosen by devs. But perhaps they can give us some idea of how long malicious artifacts might persist in Maven Central before being spotted. In my cursory googling, I was not actually able to find an example of a malicious Java artifact being published as an update for a legitimate library - let me know when you find one!

For Scala Steward, this issue is a revisit of a few old issues/PRs:

Sources of artifact-age data

Unfortunately, Maven does not currently encode a way to tell an artifact's publication date:

https://stackoverflow.com/q/69790966/438886

Questions

  • How do we want to configure this? What should the configuration look like?

GitHub's Dependabot config for comparison

Not implying we'd want to reproduce every option here, just for information:

updates:
  - package-ecosystem: "pip"
    directory: "/"
    schedule:
      interval: "daily"
    cooldown:
      default-days: 5
      semver-major-days: 30
      semver-minor-days: 7
      semver-patch-days: 3
      include:
        - "requests"
        - "numpy"
        - "pandas*"
        - "django"
      exclude:
        - "pandas"

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions