Статья Уязвимость в базе для NPC: Z-Base

  • 60
  • 7
долго думал делать или не делать эту статью, ведь хотел еще поиграться с серверами на которых стоит данная база и покрашить их... ну ладно, перейдем к сути.

*эта база в мастерской 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 - это тоже кстати вызывает очень большие лаги, так-как серверу тоже нужно пройтись по всем таблицам и зарегистрировать их в спавнменю.
 
Последнее редактирование:
  • 40
  • 4
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Учитывая тот факт что здесь есть игроки данного сервера, я думаю пару дней и уязвимость будет закрыта. Поскольку сейчас век нейросетей, то прогнав данную статью через ИИ он мне уже дал ответ

🔎 Анализ уязвимости​


  1. Сетевое сообщение ZBaseReload
    • Любой клиент может отправить net.Start("ZBaseReload") → net.SendToServer().
    • На сервере без проверок вызывается ZBase_RegisterHandler:NetworkedReload().
    • Это триггерит тяжёлую функцию Reload() (регистрация NPC, пересоздание меню, иногда spawnmenu_reload).
  2. Серверная команда zbase_reload
    • Доступна всем игрокам.
    • Так же вызывает NetworkedReload().
    • При спаме может положить сервер.
  3. Главная проблема: отсутствует валидация прав (админ/суперадмин), ограничение частоты вызова и антиспам.

    Я не стану показывать фикс мне плевать на их сервера, но вот вывод который сделал ИИ


  4. ✅ Итог​

    • Уязвимость в отсутствии проверок и ограничений на сетевое сообщение и консольную команду.
    • Фиксится через:
      1. Проверку прав (только админы).
      2. Добавление кулдауна (антиспам).
      3. Закрытие серверной команды для игроков без прав.
 
  • 60
  • 7
Учитывая тот факт что здесь есть игроки данного сервера, я думаю пару дней и уязвимость будет закрыта. Поскольку сейчас век нейросетей, то прогнав данную статью через ИИ он мне уже дал ответ

🔎 Анализ уязвимости​


  1. Сетевое сообщение ZBaseReload
    • Любой клиент может отправить net.Start("ZBaseReload") → net.SendToServer().
    • На сервере без проверок вызывается ZBase_RegisterHandler:NetworkedReload().
    • Это триггерит тяжёлую функцию Reload() (регистрация NPC, пересоздание меню, иногда spawnmenu_reload).
  2. Серверная команда zbase_reload
    • Доступна всем игрокам.
    • Так же вызывает NetworkedReload().
    • При спаме может положить сервер.
  3. Главная проблема: отсутствует валидация прав (админ/суперадмин), ограничение частоты вызова и антиспам.

    Я не стану показывать фикс мне плевать на их сервера, но вот вывод который сделал ИИ


  4. ✅ Итог​

    • Уязвимость в отсутствии проверок и ограничений на сетевое сообщение и консольную команду.
    • Фиксится через:
      1. Проверку прав (только админы).
      2. Добавление кулдауна (антиспам).
      3. Закрытие серверной команды для игроков без прав.
приветствую YouBro, статью и саму уязвимость я бы не выкладывал, если бы они не фиксанули, уязвимость уже на том сервере (Z-City) закрыта, а именно как они закрыли эту уязвимость даже смешно говорить - они просто удалили папку базы ZBase, тем самым убили режимы с NPC.
 
  • 40
  • 4
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
приветствую YouBro, статью и саму уязвимость я бы не выкладывал, если бы они не фиксанули, уязвимость уже на том сервере (Z-City) закрыта, а именно как они закрыли эту уязвимость даже смешно говорить - они просто удалили папку базы ZBase, тем самым убили режимы с NPC.
Да и фиг с ними. Я репорт кинул на сам аддон пускай уже там разбираются.
 
  • 101
  • 1
  • 12
"проекты" не озаботившиеся рейтлимитом сетевого трафика очень даже заслужили чтобы школьники с хацкирского форума крашили им серваки:peperjomba:
 
Назад
Сверху Снизу