Skip to content

Commit b8eac23

Browse files
committed
prevent DOS attacks using on malicious serialized input
Signed-off-by: Ceki Gulcu <[email protected]>
1 parent d87dd12 commit b8eac23

File tree

2 files changed

+24
-7
lines changed

2 files changed

+24
-7
lines changed

logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEventVO.java

+9
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
package ch.qos.logback.classic.spi;
1515

1616
import java.io.IOException;
17+
import java.io.InvalidObjectException;
1718
import java.io.ObjectInputStream;
1819
import java.io.ObjectOutputStream;
1920
import java.io.Serializable;
@@ -28,6 +29,7 @@
2829
import ch.qos.logback.classic.Level;
2930

3031
// http://www.riehle.org/computer-science/research/1998/ubilab-tr-1998-10-1.html
32+
// See also the paper https://www.riehle.org/computer-science/research/1998/ubilab-tr-1998-10-1.pdf
3133

3234
/**
3335
* A read-only and serializable implementation of {@link ILoggingEvent}.
@@ -41,6 +43,7 @@ public class LoggingEventVO implements ILoggingEvent, Serializable {
4143

4244
private static final int NULL_ARGUMENT_ARRAY = -1;
4345
private static final String NULL_ARGUMENT_ARRAY_ELEMENT = "NULL_ARGUMENT_ARRAY_ELEMENT";
46+
private static final int ARGUMENT_ARRAY_DESERIALIZATION_LIMIT = 128;
4447

4548
private String threadName;
4649
private String loggerName;
@@ -203,6 +206,12 @@ private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundE
203206
level = Level.toLevel(levelInt);
204207

205208
int argArrayLen = in.readInt();
209+
210+
// Prevent DOS attacks via large or negative arrays
211+
if (argArrayLen < 0 || argArrayLen > ARGUMENT_ARRAY_DESERIALIZATION_LIMIT) {
212+
throw new InvalidObjectException("Argument array length is invalid: " + argArrayLen);
213+
}
214+
206215
if (argArrayLen != NULL_ARGUMENT_ARRAY) {
207216
argumentArray = new String[argArrayLen];
208217
for (int i = 0; i < argArrayLen; i++) {

logback-core/src/main/java/ch/qos/logback/core/net/HardenedObjectInputStream.java

+15-7
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.io.IOException;
1717
import java.io.InputStream;
1818
import java.io.InvalidClassException;
19+
import java.io.ObjectInputFilter;
1920
import java.io.ObjectInputStream;
2021
import java.io.ObjectStreamClass;
2122
import java.util.ArrayList;
@@ -36,20 +37,27 @@
3637
*/
3738
public class HardenedObjectInputStream extends ObjectInputStream {
3839

39-
final List<String> whitelistedClassNames;
40-
final static String[] JAVA_PACKAGES = new String[] { "java.lang", "java.util" };
40+
final private List<String> whitelistedClassNames;
41+
final private static String[] JAVA_PACKAGES = new String[] { "java.lang", "java.util" };
42+
final private static int DEPTH_LIMIT = 16;
43+
final private static int ARRAY_LIMIT = 10000;
4144

42-
public HardenedObjectInputStream(InputStream in, String[] whilelist) throws IOException {
45+
public HardenedObjectInputStream(InputStream in, String[] whitelist) throws IOException {
4346
super(in);
44-
47+
this.initObjectFilter();
4548
this.whitelistedClassNames = new ArrayList<String>();
46-
if (whilelist != null) {
47-
for (int i = 0; i < whilelist.length; i++) {
48-
this.whitelistedClassNames.add(whilelist[i]);
49+
if (whitelist != null) {
50+
for (int i = 0; i < whitelist.length; i++) {
51+
this.whitelistedClassNames.add(whitelist[i]);
4952
}
5053
}
5154
}
5255

56+
private void initObjectFilter() {
57+
this.setObjectInputFilter(ObjectInputFilter.Config.createFilter(
58+
"maxarray=" + ARRAY_LIMIT + ";maxdepth=" + DEPTH_LIMIT + ";"
59+
));
60+
}
5361
public HardenedObjectInputStream(InputStream in, List<String> whitelist) throws IOException {
5462
super(in);
5563

0 commit comments

Comments
 (0)