Skip to content

Commit 72f79de

Browse files
committed
Fix potential polynomial Regular Expression Denial of Service in the DataSource mechanism (GHSA-rqpx-f6rc-7hm5)
Signed-off-by: Olivier Perrin <[email protected]>
1 parent d6525f9 commit 72f79de

File tree

40 files changed

+199
-51
lines changed

40 files changed

+199
-51
lines changed

ampl-converter/src/main/java/com/powsybl/ampl/converter/AmplNetworkReader.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
package com.powsybl.ampl.converter;
99

1010
import com.powsybl.commons.datasource.ReadOnlyDataSource;
11+
import com.google.re2j.Matcher;
12+
import com.google.re2j.Pattern;
1113
import com.powsybl.commons.util.StringToIntMapper;
1214
import com.powsybl.iidm.network.*;
1315
import org.slf4j.Logger;
@@ -21,8 +23,6 @@
2123
import java.util.Map;
2224
import java.util.Objects;
2325
import java.util.function.Function;
24-
import java.util.regex.Matcher;
25-
import java.util.regex.Pattern;
2626
import java.util.stream.Collectors;
2727

2828
import static com.powsybl.ampl.converter.AmplConstants.DEFAULT_VARIANT_INDEX;

cgmes/cgmes-conversion/src/main/java/com/powsybl/cgmes/conversion/export/CgmesExportUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
*/
88
package com.powsybl.cgmes.conversion.export;
99

10+
import com.google.re2j.Pattern;
1011
import com.powsybl.cgmes.conversion.CgmesReports;
1112
import com.powsybl.cgmes.conversion.Conversion;
1213
import com.powsybl.cgmes.conversion.export.elements.RegulatingControlEq;
@@ -34,7 +35,6 @@
3435
import java.time.ZonedDateTime;
3536
import java.time.format.DateTimeFormatter;
3637
import java.util.*;
37-
import java.util.regex.Pattern;
3838

3939
import static com.powsybl.cgmes.conversion.naming.CgmesObjectReference.ref;
4040
import static com.powsybl.cgmes.conversion.naming.CgmesObjectReference.refTyped;

cgmes/cgmes-conversion/src/test/java/com/powsybl/cgmes/conversion/test/ConversionUtil.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
*/
88
package com.powsybl.cgmes.conversion.test;
99

10+
import com.google.re2j.Matcher;
11+
import com.google.re2j.Pattern;
1012
import com.powsybl.cgmes.conversion.CgmesExport;
1113
import com.powsybl.cgmes.conversion.CgmesImportPostProcessor;
1214
import com.powsybl.cgmes.conversion.Conversion;
@@ -29,8 +31,6 @@
2931
import java.nio.file.Files;
3032
import java.nio.file.Path;
3133
import java.util.*;
32-
import java.util.regex.Matcher;
33-
import java.util.regex.Pattern;
3434

3535
/**
3636
* @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}
@@ -135,6 +135,14 @@ public static long getElementCount(String xmlFile, String className) {
135135
String regex = "(<cim:" + className + " (rdf:ID=\"_|rdf:about=\"#_).*?\")>";
136136
Pattern pattern = Pattern.compile(regex);
137137
Matcher matcher = pattern.matcher(xmlFile);
138-
return matcher.results().count();
138+
return matcherCount(matcher);
139+
}
140+
141+
public static int matcherCount(Matcher matcher) {
142+
int count = 0;
143+
while (matcher.find()) {
144+
count++;
145+
}
146+
return count;
139147
}
140148
}

cgmes/cgmes-conversion/src/test/java/com/powsybl/cgmes/conversion/test/OperationalLimitConversionTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@
1515
import com.powsybl.iidm.network.*;
1616
import org.junit.jupiter.api.Test;
1717

18+
import com.google.re2j.Pattern;
19+
1820
import java.io.IOException;
1921
import java.util.*;
20-
import java.util.regex.Pattern;
2122

2223
import static com.powsybl.cgmes.conversion.test.ConversionUtil.*;
2324
import static org.junit.jupiter.api.Assertions.*;

cgmes/cgmes-conversion/src/test/java/com/powsybl/cgmes/conversion/test/export/CgmesExportTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
import com.google.common.jimfs.Configuration;
1111
import com.google.common.jimfs.Jimfs;
12+
import com.google.re2j.Matcher;
13+
import com.google.re2j.Pattern;
1214
import com.powsybl.cgmes.conformity.CgmesConformity1Catalog;
1315
import com.powsybl.cgmes.conformity.CgmesConformity1ModifiedCatalog;
1416
import com.powsybl.cgmes.conversion.CgmesExport;
@@ -36,8 +38,6 @@
3638
import java.nio.file.*;
3739
import java.util.List;
3840
import java.util.Properties;
39-
import java.util.regex.Matcher;
40-
import java.util.regex.Pattern;
4141

4242
import static com.powsybl.cgmes.conversion.test.ConversionUtil.*;
4343
import static org.junit.jupiter.api.Assertions.*;
@@ -414,7 +414,7 @@ void testModelEquipmentOperationProfile() throws IOException {
414414
String regex = "<md:Model.profile>http://entsoe.eu/CIM/EquipmentOperation/3/1</md:Model.profile>";
415415
Pattern pattern = Pattern.compile(regex);
416416
Matcher matcher = pattern.matcher(eqFile);
417-
assertEquals(1, matcher.results().count());
417+
assertEquals(1, matcherCount(matcher));
418418
}
419419
}
420420

cgmes/cgmes-conversion/src/test/java/com/powsybl/cgmes/conversion/test/export/CommonGridModelExportTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
*/
88
package com.powsybl.cgmes.conversion.test.export;
99

