Skip to content

Commit 015d0d5

Browse files
atlv24vis2k
authored and
vis2k
committed
fix: Potential DOS attack on server by sending packed ulongs when packed uints are expected. (#730)
* fix: Potential DOS attack on server by sending packed ulongs when packed uints are expected. * Update NetworkReader.cs
1 parent 3cee3ab commit 015d0d5

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

Assets/Mirror/Runtime/NetworkReader.cs

+4-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,10 @@ public uint ReadPackedUInt32()
8282
ulong value = ReadPackedUInt64();
8383
if (value > uint.MaxValue)
8484
{
85-
throw new IndexOutOfRangeException("ReadPackedUInt32() failure, value too large");
85+
// show warning, but don't throw an exception to avoid DOS attack where
86+
// an attacker might send a packed UInt64 where a packed UInt32 was
87+
// expected (https://github.com/vis2k/Mirror/pull/730/)
88+
Debug.LogWarning("ReadPackedUInt32() failure, value too large: " + value);
8689
}
8790
return (uint)value;
8891
}

Assets/Mirror/Tests/NetworkWriterTest.cs

+32
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,22 @@ public void TestPackedUInt32()
144144
Assert.That(reader.ReadPackedUInt32(), Is.EqualTo(uint.MaxValue));
145145
}
146146

147+
[Test]
148+
public void TestPackedUInt32Failure()
149+
{
150+
Assert.DoesNotThrow(() => {
151+
NetworkWriter writer = new NetworkWriter();
152+
writer.WritePackedUInt64(1099511627775);
153+
writer.WritePackedUInt64(281474976710655);
154+
writer.WritePackedUInt64(72057594037927935);
155+
156+
NetworkReader reader = new NetworkReader(writer.ToArray());
157+
reader.ReadPackedUInt32();
158+
reader.ReadPackedUInt32();
159+
reader.ReadPackedUInt32();
160+
});
161+
}
162+
147163
[Test]
148164
public void TestPackedInt32()
149165
{
@@ -180,6 +196,22 @@ public void TestPackedInt32()
180196
Assert.That(reader.ReadPackedInt32(), Is.EqualTo(int.MinValue));
181197
}
182198

199+
[Test]
200+
public void TestPackedInt32Failure()
201+
{
202+
Assert.DoesNotThrow(() => {
203+
NetworkWriter writer = new NetworkWriter();
204+
writer.WritePackedInt64(1099511627775);
205+
writer.WritePackedInt64(281474976710655);
206+
writer.WritePackedInt64(72057594037927935);
207+
208+
NetworkReader reader = new NetworkReader(writer.ToArray());
209+
reader.ReadPackedInt32();
210+
reader.ReadPackedInt32();
211+
reader.ReadPackedInt32();
212+
});
213+
}
214+
183215
[Test]
184216
public void TestPackedUInt64()
185217
{

0 commit comments

Comments
 (0)