Internal CodeArtifact package does not allow publishing versions already present in external public sources
AWS CodeArtifact packages with an internal or unknown origin are evaluated for their package origin controls. The check identifies packages where the upstream setting allows ingesting versions from external or upstream repositories.
Risk
Allowing upstream on internal packages enables dependency confusion: public repos can supply higher versions to builds, leading to malicious code execution and package tampering. This threatens integrity, exposes secrets and data (confidentiality), and may disrupt pipelines and services (availability).
Run this check with Prowler
Run in Prowler Cloudprowler aws --checks codeartifact_packages_external_public_publishing_disabledRecommendation
Enforce Package Origin Controls so internal packages use upstream=BLOCK and only trusted publish paths. Apply least privilege with package groups and private namespaces, pin versions, and prefer private endpoints. Add artifact signing and CI isolation, and monitor package events for unexpected source changes.
Remediation
CLI
aws codeartifact put-package-origin-configuration --domain <DOMAIN> --repository <REPOSITORY> --format <FORMAT> --package <PACKAGE_NAME> --restrictions publish=ALLOW,upstream=BLOCKOther
Check Code
from prowler.lib.check.models import Check, Check_Report_AWS
from prowler.providers.aws.services.codeartifact.codeartifact_client import (
codeartifact_client,
)
from prowler.providers.aws.services.codeartifact.codeartifact_service import (
OriginInformationValues,
RestrictionValues,
)
class codeartifact_packages_external_public_publishing_disabled(Check):
def execute(self):
findings = []
for repository in codeartifact_client.repositories.values():
for package in repository.packages:
report = Check_Report_AWS(metadata=self.metadata(), resource=repository)
report.resource_id = f"{repository.domain_name}/{package.name}"
report.resource_arn = f"{repository.arn}/{package.namespace + ':' if package.namespace else ''}{package.name}"
if package.latest_version.origin.origin_type in (
OriginInformationValues.INTERNAL,
OriginInformationValues.UNKNOWN,
):
if (
package.origin_configuration.restrictions.upstream
== RestrictionValues.ALLOW
):
report.status = "FAIL"
report.status_extended = f"Internal package {package.name} is vulnerable to dependency confusion in repository {repository.domain_name}."
else:
report.status = "PASS"
report.status_extended = f"Internal package {package.name} is not vulnerable to dependency confusion in repository {repository.domain_name}."
findings.append(report)
return findingsReferences
- https://noise.getoto.net/2022/07/15/tighten-your-package-security-with-codeartifact-package-origin-control-toolkit/
- https://docs.aws.amazon.com/codeartifact/latest/ug/package-origin-controls.html
- https://newstar.cloud/blog/improve-the-security-of-your-software-supply-chain-with-amazon-codeartifact-package-group-configuration/
- https://zego.engineering/dependency-confusion-in-aws-codeartifact-86b9ff68963d