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

Сообщение о баге от Abyss

Abyss

Игрок
Abyss
Abyss
17 Апр 2026
1
5
Имя пользователя: Abyss
Напишите свой никнейм на сервере: Abyss

Сообщение о баге

Суть обращения:
1. СУТЬ УЯЗВИМОСТИ: ИГНОРИРОВАНИЕ ID ПРЕДМЕТА

Плагин /guns проверяет ровно три характеристики любого предмета:
- кастомное имя (custom_name);
- строки описания (lore);
- наличие определённых NBT-компонентов (полную структуру тегов).

При этом тип предмета — его ID — не проверяется вообще.
Плагин видит знакомое имя, читает лор и NBT, запускает механику
стрельбы и не задаёт вопросов, что перед ним: конская броня,
незеритовый топор или булыжник.

Это позволяет вшить свойства любого оружия в произвольный предмет
и создать так называемую запретку — смертоносный предмет,
который невозможно отличить от обычного хлама. В примере ниже
железная конская броня (iron_horse_armor) с именем и лором АК-47
превращается в полностью функциональный автомат.

2. БЕСКОНЕЧНЫЕ ПАТРОНЫ И СБРОС КУЛДАУНА (ЭКСПЛУАТАЦИЯ ЧЕРЕЗ СИМВОЛ)

Количество патронов плагин определяет по подстроке вида
« ▪ «ЧИСЛО» » внутри custom_name. Это стандартный маркер,
который парсится при каждом выстреле.

Если скопировать NBT предмета (через C + 1 в креативе),
а затем намеренно удалить закрывающую кавычку в строке имени,
структура становится некорректной. При попытке выстрела парсер
не может извлечь число, падает в ошибку, но вместо штатной
остановки просто сбрасывает переменные:

- счётчик патронов перестаёт уменьшаться (бесконечный магазин);
- задержка между выстрелами обнуляется (оружие стреляет без
перерыва, превращаясь в лазер).

Для воспроизведения достаточно указать в имени
« АК-47 ▪ «20 (без закрывающей кавычки). Плагин ломается и
выдаёт бесконечный боезапас.

3. ДОПОЛНИТЕЛЬНОЕ ПОДТВЕРЖДЕНИЕ

Если багнутый предмет переименовать на наковальне, он сразу
перестаёт работать. Это лишний раз доказывает, что плагин
жёстко привязан к отображаемому имени и не валидирует ни ID,
ни внутренние теги.

ПРИМЕР КОМАНДЫ ДЛЯ ВЫДАЧИ ЗАПРЕТКИ

АК-47 на незеритовом топоре (имя, лор и NBT — ID игнорируется):

/give @p minecraft:netherite_axe[minecraft:custom_name={extra:[{bold:0b,color:"yellow",italic:0b,obfuscated:0b,strikethrough:0b,text:" АК-47",underlined:0b},{color:"yellow",italic:0b,text:" ▪ «20»"}],text:""},minecraft:lore=[{extra:[{bold:0b,color:"yellow",italic:0b,obfuscated:0b,strikethrough:0b,text:" Полностью автоматический с высокой точностью",underlined:0b}],text:""},{extra:[{bold:0b,color:"yellow",italic:0b,obfuscated:0b,strikethrough:0b,text:" Эффективен в среднем бою ",underlined:0b},{bold:0b,color:"yellow",italic:1b,obfuscated:0b,strikethrough:0b,text:"( перезарядка нажав Q ) ",underlined:0b}],text:""}]]

КАК ИСПРАВИТЬ

1. Добавить проверку ID предмета по белому списку.
Перед выполнением оружейной логики убедиться, что ID входит
в список разрешённых (например, только предметы, выданные
самим плагином).

2. Валидировать структуру custom_name и целостность NBT.
При обнаружении битой строки (отсутствие закрывающей кавычки,
повреждённый JSON) не пытаться читать частично — игнорировать
выстрел и логировать ошибку.

3. Не полагаться исключительно на отображаемое имя.
Использовать специальный внутренний NBT-тег (например,
guns:weapon_type) вместо разбора имени для идентификации
оружия и текущего боезапаса.

О НАГРАДЕ

Я подробно проанализировал уязвимость, воспроизвёл её и описал
с примерами. Буду очень рад, если администрация Tofficraft
посчитает мой вклад полезным и поощрит небольшим донатом либо
выдаст уникальный титул (префикс) на сервере. Любой из этих
вариантов будет отличной мотивацией и дальше помогать
с безопасностью проекта.