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.
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-implDefaultModelValidator) /isValidId(compat) check each character individually and.is an allowed character, so the strings.and..are accepted as groupId/artifactIdvalidateVersiononly bans the filesystem metacharacters\/:"<>|?*, so a version of..passes toothese values are used verbatim as directory segments when an artifact is mapped to its local repository path (
groupId-as-dirs/artifactId/version/artifactId-version.extin the default layout, seeDefaultRepositoryLayout.pathOf), so an artifactId or version of..is a literal path-traversal segment.example: this dependency passes STRICT validation
and maps to the local-repository path
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..evilbecomesorg//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, andvalidateVersion, in both the maven-impl and compat maven-model-builder validators, with regression tests in each module.