Bug#1010816: minetest.emerge_area() call with invalid position can hang server
Nils Dagsson Moskopp
nils+debian-reportbug at dieweltistgarnichtso.net
Tue May 10 19:56:27 BST 2022
Package: minetest
Version: 5.3.0+repack-2.1+deb11u1
Severity: normal
Tags: upstream
X-Debbugs-Cc: nils+debian-reportbug at dieweltistgarnichtso.net
Dear Maintainer,
calling minetest.emerge_area() with the first argument being a position
where x equals 32767 causes RAM and CPU usage to spike, as the Minetest
server queues 4096 emerge calls instead of 0. Note that as of now, such
a position is nonsensical, as the map generator stops generating around
x=31007 or so. It takes a long time to process these emerge calls, even
if a server has enough spare RAM and CPU resources to not hang forever.
This bug is security-relevant: A malicious client could provoke servers
into emerging an area – e.g. if it can trigger structure placement code
that does not have bounds checks. So far I have never seen such code in
any mod that had any bounds checks for minetest.emerge_area() calls.
I have attached proof of concept code. To verify the bug, name the file
init.lua, put it in a folder that is in the minetest mods folder (named
crash_emerge) then enter a world with the mod “crash_emerge” activated.
This bug likely affects all Minetest versions and is not fixed upstream.
A fix for all versions of Minetest would be to write a mod that wraps
the function minetest.emerge_area() and checks if the given positions
are out of bounds, not calling minetest.emerge_area() if that is true.
-- System Information:
Debian Release: 11.3
APT prefers stable
APT policy: (900, 'stable'), (500, 'oldoldstable')
Architecture: i386 (i686)
Kernel: Linux 5.10.0-10-686 (SMP w/2 CPU threads)
Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8), LANGUAGE not set
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
Versions of packages minetest depends on:
ii libc6 2.31-13+deb11u3
ii libcurl3-gnutls 7.74.0-1.3+deb11u1
ii libfreetype6 2.10.4+dfsg-1
ii libgcc-s1 10.2.1-6
ii libgmp10 2:6.2.1+dfsg-1+deb11u1
ii libirrlicht1.8 1.8.4+dfsg1-1.1
ii libjsoncpp24 1.9.4-4
ii libleveldb1d 1.22-3
ii libluajit-5.1-2 2.1.0~beta3+dfsg-5.3
ii libncursesw6 6.2+20201114-2
ii libopenal1 1:1.19.1-2
ii libpq5 13.5-0+deb11u1
ii libspatialindex6 1.9.3-2
ii libsqlite3-0 3.34.1-3
ii libstdc++6 10.2.1-6
ii libtinfo6 6.2+20201114-2
ii libvorbisfile3 1.3.7-1
ii libx11-6 2:1.7.2-1
ii minetest-data 5.3.0+repack-2.1+deb11u1
ii zlib1g 1:1.2.11.dfsg-2
minetest recommends no packages.
Versions of packages minetest suggests:
pn minetest-mod-moreblocks <none>
pn minetest-mod-moreores <none>
pn minetest-mod-pipeworks <none>
pn minetest-server <none>
pn minetestmapper <none>
-- no debconf information
-------------- next part --------------
local emerge = function()
local i = 32767
minetest.emerge_area(
{ x=i, y=0, z=0 },
{ x=i+1, y=0, z=0 },
function(blockpos, action, calls_remaining)
minetest.debug(
dump(
calls_remaining,
i
)
)
end
)
end
minetest.after( 0, emerge )
More information about the Pkg-games-devel
mailing list