Mojira Archive
MC-271287

DataComponentPatch unsafely allocates Reference2ObjectArrayMap on deserialization

Currently, Minecraft does not safely check the size of i / j when deserializing a DataComponentPatch. This can potentially cause malicious clients to send large var ints, which causes an OOME due to huge allocation amounts.

public static final StreamCodec<RegistryFriendlyByteBuf, DataComponentPatch> STREAM_CODEC = new StreamCodec<RegistryFriendlyByteBuf, DataComponentPatch>() {
    public DataComponentPatch decode(RegistryFriendlyByteBuf registryfriendlybytebuf) {
        int i = registryfriendlybytebuf.readVarInt(); // HERE
        int j = registryfriendlybytebuf.readVarInt(); // HERE

        if (i == 0 && j == 0) {
            return DataComponentPatch.EMPTY;
        } else {
            Reference2ObjectMap<DataComponentType<?>, Optional<?>> reference2objectmap = new Reference2ObjectArrayMap(i + j); // explosion sounds
 
[00:04:06 WARN]: java.lang.OutOfMemoryError: Java heap space
[00:04:06 WARN]:     at it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap.<init>(Reference2ObjectArrayMap.java:76)
[00:04:06 WARN]:     at net.minecraft.core.component.DataComponentPatch$1.decode(DataComponentPatch.java:74)
[00:04:06 WARN]:     at net.minecraft.core.component.DataComponentPatch$1.decode(DataComponentPatch.java:66)
[00:04:06 WARN]:     at net.minecraft.world.item.ItemStack$1.decode(ItemStack.java:167)
[00:04:06 WARN]:     at net.minecraft.world.item.ItemStack$1.decode(ItemStack.java:157)
[00:04:06 WARN]:     at net.minecraft.network.codec.ByteBufCodecs$20.decode(ByteBufCodecs.java:457)
[00:04:06 WARN]:     at net.minecraft.network.codec.ByteBufCodecs$20.decode(ByteBufCodecs.java:440)
[00:04:06 WARN]:     at net.minecraft.network.protocol.game.ServerboundContainerClickPacket.<init>(ServerboundContainerClickPacket.java:48)
[00:04:06 WARN]:     at net.minecraft.network.protocol.game.ServerboundContainerClickPacket$$Lambda/0x00000008014791c0.decode(Unknown Source)
[00:04:06 WARN]:     at net.minecraft.network.codec.StreamCodec$2.decode(StreamCodec.java:33)
[00:04:06 WARN]:     at net.minecraft.network.codec.StreamCodec$5.decode(StreamCodec.java:82)
[00:04:06 WARN]:     at net.minecraft.network.codec.StreamCodec$5.decode(StreamCodec.java:78)
[00:04:06 WARN]:     at net.minecraft.network.codec.IdDispatchCodec.decode(IdDispatchCodec.java:32)
[00:04:06 WARN]:     at net.minecraft.network.codec.IdDispatchCodec.decode(IdDispatchCodec.java:20)
[00:04:06 WARN]:     at net.minecraft.network.PacketDecoder.decode(PacketDecoder.java:25)
[00:04:06 WARN]:     at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:529)
[00:04:06 WARN]:     at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:468)
[00:04:06 WARN]:     at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:290)
[00:04:06 WARN]:     at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
[00:04:06 WARN]:     at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
[00:04:06 WARN]:     at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
[00:04:06 WARN]:     at io.netty.handler.flow.FlowControlHandler.dequeue(FlowControlHandler.java:202)
[00:04:06 WARN]:     at io.netty.handler.flow.FlowControlHandler.channelRead(FlowControlHandler.java:164)
[00:04:06 WARN]:     at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442)
[00:04:06 WARN]:     at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
[00:04:06 WARN]:     at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
[00:04:06 WARN]:     at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346)
[00:04:06 WARN]:     at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318)
[00:04:06 WARN]:     at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444)
[00:04:06 WARN]:     at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420)
[00:04:06 WARN]:     at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412)
[00:04:06 WARN]:     at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346)
[00:04:06 INFO]: Player355 lost connection: Internal Exception: java.lang.OutOfMemoryError: Java heap space 

In this case, the item was sent inside of a ServerboundContainerClickPacket.

Fixed

Owen

[Mojang] Gegy

2024-04-30, 04:14 AM

2024-05-06, 01:38 PM

2024-05-06, 01:38 PM

1

1

Confirmed

Very Important

Platform

Networking

1.20.5, 1.20.6

24w19a