10+
import com.google.re2j.Pattern;
1011
import com.powsybl.cgmes.conformity.CgmesConformity1Catalog;
1112
import com.powsybl.cgmes.conversion.CgmesExport;
1213
import com.powsybl.cgmes.extensions.CgmesMetadataModels;
@@ -35,7 +36,6 @@
3536
import java.nio.file.Path;
3637
import java.time.ZonedDateTime;
3738
import java.util.*;
38-
import java.util.regex.Pattern;
3939

4040
import static com.powsybl.cgmes.conversion.test.ConversionUtil.*;
4141
import static org.junit.jupiter.api.Assertions.assertEquals;

cgmes/cgmes-conversion/src/test/java/com/powsybl/cgmes/conversion/test/export/EquipmentExportTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@
3636
import com.powsybl.iidm.network.util.BranchData;
3737
import com.powsybl.iidm.network.util.TwtData;
3838

39+
import com.google.re2j.Matcher;
40+
import com.google.re2j.Pattern;
3941
import org.apache.commons.lang3.tuple.Pair;
4042
import org.junit.jupiter.api.BeforeEach;
4143
import org.junit.jupiter.api.Test;
@@ -52,8 +54,6 @@
5254
import java.nio.file.Path;
5355
import java.nio.file.FileSystem;
5456
import java.util.*;
55-
import java.util.regex.Matcher;
56-
import java.util.regex.Pattern;
5757
import com.google.common.jimfs.Configuration;
5858
import com.google.common.jimfs.Jimfs;
5959

cgmes/cgmes-conversion/src/test/java/com/powsybl/cgmes/conversion/test/export/LegacyCommonGridModelExportTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
*/
88
package com.powsybl.cgmes.conversion.test.export;
99

10+
import com.google.re2j.Matcher;
11+
import com.google.re2j.Pattern;
1012
import com.powsybl.cgmes.conformity.CgmesConformity1ModifiedCatalog;
1113
import com.powsybl.cgmes.conversion.CgmesExport;
1214
import com.powsybl.cgmes.extensions.CgmesMetadataModels;
@@ -22,8 +24,6 @@
2224
import java.io.IOException;
2325
import java.nio.file.Files;
2426
import java.util.*;
25-
import java.util.regex.Matcher;
26-
import java.util.regex.Pattern;
2727

2828
import static com.powsybl.cgmes.conversion.Conversion.CGMES_PREFIX_ALIAS_PROPERTIES;
2929
import static org.junit.jupiter.api.Assertions.*;

cgmes/cgmes-conversion/src/test/java/com/powsybl/cgmes/conversion/test/export/StateVariablesExportTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
*/
88
package com.powsybl.cgmes.conversion.test.export;
99

10+
import com.google.re2j.Matcher;
11+
import com.google.re2j.Pattern;
1012
import com.powsybl.cgmes.conformity.*;
1113
import com.powsybl.cgmes.conversion.CgmesExport;
1214
import com.powsybl.cgmes.conversion.CgmesImport;
@@ -43,11 +45,10 @@
4345
import java.nio.file.Path;
4446
import java.util.*;
4547
import java.util.function.Consumer;
46-
import java.util.regex.Matcher;
47-
import java.util.regex.Pattern;
4848
import java.util.stream.Collectors;
4949
import java.util.stream.Stream;
5050

51+
import static com.powsybl.cgmes.conversion.test.ConversionUtil.matcherCount;
5152
import static org.junit.jupiter.api.Assertions.*;
5253

