Skip to content

Commit 119fa73

Browse files
authored
fix: Replace the unsafe Yaml instantiation in ReferenceVisitor.getYaml() with SafeConstructor (#2344)
1 parent c81c557 commit 119fa73

2 files changed

Lines changed: 13 additions & 6 deletions

File tree

modules/swagger-parser-v3/src/main/java/io/swagger/v3/parser/reference/ReferenceVisitor.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@
1919
import io.swagger.v3.parser.util.RemoteUrl;
2020
import org.apache.commons.lang3.StringUtils;
2121
import org.slf4j.LoggerFactory;
22+
import org.yaml.snakeyaml.DumperOptions;
2223
import org.yaml.snakeyaml.LoaderOptions;
2324
import org.yaml.snakeyaml.Yaml;
25+
import org.yaml.snakeyaml.constructor.SafeConstructor;
26+
import org.yaml.snakeyaml.representer.Representer;
2427

2528
import java.util.HashMap;
2629
import java.util.HashSet;
@@ -319,15 +322,13 @@ public JsonNode deserializeIntoTree(String content) throws Exception {
319322
}
320323

321324
private Yaml getYaml() {
322-
Yaml yaml;
323325
String yamlCodePoints = System.getProperty("maxYamlCodePoints");
324326
if (yamlCodePoints != null && !yamlCodePoints.isEmpty() && StringUtils.isNumeric(yamlCodePoints)) {
325-
loaderOptions.setCodePointLimit(Integer.parseInt(yamlCodePoints));
326-
yaml = new Yaml(loaderOptions);
327-
} else {
328-
yaml = new Yaml();
327+
LoaderOptions opts = new LoaderOptions();
328+
opts.setCodePointLimit(Integer.parseInt(yamlCodePoints));
329+
return new Yaml(new SafeConstructor(opts), new Representer(new DumperOptions()), new DumperOptions(), opts);
329330
}
330-
return yaml;
331+
return new Yaml(new SafeConstructor(new LoaderOptions()));
331332
}
332333

333334
public JsonNode parse(String absoluteUri, List<AuthorizationValue> auths) throws Exception {

modules/swagger-parser-v3/src/test/java/io/swagger/v3/parser/reference/ReferenceVisitorTest.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,12 @@ public void largeFileShouldBeParsedByJacksonLibraryWhenCodeLimitIsSet() throws E
2828
System.clearProperty("maxYamlCodePoints");
2929
}
3030

31+
@Test(expectedExceptions = YAMLException.class)
32+
public void unsafeYamlTagShouldBeRejected() throws Exception {
33+
ReferenceVisitor visitor = new ReferenceVisitor(null, null, null, null);
34+
visitor.deserializeIntoTree("!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[]]]");
35+
}
36+
3137
@Test
3238
public void largeFileShouldNotBeParsedByJacksonLibraryWhenCodeLimitIsNotSet() throws Exception {
3339
ReferenceVisitor visitor = new ReferenceVisitor(null, null, null, null);

0 commit comments

Comments
 (0)