This is an automated email from the ASF dual-hosted git repository.

oscerd pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new e565db076cf3 CAMEL-24294: enforce the typeFilters allow-list in the 
SnakeYAML TagInspector (#25285)
e565db076cf3 is described below

commit e565db076cf35070ffa5bfde559b9dab85d4cb6d
Author: Andrea Cosentino <[email protected]>
AuthorDate: Mon Aug 3 11:45:07 2026 +0200

    CAMEL-24294: enforce the typeFilters allow-list in the SnakeYAML 
TagInspector (#25285)
    
    SnakeYAMLDataFormat's TrustedTagInspector.isGlobalTagAllowed() returned 
true unconditionally, so the
    SnakeYAML 2.x TagInspector layer was effectively disabled and the 
typeFilters allow-list was enforced
    only by the getClassForName constructor override. Make the inspector 
consult the same allowTypeFilter(...)
    check so both layers enforce the configured filters.
    
    When typeFilters/unmarshalType is configured, a disallowed global tag is 
now rejected earlier (during
    composing) as a ComposerException, instead of the previous 
ConstructorException caused by an
    IllegalArgumentException from getClassForName. The set of accepted types is 
unchanged; the security
    tests and an upgrade-guide note are updated accordingly. Routes without 
typeFilters are unaffected.
    
    Co-authored-by: Claude Opus 4.8 <[email protected]>
---
 .../camel/component/snakeyaml/SnakeYAMLDataFormat.java  |  4 +++-
 .../component/snakeyaml/SnakeYAMLTypeFilterHelper.java  | 17 +++++++++--------
 .../modules/ROOT/pages/camel-4x-upgrade-guide-4_22.adoc | 12 +++++++++++-
 3 files changed, 23 insertions(+), 10 deletions(-)

diff --git 
a/components/camel-snakeyaml/src/main/java/org/apache/camel/component/snakeyaml/SnakeYAMLDataFormat.java
 
b/components/camel-snakeyaml/src/main/java/org/apache/camel/component/snakeyaml/SnakeYAMLDataFormat.java
index aca5f5b56164..1f373ce4f7e1 100644
--- 
a/components/camel-snakeyaml/src/main/java/org/apache/camel/component/snakeyaml/SnakeYAMLDataFormat.java
+++ 
b/components/camel-snakeyaml/src/main/java/org/apache/camel/component/snakeyaml/SnakeYAMLDataFormat.java
@@ -332,7 +332,9 @@ public final class SnakeYAMLDataFormat extends 
ServiceSupport implements DataFor
     final class TrustedTagInspector implements TagInspector {
         @Override
         public boolean isGlobalTagAllowed(Tag tag) {
-            return true;
+            // consult the same typeFilters allow-list as getClassForName, so 
the SnakeYAML 2.x TagInspector
+            // layer actually enforces the configured filters instead of 
allowing every global tag (CAMEL-24294)
+            return allowTypeFilter(tag.getClassName());
         }
     }
 }
diff --git 
a/components/camel-snakeyaml/src/test/java/org/apache/camel/component/snakeyaml/SnakeYAMLTypeFilterHelper.java
 
b/components/camel-snakeyaml/src/test/java/org/apache/camel/component/snakeyaml/SnakeYAMLTypeFilterHelper.java
index cb2b6e4e9c01..9ed02ad158bc 100644
--- 
a/components/camel-snakeyaml/src/test/java/org/apache/camel/component/snakeyaml/SnakeYAMLTypeFilterHelper.java
+++ 
b/components/camel-snakeyaml/src/test/java/org/apache/camel/component/snakeyaml/SnakeYAMLTypeFilterHelper.java
@@ -21,6 +21,7 @@ import org.apache.camel.ProducerTemplate;
 import org.apache.camel.component.snakeyaml.model.RexPojo;
 import org.apache.camel.component.snakeyaml.model.TestPojo;
 import org.apache.camel.component.snakeyaml.model.UnsafePojo;
+import org.yaml.snakeyaml.composer.ComposerException;
 import org.yaml.snakeyaml.constructor.ConstructorException;
 
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
@@ -57,10 +58,11 @@ public final class SnakeYAMLTypeFilterHelper {
                         
"!!org.apache.camel.component.snakeyaml.model.UnsafePojo {name: Camel}"),
                 "As SnakeYAML filters class is can unmarshall, UnsafePojo 
should not be allowed");
 
-        // Wrapped by SnakeYAML
-        assertTrue(ex.getCause() instanceof ConstructorException);
-        // Thrown by SnakeYAMLDataFormat
-        assertTrue(ex.getCause().getCause() instanceof 
IllegalArgumentException);
+        // Rejected by the SnakeYAML TagInspector allow-list during composing 
(CAMEL-24294), before
+        // getClassForName would run - so the failure is a ComposerException, 
not the previous
+        // ConstructorException -> IllegalArgumentException chain.
+        assertTrue(ex.getCause() instanceof ComposerException);
+        assertTrue(ex.getCause().getMessage().contains("UnsafePojo"));
     }
 
     static void testTypeConstructorFromDefinition(ProducerTemplate template) {
@@ -88,10 +90,9 @@ public final class SnakeYAMLTypeFilterHelper {
                         
"!!org.apache.camel.component.snakeyaml.model.UnsafePojo {name: Camel}"),
                 "As SnakeYAML filters class is can unmarshall, UnsafePojo 
should not be allowed");
 
-        // Wrapped by SnakeYAML
-        assertTrue(ex.getCause() instanceof ConstructorException);
-        // Thrown by SnakeYAMLDataFormat
-        assertTrue(ex.getCause().getCause() instanceof 
IllegalArgumentException);
+        // Rejected by the SnakeYAML TagInspector allow-list during composing 
(CAMEL-24294)
+        assertTrue(ex.getCause() instanceof ComposerException);
+        assertTrue(ex.getCause().getMessage().contains("UnsafePojo"));
     }
 
     static void testAllowAllConstructor(ProducerTemplate template) {
diff --git 
a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_22.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_22.adoc
index cababaade832..79a5b665050d 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_22.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_22.adoc
@@ -1529,6 +1529,16 @@ data format and the iterator/splitter modes. The full, 
unmodified entry name rem
 so routes that intentionally recreate the archive's directory structure keep 
working — read it
 from `CamelTarFileEntryName` for tar and from `zipFileName` for zip instead of 
`CamelFileName`.
 
+=== camel-snakeyaml - typeFilters are now also enforced by the SnakeYAML 
TagInspector
+
+When `typeFilters` (or `unmarshalType`) is configured, the allow-list is now 
also enforced by the
+SnakeYAML 2.x `TagInspector` layer, not only by the `getClassForName` 
constructor override. A YAML
+document that references a disallowed global tag is therefore rejected 
earlier, during composing, and
+surfaces as an `org.yaml.snakeyaml.composer.ComposerException` (`"Global tag 
is not allowed: ..."`)
+instead of the previous `ConstructorException` caused by an 
`IllegalArgumentException`. The set of
+accepted types is unchanged; only the exception raised for a rejected type 
differs. Routes that do not
+configure `typeFilters` are unaffected.
+
 === camel-jfr
 
 `camel-jfr` can now also emit JFR events during message routing, in addition 
to the
@@ -1541,4 +1551,4 @@ read once while the `CamelContext` initializes and cannot 
be changed afterwards.
 
 `org.apache.camel.spi.StartupStepRecorder` gained the default methods
 `isRuntimeEnabled()` and `setRuntimeEnabled(boolean)`. Both have no-op 
defaults, so
-existing implementations continue to compile and behave as before.
\ No newline at end of file
+existing implementations continue to compile and behave as before.

Reply via email to