5354
/**
@@ -696,7 +697,7 @@ void testWriteBoundaryTnInTopologicalIsland() throws XMLStreamException {
696697
ReferenceTerminals.addTerminal(terminal.get());
697698
String sv = exportSvAsString(network, false);
698699
Pattern p = Pattern.compile("<cim:TopologicalIsland.TopologicalNodes rdf:resource=");
699-
assertEquals(10, p.matcher(sv).results().count());
700+
assertEquals(10, matcherCount(p.matcher(sv)));
700701
// 10 is the number of topological nodes in the island associated to buses and to dangling lines
701702
assertEquals(5, network.getBusBreakerView().getBusStream().count());
702703
assertEquals(5, network.getDanglingLineStream().count());

cgmes/cgmes-conversion/src/test/java/com/powsybl/cgmes/conversion/test/export/issues/ConsiderValidMasterRIDWithLeadingUnderscoreTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
*/
88
package com.powsybl.cgmes.conversion.test.export.issues;
99

10+
import com.google.re2j.Matcher;
11+
import com.google.re2j.Pattern;
1012
import com.powsybl.cgmes.conversion.CgmesExport;
1113
import com.powsybl.cgmes.conversion.export.CgmesExportUtil;
1214
import com.powsybl.commons.test.AbstractSerDeTest;
@@ -16,8 +18,6 @@
1618
import java.io.IOException;
1719
import java.nio.file.Files;
1820
import java.util.*;
19-
import java.util.regex.Matcher;
20-
import java.util.regex.Pattern;
2121

2222
import static org.junit.jupiter.api.Assertions.assertTrue;
2323

cgmes/cgmes-conversion/src/test/java/com/powsybl/cgmes/conversion/test/export/issues/ExportNumberMaxValueTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.powsybl.cgmes.conversion.test.export.issues;
22

3+
import com.google.re2j.Matcher;
4+
import com.google.re2j.Pattern;
35
import com.powsybl.cgmes.conversion.CgmesExport;
46
import com.powsybl.commons.test.AbstractSerDeTest;
57
import com.powsybl.iidm.network.*;
@@ -8,8 +10,6 @@
810
import java.io.IOException;
911
import java.nio.file.Files;
1012
import java.util.Properties;
11-
import java.util.regex.Matcher;
12-
import java.util.regex.Pattern;
1313

1414
import static org.junit.jupiter.api.Assertions.*;
1515

cgmes/cgmes-conversion/src/test/java/com/powsybl/cgmes/conversion/test/export/issues/ModelIdTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
*/
88
package com.powsybl.cgmes.conversion.test.export.issues;
99

10+
import com.google.re2j.Matcher;
11+
import com.google.re2j.Pattern;
1012
import com.powsybl.cgmes.conversion.CgmesExport;
1113
import com.powsybl.cgmes.extensions.CgmesMetadataModelsAdder;
1214
import com.powsybl.cgmes.model.CgmesSubset;
@@ -24,8 +26,6 @@
2426
import java.util.Map;
2527
import java.util.Properties;
2628
import java.util.Set;
27-
import java.util.regex.Matcher;
28-
import java.util.regex.Pattern;
2929

3030
import static org.junit.jupiter.api.Assertions.*;
3131

cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/CgmesNamespace.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@
99

1010
import com.google.common.collect.BiMap;
1111
import com.google.common.collect.HashBiMap;
12+
import com.google.re2j.Pattern;
1213
import com.powsybl.commons.PowsyblException;
1314
import org.slf4j.Logger;
1415
import org.slf4j.LoggerFactory;
1516

1617
import java.util.List;
1718
import java.util.Map;
1819
import java.util.Set;
19-
import java.util.regex.Pattern;
2020

2121
/**
2222
* @author Geoffroy Jamgotchian {@literal <geoffroy.jamgotchian at rte-france.com>}

cgmes/cgmes-model/src/main/java/com/powsybl/cgmes/model/triplestore/CgmesModelTripleStore.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
package com.powsybl.cgmes.model.triplestore;
1010

11+
import com.google.re2j.Matcher;
12+
import com.google.re2j.Pattern;
1113
import com.powsybl.cgmes.model.*;
1214
import com.powsybl.commons.datasource.DataSource;
1315
import com.powsybl.commons.report.ReportNode;
@@ -31,8 +33,6 @@
3133
import java.util.Objects;
3234
import java.util.Set;
3335
import java.util.function.Consumer;
34-
import java.util.regex.Matcher;
35-
import java.util.regex.Pattern;
3636

3737
import static com.powsybl.cgmes.model.CgmesNamespace.CGMES_EQ_3_OR_GREATER_PREFIX;
3838
import static com.powsybl.cgmes.model.CgmesNamespace.CIM_100_EQ_PROFILE;

commons/pom.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@
5656
<groupId>com.google.guava</groupId>
5757
<artifactId>guava</artifactId>
5858
</dependency>
59+
<dependency>
60+
<groupId>com.google.re2j</groupId>
61+
<artifactId>re2j</artifactId>
62+
</dependency>
5963
<dependency>
6064
<groupId>com.univocity</groupId>
6165
<artifactId>univocity-parsers</artifactId>
@@ -123,6 +127,11 @@
123127
<artifactId>jimfs</artifactId>
124128
<scope>test</scope>
125129
</dependency>
130+
<dependency>
131+
<groupId>org.awaitility</groupId>
132+
<artifactId>awaitility</artifactId>
133+
<scope>test</scope>
134+
</dependency>
126135
<dependency>
127136
<groupId>org.junit.jupiter</groupId>
128137
<artifactId>junit-jupiter</artifactId>

commons/src/main/java/com/powsybl/commons/datasource/DirectoryDataSource.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@
77
*/
88
package com.powsybl.commons.datasource;
99

