This is an automated email from the ASF dual-hosted git repository. Cole-Greer pushed a commit to branch 3.7-dependencies in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit fd3a0af184697b652c8042746a8683fbea1a94ac Author: Cole Greer <[email protected]> AuthorDate: Wed Jul 29 14:07:07 2026 -0700 Bump jackson-databind (shaded) to 2.18.9 Upgrades the jackson-databind dependency pinned in gremlin-shaded from 2.15.2 to 2.18.9 to address multiple CVEs accumulated across the 2.15.x- 2.18.x line (deserialization gadgets, DoS, SSRF-via-DNS-lookup, etc.). Required compile fixes for removed/changed Jackson APIs: - GraphSONSerializerProvider: implement the new abstract withCaches(CacheProvider) method added in jackson-databind 2.16 (databind#2502). TinkerPop never configures a custom CacheProvider, so this is effectively inert at runtime, but is required to satisfy the abstract contract; implementation mirrors Jackson's own DefaultSerializerProvider.Impl pattern. - GraphSONTypeDeserializer: replace the removed DeserializationContext.mappingException(String) (deprecated since 2.9, physically removed by 2.18) with the documented replacement reportInputMismatch(JavaType, String). - GraphSONStreamConstraintsTest: update three assertions to match Jackson's reworded StreamConstraintsException messages (behavior unchanged, only message text changed upstream). Also required bumping maven-shade-plugin 3.4.1 -> 3.6.2 in the root pom, since 3.4.1's bundled ASM version cannot parse the Java 21 multi-release JAR classes shipped in jackson-core 2.18.9, causing the gremlin-shaded shade step to fail. No relocation-logic or default- behavior changes exist between 3.4.1 and 3.6.2 for TinkerPop's use case (verified against upstream release notes). Breaking change: jackson-databind 2.18.9 hardens InetAddress deserialization to reject hostname strings (only literal IP addresses are accepted), closing a DNS-lookup-on-untrusted-input vector (jackson-databind#6058, related to CVE-2026-54514 for the sibling InetSocketAddress type). This has no configurable opt-out upstream. Rather than reintroducing hostname resolution via a custom deserializer, this change adopts Jackson's restriction as-is, since Gremlin Server's threat model should not assume GraphSON input is trusted enough to justify DNS lookups during deserialization. Updated InetAddress test fixtures/model data to use literal IP addresses instead of hostnames, and documented the break in docs/src/upgrade/release-3.7.x.asciidoc and CHANGELOG.asciidoc. Deferred to a follow-up: Jackson dependencies pulled in transitively via hadoop-gremlin, spark-gremlin, and sparql-gremlin (Hadoop/Spark/ Jena) still resolve to their own older Jackson versions independently and were not addressed here. Assisted-by: Kiro:claude-sonnet-5 [code] [execute_bash] [fs_write] [grep] --- CHANGELOG.asciidoc | 1 + docs/src/dev/io/graphson.asciidoc | 4 ++-- docs/src/upgrade/release-3.7.x.asciidoc | 12 ++++++++++++ gremlin-console/src/main/static/NOTICE | 2 +- .../structure/io/graphson/GraphSONSerializerProvider.java | 11 +++++++++++ .../structure/io/graphson/GraphSONTypeDeserializer.java | 4 ++-- .../structure/io/graphson/GraphSONStreamConstraintsTest.java | 12 ++++++------ gremlin-driver/src/main/static/NOTICE | 2 +- gremlin-server/src/main/static/NOTICE | 2 +- gremlin-shaded/pom.xml | 2 +- gremlin-shaded/src/main/static/NOTICE | 2 +- .../org/apache/tinkerpop/gremlin/structure/io/Model.java | 2 +- .../tinkerpop/gremlin/util/ser/AbstractRoundTripTest.java | 2 +- .../gremlin/structure/io/graphson/inetaddress-v2.json | 2 +- .../gremlin/structure/io/graphson/inetaddress-v3.json | 2 +- pom.xml | 2 +- 16 files changed, 44 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index b1824b0b80..fdd3ad8631 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -36,6 +36,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima * Allowed float literals without a leading digit (e.g. `.5`, `.5f`, `.5d`) in the Gremlin grammar to better match Groovy. * Fixed conjoin has incorrect null handling. * Bump Netty to 4.1.136. +* Bumped `jackson-databind` to 2.18.9. `InetAddress` values in GraphSON must now be literal IP addresses as hostnames are no longer resolved during deserialization. *(breaking)* * Removed the Mono dependency from the `gremlin-dotnet` build/release process, using `dotnet pack`/`dotnet nuget push` instead of `mono nuget.exe`. * Expanded `gremlin-python` CI matrix to test against Python 3.9, 3.10, 3.11, 3.12, and 3.13. * Add Node 26 support for `gremlin-javascript` and `gremlint`. diff --git a/docs/src/dev/io/graphson.asciidoc b/docs/src/dev/io/graphson.asciidoc index 5b500c0118..a4dd40a1a4 100644 --- a/docs/src/dev/io/graphson.asciidoc +++ b/docs/src/dev/io/graphson.asciidoc @@ -3369,7 +3369,7 @@ The following example is a `Duration` of five days. ---- { "@type" : "gx:InetAddress", - "@value" : "localhost" + "@value" : "127.0.0.1" } ---- @@ -5738,7 +5738,7 @@ The following example is a `Duration` of five days. ---- { "@type" : "gx:InetAddress", - "@value" : "localhost" + "@value" : "127.0.0.1" } ---- diff --git a/docs/src/upgrade/release-3.7.x.asciidoc b/docs/src/upgrade/release-3.7.x.asciidoc index 4fa1a36cc7..4fc6ccc3d4 100644 --- a/docs/src/upgrade/release-3.7.x.asciidoc +++ b/docs/src/upgrade/release-3.7.x.asciidoc @@ -119,6 +119,18 @@ removed in 4.0.0. This deprecation applies across all Gremlin Language Variants. See: link:https://issues.apache.org/jira/browse/TINKERPOP-3042[TINKERPOP-3042] +==== InetAddress GraphSON Deserialization No Longer Resolves Hostnames + +TinkerPop's Jackson dependency was upgraded to jackson-databind 2.18.9 to address a number of CVEs. As part of that +upgrade, Jackson changed how it deserializes `java.net.InetAddress` values from GraphSON, it will no longer perform a +DNS lookup to resolve a hostname string (e.g. `"localhost"`, `"example.com"`) into an `InetAddress`. Only literal IPv4 +or IPv6 address strings (e.g. `"127.0.0.1"`, `"::1"`) are now accepted, anything else fails deserialization with an +error such as `Not a valid IP address string literal`. + +Applications that store or transmit `InetAddress` values via GraphSON (as a vertex/edge property, or as a bound +Gremlin parameter) must use literal IP address strings going forward. Existing serialized data containing hostname +strings will fail to deserialize after upgrading and will need to be migrated to literal IP addresses. + == TinkerPop 3.7.6 *Release Date: April 1, 2026* diff --git a/gremlin-console/src/main/static/NOTICE b/gremlin-console/src/main/static/NOTICE index 3e2a2b66e1..3e64f3ac3d 100644 --- a/gremlin-console/src/main/static/NOTICE +++ b/gremlin-console/src/main/static/NOTICE @@ -54,7 +54,7 @@ HPPC borrowed code, ideas or both from: (Apache license) ------------------------------------------------------------------------ -Jackson-Databind, Jackson-Annotation and Jackson-Core 2.15.2 (Included through gremlin-shaded) +Jackson-Databind, Jackson-Annotation and Jackson-Core 2.18.9 (Included through gremlin-shaded) ------------------------------------------------------------------------ It was originally written by Tatu Saloranta ([email protected]), and has been in development since 2007. diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializerProvider.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializerProvider.java index fc5810bdfd..8603116a28 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializerProvider.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONSerializerProvider.java @@ -21,6 +21,7 @@ package org.apache.tinkerpop.gremlin.structure.io.graphson; import org.apache.tinkerpop.shaded.jackson.databind.JsonSerializer; import org.apache.tinkerpop.shaded.jackson.databind.SerializationConfig; import org.apache.tinkerpop.shaded.jackson.databind.SerializerProvider; +import org.apache.tinkerpop.shaded.jackson.databind.cfg.CacheProvider; import org.apache.tinkerpop.shaded.jackson.databind.ser.DefaultSerializerProvider; import org.apache.tinkerpop.shaded.jackson.databind.ser.SerializerFactory; import org.apache.tinkerpop.shaded.jackson.databind.ser.std.ToStringSerializer; @@ -55,6 +56,11 @@ final class GraphSONSerializerProvider extends DefaultSerializerProvider { this.unknownTypeSerializer = unknownTypeSerializer; } + protected GraphSONSerializerProvider(final GraphSONSerializerProvider src, final CacheProvider cacheProvider) { + super(src, cacheProvider); + this.unknownTypeSerializer = src.unknownTypeSerializer; + } + @Override public JsonSerializer<Object> getUnknownTypeSerializer(final Class<?> aClass) { return unknownTypeSerializer; @@ -69,4 +75,9 @@ final class GraphSONSerializerProvider extends DefaultSerializerProvider { // that has a GraphSONVersion. return new GraphSONSerializerProvider(this, config, jsf, unknownTypeSerializer); } + + @Override + public GraphSONSerializerProvider withCaches(final CacheProvider cacheProvider) { + return new GraphSONSerializerProvider(this, cacheProvider); + } } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTypeDeserializer.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTypeDeserializer.java index 5fbf839b15..4c82932118 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTypeDeserializer.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONTypeDeserializer.java @@ -184,14 +184,14 @@ public class GraphSONTypeDeserializer extends TypeDeserializerBase { // detected the type pattern entirely but the Map contained other properties // For now we error out because we assume that pattern is *only* reserved to // typed values. - throw deserializationContext.mappingException("Detected the type pattern in the JSON payload " + + deserializationContext.reportInputMismatch(baseType, "Detected the type pattern in the JSON payload " + "but the map containing the types and values contains other fields. This is not " + "allowed by the deserializer."); } } } } catch (Exception e) { - throw deserializationContext.mappingException("Could not deserialize the JSON value as required. Nested exception: " + e.toString()); + deserializationContext.reportInputMismatch(baseType, "Could not deserialize the JSON value as required. Nested exception: " + e.toString()); } // Type pattern wasn't detected, however, diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONStreamConstraintsTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONStreamConstraintsTest.java index 683776e74a..4f96f14f1f 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONStreamConstraintsTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONStreamConstraintsTest.java @@ -48,8 +48,8 @@ public class GraphSONStreamConstraintsTest extends AbstractGraphSONTest{ serializeDeserializeAuto(mapper, serializedData); }); assertTrue("Expected StreamConstraintsException for exceeding max number length, found: "+exception.getMessage(), - exception.getMessage().contains("org.apache.tinkerpop.shaded.jackson.core.exc.StreamConstraintsException: Number length") - && exception.getMessage().contains("exceeds the maximum length (2)")); + exception.getMessage().contains("org.apache.tinkerpop.shaded.jackson.core.exc.StreamConstraintsException: Number value length") + && exception.getMessage().contains("exceeds the maximum allowed (2, from `StreamReadConstraints.getMaxNumberLength()`)")); } @Test @@ -66,8 +66,8 @@ public class GraphSONStreamConstraintsTest extends AbstractGraphSONTest{ serializeDeserializeAuto(mapper, serializedData); }); assertTrue("Expected StreamConstraintsException for exceeding max String length, found: "+exception.getMessage(), - exception.getMessage().contains("String length") - && exception.getMessage().contains("exceeds the maximum length (20)")); + exception.getMessage().contains("String value length") + && exception.getMessage().contains("exceeds the maximum allowed (20, from `StreamReadConstraints.getMaxStringLength()`)")); } @Test @@ -87,7 +87,7 @@ public class GraphSONStreamConstraintsTest extends AbstractGraphSONTest{ serializeDeserializeAuto(mapper, serializedData); }); assertTrue("Expected StreamConstraintsException for exceeding max nesting depth, found: "+exception.getMessage(), - exception.getMessage().contains("org.apache.tinkerpop.shaded.jackson.core.exc.StreamConstraintsException: Depth") - && exception.getMessage().contains("exceeds the maximum allowed nesting depth (1)")); + exception.getMessage().contains("org.apache.tinkerpop.shaded.jackson.core.exc.StreamConstraintsException: Document nesting depth") + && exception.getMessage().contains("exceeds the maximum allowed (1, from `StreamReadConstraints.getMaxNestingDepth()`)")); } } diff --git a/gremlin-driver/src/main/static/NOTICE b/gremlin-driver/src/main/static/NOTICE index 81c56e1758..4615fdcb3b 100644 --- a/gremlin-driver/src/main/static/NOTICE +++ b/gremlin-driver/src/main/static/NOTICE @@ -17,7 +17,7 @@ HPPC borrowed code, ideas or both from: (Apache license) ------------------------------------------------------------------------ -Jackson-Databind, Jackson-Annotation and Jackson-Core 2.15.2 (Included through gremlin-shaded) +Jackson-Databind, Jackson-Annotation and Jackson-Core 2.18.9 (Included through gremlin-shaded) ------------------------------------------------------------------------ It was originally written by Tatu Saloranta ([email protected]), and has been in development since 2007. diff --git a/gremlin-server/src/main/static/NOTICE b/gremlin-server/src/main/static/NOTICE index 5209d71d80..7874e0423c 100644 --- a/gremlin-server/src/main/static/NOTICE +++ b/gremlin-server/src/main/static/NOTICE @@ -41,7 +41,7 @@ HPPC borrowed code, ideas or both from: (Apache license) ------------------------------------------------------------------------ -Jackson-Databind, Jackson-Annotation and Jackson-Core 2.15.2 (Included through gremlin-shaded) +Jackson-Databind, Jackson-Annotation and Jackson-Core 2.18.9 (Included through gremlin-shaded) ------------------------------------------------------------------------ It was originally written by Tatu Saloranta ([email protected]), and has been in development since 2007. diff --git a/gremlin-shaded/pom.xml b/gremlin-shaded/pom.xml index d87bfb1f55..e38771295b 100644 --- a/gremlin-shaded/pom.xml +++ b/gremlin-shaded/pom.xml @@ -48,7 +48,7 @@ limitations under the License. <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> - <version>2.15.2</version> + <version>2.18.9</version> <optional>true</optional> </dependency> </dependencies> diff --git a/gremlin-shaded/src/main/static/NOTICE b/gremlin-shaded/src/main/static/NOTICE index 4ece27698f..8765673177 100644 --- a/gremlin-shaded/src/main/static/NOTICE +++ b/gremlin-shaded/src/main/static/NOTICE @@ -5,7 +5,7 @@ This product includes software developed at The Apache Software Foundation (http://www.apache.org/). ------------------------------------------------------------------------ -Jackson-Databind, Jackson-Annotation and Jackson-Core 2.15.2 +Jackson-Databind, Jackson-Annotation and Jackson-Core 2.18.9 ------------------------------------------------------------------------ It was originally written by Tatu Saloranta ([email protected]), and has been in development since 2007. diff --git a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/Model.java b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/Model.java index 7a81678a81..d4788bd5aa 100644 --- a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/Model.java +++ b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/structure/io/Model.java @@ -217,7 +217,7 @@ public class Model { addExtendedEntry("x".charAt(0), "Char", ""); addExtendedEntry(Duration.ofDays(5), "Duration","The following example is a `Duration` of five days."); try { - addEntry("Extended", InetAddress.getByName("localhost"), "InetAddress", ""); + addEntry("Extended", InetAddress.getByName("127.0.0.1"), "InetAddress", ""); } catch (Exception ex) { throw new RuntimeException(ex); } diff --git a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/AbstractRoundTripTest.java b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/AbstractRoundTripTest.java index 2b3fdaa984..4ba4cede70 100644 --- a/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/AbstractRoundTripTest.java +++ b/gremlin-util/src/test/java/org/apache/tinkerpop/gremlin/util/ser/AbstractRoundTripTest.java @@ -205,7 +205,7 @@ public abstract class AbstractRoundTripTest { new Object[] {"Traverser", new DefaultRemoteTraverser<>("marko", 100), null}, new Object[] {"Class", Bytecode.class, null}, new Object[] {"ByteBuffer", ByteBuffer.wrap(new byte[]{ 1, 2, 3 }), null}, - new Object[] {"InetAddressV4", InetAddress.getByName("localhost"), null}, + new Object[] {"InetAddressV4", InetAddress.getByName("127.0.0.1"), null}, new Object[] {"InetAddressV6", InetAddress.getByName("::1"), null}, new Object[] {"Lambda0", Lambda.supplier("return 1"), null}, new Object[] {"Lambda1", Lambda.consumer("it"), null}, diff --git a/gremlin-util/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/inetaddress-v2.json b/gremlin-util/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/inetaddress-v2.json index fba98c0246..64196028c7 100644 --- a/gremlin-util/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/inetaddress-v2.json +++ b/gremlin-util/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/inetaddress-v2.json @@ -1,4 +1,4 @@ { "@type" : "gx:InetAddress", - "@value" : "localhost" + "@value" : "127.0.0.1" } \ No newline at end of file diff --git a/gremlin-util/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/inetaddress-v3.json b/gremlin-util/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/inetaddress-v3.json index fba98c0246..64196028c7 100644 --- a/gremlin-util/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/inetaddress-v3.json +++ b/gremlin-util/src/test/resources/org/apache/tinkerpop/gremlin/structure/io/graphson/inetaddress-v3.json @@ -1,4 +1,4 @@ { "@type" : "gx:InetAddress", - "@value" : "localhost" + "@value" : "127.0.0.1" } \ No newline at end of file diff --git a/pom.xml b/pom.xml index 434cfcd2aa..2a610af3a3 100644 --- a/pom.xml +++ b/pom.xml @@ -716,7 +716,7 @@ limitations under the License. <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> - <version>3.4.1</version> + <version>3.6.2</version> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration>
