Skip to content

model validator accepts '.' and '..' as artifactId/version, creating path-traversal segments in local repository paths #12427

Description

@jmestwa-coder

Affected version

4.1.0-SNAPSHOT (master); the compat maven-model-builder validator has the same gap.

Bug description

coordinate ids and versions equal to . or .. pass model validation:

  • isValidCoordinatesId (maven-impl DefaultModelValidator) / isValidId (compat) check each character individually and . is an allowed character, so the strings . and .. are accepted as groupId/artifactId
  • validateVersion only bans the filesystem metacharacters \/:"<>|?*, so a version of .. passes too
  • same gap in the wildcard-id variant

these values are used verbatim as directory segments when an artifact is mapped to its local repository path (groupId-as-dirs/artifactId/version/artifactId-version.ext in the default layout, see DefaultRepositoryLayout.pathOf), so an artifactId or version of .. is a literal path-traversal segment.

example: this dependency passes STRICT validation

<dependency>
  <groupId>org.example</groupId>
  <artifactId>..</artifactId>
  <version>1.0</version>
</dependency>

and maps to the local-repository path

org/example/../1.0/..-1.0.jar  ->  org/1.0/..-1.0.jar

so the .. segment escapes the coordinate directory. a dependency version of .. does the same one level down (org/example/lib/../lib-...jar -> org/example/lib-...jar). any POM in the dependency graph can carry such coordinates.

groupId on its own is not a raw-segment vector since the layout maps its dots to path separators (org..evil becomes org//evil, an empty segment rather than ..), but ./.. as a whole groupId is rejected as well for consistency.

fix in #12410: reject . and .. in the id checks, the wildcard variant, and validateVersion, in both the maven-impl and compat maven-model-builder validators, with regression tests in each module.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions