Headline
CVE-2022-23506: Merge pull request from GHSA-wqq8-664f-54hh · spinnaker/rosco@e80cfaa
Spinnaker is an open source, multi-cloud continuous delivery platform for releasing software changes, and Spinnaker’s Rosco microservice produces machine images. Rosco prior to versions 1.29.2, 1.28.4, and 1.27.3 does not property mask secrets generated via packer builds. This can lead to exposure of sensitive AWS credentials in packer log files. Versions 1.29.2, 1.28.4, and 1.27.3 of Rosco contain fixes for this issue. A workaround is available. It’s recommended to use short lived credentials via role assumption and IAM profiles. Additionally, credentials can be set in /home/spinnaker/.aws/credentials
and /home/spinnaker/.aws/config
as a volume mount for Rosco pods vs. setting credentials in roscos bake config properties. Last even with those it’s recommend to use IAM Roles vs. long lived credentials. This drastically mitigates the risk of credentials exposure. If users have used static credentials, it’s recommended to purge any bake logs for AWS, evaluate whether AWS_ACCESS_KEY, SECRET_KEY and/or other sensitive data has been introduced in log files and bake job logs. Then, rotate these credentials and evaluate potential improper use of those credentials.
@@ -75,18 +75,19 @@ class LocalJobFriendlyPackerCommandFactorySpec extends Specification implements when: def packerCommand = packerCommandFactory.buildPackerCommand("", parameterMap, null, “”) def jobRequest = new JobRequest(tokenizedCommand: packerCommand, maskedParameters: maskedPackerParameters, jobId: SOME_UUID) def commandLine = new CommandLine(jobRequest.tokenizedCommand[0]) def arguments = (String []) Arrays.copyOfRange(jobRequest.tokenizedCommand.toArray(), 1, jobRequest.tokenizedCommand.size()) def maskedTokenizedCommand = jobRequest.maskedTokenizedCommand def commandLine = new CommandLine(maskedTokenizedCommand[0]) def arguments = (String []) Arrays.copyOfRange(maskedTokenizedCommand.toArray(), 1, maskedTokenizedCommand.size()) commandLine.addArguments(arguments, false) def g = commandLine.toString() def cmdLineList = commandLine.toStrings().toList()
then: cmdLineList == expectedCommandLine
where: parameterMap | maskedPackerParameters | expectedCommandLine [packages: “package1 package2”] | [] | ["packer", "build", "-color=false", "-var", “packages=package1 package2”] parameterMap | maskedPackerParameters | expectedCommandLine [packages: “package1 package2”] | [] | ["packer", "build", "-color=false", "-var", “packages=package1 package2”] [packages: "package1 package2", secret: “mysecret”] | [“secret”] | ["packer", "build", "-color=false", "-var", "packages=package1 package2", "-var", “secret=******”] } }