Skip to content

Commit

Permalink
Merge pull request #135 from Rover656/fix/security-patch
Browse files Browse the repository at this point in the history
  • Loading branch information
Rover656 authored Jul 29, 2023
2 parents 36f18cd + a638590 commit 76170fc
Showing 1 changed file with 41 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -1,14 +1,26 @@
package com.enderio.core.common.config;

import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.relauncher.Side;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectStreamClass;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;

import com.enderio.core.common.util.NullHelper;
import com.google.common.base.Throwables;

Expand Down Expand Up @@ -53,14 +65,19 @@ public void toBytes(ByteBuf buf) {
@SuppressWarnings("unchecked")
@Override
public void fromBytes(ByteBuf buf) {
if(FMLCommonHandler.instance().getEffectiveSide() == Side.SERVER) {
return;
}

short len = buf.readShort();
byte[] compressedBody = new byte[len];

for (short i = 0; i < len; i++)
compressedBody[i] = buf.readByte();

try {
ObjectInputStream obj = new ObjectInputStream(new GZIPInputStream(new ByteArrayInputStream(compressedBody)));
ObjectInputStream obj = new ValidatingObjectInputStream(
new GZIPInputStream(new ByteArrayInputStream(compressedBody)));
configValues = (Map<String, Object>) obj.readObject();
obj.close();
} catch (Exception e) {
Expand All @@ -80,4 +97,27 @@ public PacketConfigSync onMessage(PacketConfigSync message, MessageContext ctx)
return null;
}
}

private static class ValidatingObjectInputStream extends ObjectInputStream {

private static final List<String> WHITELIST = Arrays
.asList("java.util.HashMap", "java.lang.Integer", "java.lang.Number", "java.lang.Boolean");

private static final Logger logger = LogManager.getLogger();
private static final Marker securityMarker = MarkerManager.getMarker("SuspiciousPackets");

private ValidatingObjectInputStream(InputStream in) throws IOException {
super(in);
}

@Override
protected Class<?> resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException {
String name = desc.getName();
if (!WHITELIST.contains(name)) {
logger.warn(securityMarker, "Received packet containing disallowed class: " + name);
throw new RuntimeException();
}
return super.resolveClass(desc);
}
}
}

0 comments on commit 76170fc

Please sign in to comment.