Back to Checks
image

Duplicate aliases defined in different FROMs

image_DS-0012
Service: dockerSeverity: critical
OfficialBuilt-inVerified

Different FROMs can't have the same alias defined.

Run this check with Prowler

Run in Prowler Cloud
Run
prowler image --checks image_DS-0012

Recommendation

Change aliases to make them different

Check Code

# METADATA
# title: "Duplicate aliases defined in different FROMs"
# description: "Different FROMs can't have the same alias defined."
# scope: package
# schemas:
# - input: schema["dockerfile"]
# related_resources:
# - https://docs.docker.com/develop/develop-images/multistage-build/
# custom:
#   id: DS-0012
#   long_id: docker-no-duplicate-alias
#   aliases:
#     - AVD-DS-0012
#     - DS012
#     - no-duplicate-alias
#     - docker-no-duplicate-alias
#   severity: CRITICAL
#   recommended_action: "Change aliases to make them different"
#   input:
#     selector:
#     - type: dockerfile
#   examples: checks/docker/same_alias_in_different_froms.yaml
package builtin.dockerfile.DS012

import rego.v1

get_duplicate_alias contains output if {
	output1 := get_aliased_name[_]
	output2 := get_aliased_name[_]
	output1.arg != output2.arg

	[_, alias1] := regex.split(`\s+as\s+`, output1.arg)
	[_, alias2] := regex.split(`\s+as\s+`, output2.arg)
	alias1 == alias2
	output1.cmd.StartLine < output2.cmd.StartLine # avoid duplicates
	output := {
		"alias": alias1,
		"cmd": output1.cmd,
	}
}

get_aliased_name contains output if {
	stage := input.Stages[_]
	name := stage.Name

	cmd := stage.Commands[0]

	arg = lower(name)
	contains(arg, " as ")
	output := {
		"arg": arg,
		"cmd": cmd,
	}
}

deny contains res if {
	output := get_duplicate_alias[_]
	msg := sprintf("Duplicate aliases '%s' are found in different FROMs", [output.alias])
	res := result.new(msg, output.cmd)
}