10+
import com.google.re2j.Pattern;
11+
1012
import java.io.IOException;
1113
import java.io.InputStream;
1214
import java.io.OutputStream;
1315
import java.nio.file.Files;
1416
import java.nio.file.Path;
1517
import java.util.Objects;
1618
import java.util.Set;
17-
import java.util.regex.Pattern;
1819
import java.util.stream.Collectors;
1920
import java.util.stream.Stream;
2021

commons/src/main/java/com/powsybl/commons/datasource/ReadOnlyMemDataSource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package com.powsybl.commons.datasource;
99

1010
import com.google.common.io.ByteStreams;
11+
import com.google.re2j.Pattern;
1112

1213
import java.io.ByteArrayInputStream;
1314
import java.io.IOException;
@@ -17,7 +18,6 @@
1718
import java.util.Map;
1819
import java.util.Objects;
1920
import java.util.Set;
20-
import java.util.regex.Pattern;
2121
import java.util.stream.Collectors;
2222

2323
/**

commons/src/main/java/com/powsybl/commons/datasource/ResourceDataSource.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77
*/
88
package com.powsybl.commons.datasource;
99

10+
import com.google.re2j.Pattern;
11+
1012
import java.io.InputStream;
1113
import java.util.Arrays;
1214
import java.util.List;
1315
import java.util.Objects;
1416
import java.util.Set;
15-
import java.util.regex.Pattern;
1617
import java.util.stream.Collectors;
1718

1819
/**

commons/src/main/java/com/powsybl/commons/datasource/TarArchiveDataSource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package com.powsybl.commons.datasource;
99

1010
import com.google.common.io.ByteStreams;
11+
import com.google.re2j.Pattern;
1112
import com.powsybl.commons.io.ForwardingInputStream;
1213
import com.powsybl.commons.io.ForwardingOutputStream;
1314
import org.apache.commons.compress.archivers.ArchiveEntry;
@@ -31,7 +32,6 @@
3132
import java.util.HashSet;
3233
import java.util.Objects;
3334
import java.util.Set;
34-
import java.util.regex.Pattern;
3535

3636
/**
3737
* @author Nicolas Rol {@literal <nicolas.rol at rte-france.com>}

commons/src/main/java/com/powsybl/commons/datasource/ZipArchiveDataSource.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
package com.powsybl.commons.datasource;
99

1010
import com.google.common.io.ByteStreams;
11+
import com.google.re2j.Pattern;
1112
import com.powsybl.commons.io.ForwardingInputStream;
1213
import com.powsybl.commons.io.ForwardingOutputStream;
1314
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
@@ -23,7 +24,6 @@
2324
import java.util.HashSet;
2425
import java.util.Objects;
2526
import java.util.Set;
26-
import java.util.regex.Pattern;
2727
import java.util.zip.ZipEntry;
2828
import java.util.zip.ZipOutputStream;
2929

commons/src/test/java/com/powsybl/commons/datasource/AbstractFileSystemDataSourceTest.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,17 @@
2121
import java.util.Set;
2222
import java.util.stream.Collectors;
2323

24-
import static org.junit.jupiter.api.Assertions.*;
24+
import static org.junit.jupiter.api.Assertions.assertEquals;
25+
import static org.junit.jupiter.api.Assertions.assertFalse;
26+
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
27+
import static org.junit.jupiter.api.Assertions.assertNull;
28+
import static org.junit.jupiter.api.Assertions.assertTrue;
29+
import static org.junit.jupiter.api.Assertions.fail;
2530

2631
/**
2732
* @author Nicolas Rol {@literal <nicolas.rol at rte-france.com>}
2833
*/
29-
abstract class AbstractFileSystemDataSourceTest {
34+
abstract class AbstractFileSystemDataSourceTest extends AbstractReadOnlyDataSourceTest {
3035
protected FileSystem fileSystem;
3136
protected Path testDir;
3237
protected Set<String> unlistedFiles;

0 commit comments

Comments
 (0)