- 60
- 7
долго думал делать или не делать эту статью, ведь хотел еще поиграться с серверами на которых стоит данная база и покрашить их... ну ладно, перейдем к сути.
*эта база в мастерской Steam* - Z-Base
*видеоролик с применением этой уязвимости*
В этой статье будет рассказ и объяснение об уязвимости аддона Z-Base аддон который позволяет создавать своих NPC с большим функционалом, нежели в стандартной базе NPC от GMOD / HL2.
Эта уязвимость позволяет полностью крашить сервер.
зайдя по пути lua/autorun/zbase.lua
с 86 по 88 строчку мы можем увидеть серверный код который запускает слушанье сетевого сообщения с названием ZBaseReload
наблюдая данный отрезок кода меня сразу удивило некое отсутствие какой либо валидации в сетевом сообщении, тем более раз она играет такую важную роль как перезапуск абсолютно всей базы.
тут нету особо чего-то интересно, идем дальше к функции Reload()
это самый главный код для перезагрузки и тут сразу все понятно, эта функция регистрирует заново опять всех новосозданных NPC, через первый метод, унаследывает всем NPC с классом npc_zbase определенную таблицу и добавляет новых NPC в меню спавна и если нужно перезагружает spawnmenu, для прогрузки всех новых NPC.
серверная команда которой спокойно можно заспамить в консоль и сервер так же будет отмирать и вызывать лаги, при особо сильном спаме этой командой сервер отпадет на совсем.
Исходя из всего вышесказанного мы наблюдаем как в базе наблюдается сетевое сообщение которое может перезагружать всю базу, что естественно вызывает сетевые лаги и у клиентов и у сервера. То есть если абсолютно заспамить сервер даже хотя бы десяткой этих неток - можно спокойно крашнуть сервер.
Итог: обычная ошибка почти у каждого кодера при разработке какого либо аддона, разработчики просто забыли или поленились сделать проверку на спам этими сетевыми сообщениями, тем более аддон такого масштаба - очень печально, кто до сих пор не понял объясню все кратко и понятно - Разработчики забыли добавить ограничение на спам этим сетевым сообщением и из-за этого если отправить их очень много сервер просто ляжет, из-за того что он запускает очень сильную функцию которая нагружает сервер тем, что перезапускает абсолютно всю базу: регистрирует всех NPC проходясь по таблицам ново созданных NPC и записывает новых, перезапускает spawnmenu - это тоже кстати вызывает очень большие лаги, так-как серверу тоже нужно пройтись по всем таблицам и зарегистрировать их в спавнменю.
*эта база в мастерской Steam* - Z-Base
*видеоролик с применением этой уязвимости*
В этой статье будет рассказ и объяснение об уязвимости аддона Z-Base аддон который позволяет создавать своих NPC с большим функционалом, нежели в стандартной базе NPC от GMOD / HL2.
Эта уязвимость позволяет полностью крашить сервер.
зайдя по пути lua/autorun/zbase.lua
с 86 по 88 строчку мы можем увидеть серверный код который запускает слушанье сетевого сообщения с названием ZBaseReload
Запуск слушанья сетевого сообщения ZBaseReload:
util.AddNetworkString("ZBaseReload") // <- добавление сетевого сообщения
net.Receive("ZBaseReload", function()
ZBase_RegisterHandler:NetworkedReload() // <- запуск функции по перезапуску базы
end)
наблюдая данный отрезок кода меня сразу удивило некое отсутствие какой либо валидации в сетевом сообщении, тем более раз она играет такую важную роль как перезапуск абсолютно всей базы.
Функция NetworkedReload, вызываемая внутри сетевого сообщениями ZBaseReload:
function ZBase_RegisterHandler:NetworkedReload()
ZBase_RegisterHandler:Reload() // <- вызов функции на перезапуск базы
net.Start("ZBaseClientReload") // <- сетевое сообщение которое отправляется всем клиентам для перезапуска базы уже на клиентской части
net.Broadcast()
end
тут нету особо чего-то интересно, идем дальше к функции Reload()
Основная функция перезапуска базы, вызывает очень большую нагрузку:
function ZBase_RegisterHandler:Reload()
self:RegNPCs() // <- регистрация всех NPC и главное не только новых, а абсолютно всех, даже которые уже зарегистрироваы.
self:NPCsInherit({npc_zbase=ZBaseNPCs["npc_zbase"]}) // <- унаследование всем NPC класса npc_zbase таблицы ZBaseNPCs
self:AddNPCsToSpawnMenu() // <- добавление NPC в меню спавна
if SERVER && ZBCVAR.ReloadSpawnMenu:GetBool() then
RunConsoleCommand("spawnmenu_reload") // <- перезапуск spawnmenu
end
end
это самый главный код для перезагрузки и тут сразу все понятно, эта функция регистрирует заново опять всех новосозданных NPC, через первый метод, унаследывает всем NPC с классом npc_zbase определенную таблицу и добавляет новых NPC в меню спавна и если нужно перезагружает spawnmenu, для прогрузки всех новых NPC.
Серверная команда zbase_reload без проверок, так же вызывает нагрузку при выполнении:
concommand.Add("zbase_reload", function(ply)
ZBase_RegisterHandler:NetworkedReload()
conv.devPrint(Color(0, 255, 200), "ZBase reloaded!")
end)
серверная команда которой спокойно можно заспамить в консоль и сервер так же будет отмирать и вызывать лаги, при особо сильном спаме этой командой сервер отпадет на совсем.
Исходя из всего вышесказанного мы наблюдаем как в базе наблюдается сетевое сообщение которое может перезагружать всю базу, что естественно вызывает сетевые лаги и у клиентов и у сервера. То есть если абсолютно заспамить сервер даже хотя бы десяткой этих неток - можно спокойно крашнуть сервер.
Итог: обычная ошибка почти у каждого кодера при разработке какого либо аддона, разработчики просто забыли или поленились сделать проверку на спам этими сетевыми сообщениями, тем более аддон такого масштаба - очень печально, кто до сих пор не понял объясню все кратко и понятно - Разработчики забыли добавить ограничение на спам этим сетевым сообщением и из-за этого если отправить их очень много сервер просто ляжет, из-за того что он запускает очень сильную функцию которая нагружает сервер тем, что перезапускает абсолютно всю базу: регистрирует всех NPC проходясь по таблицам ново созданных NPC и записывает новых, перезапускает spawnmenu - это тоже кстати вызывает очень большие лаги, так-как серверу тоже нужно пройтись по всем таблицам и зарегистрировать их в спавнменю.
Последнее редактирование:
Анализ уязвимости
Итог