PDA

Просмотр полной версии : CVE-2020-2555: RCE из-за ошибки десериализации на сервере oracle weblogic


Zer0must2b
07.03.2020, 01:12
CVE-2020-2555

Уязвимости небезопасной десериализации стали популярной целью для злоумышленников/исследователей веб-приложений Java. Эти уязвимости часто приводят к удаленному выполнению кода и, как правило, их сложно исправить. В этом сообщении мы рассмотрим CVE-2020-2555 (ZDI-20-128 ), о котором сообщил ZDI Чанг из VNPT ISC. Эта критическая уязвимость (оценка CVSS 9,8) затрагивает библиотеку Oracle Coherence, которая используется в популярных продуктах, таких как Oracle WebLogic Server. Ее исправили в январе вместе с 333 другими ошибками.

Изучение патча, чтобы найти source

Sources - это метод Java с контролируемыми параметрами, который может быть вызван злоумышленником. В Java,

readObject()

или

readExternal()

метод класса автоматически вызывается для того , чтобы воссоздать граф объектов. Эти два метода и любые другие методы, доступные из них, могут считаться допустимыми источниками для устройств десериализации.

Патч для CVE-2020-2555 представил очень интересное изменение

toString()

метода

LimitFilter

класса:

https://forum.antichat.xyz/attachments/4874441/img_7f64c78d20.png

Все вызовы

extract()

метода были удалены из

toString()

. Значение метода

extract()

будет рассмотрено в следующем разделе. Это изменение особенно интересно, потому что

toString()

может быть достигнуто с помощью

readObject()

метода различных стандартных классов JRE, таких как

BadAttributeValueExpException

:

https://forum.antichat.xyz/attachments/4874441/img_a52f1de0d5.png

Как показано в приведенном выше коде, сериализованный экземпляр

BadAttributeValueExpException

класса может использоваться для вызова

toString()

метода произвольного класса. Эта техника может быть использована для достижения

toString()

метода

LimitFilter

класса, затронутого этим патчем.

Примеры гаджетов, которые используются

toString()

в качестве точки входа, смотрите в CommonsCollections5 проекта ysoserial .

Поиск sink

Sinks - это вызовы методов Java, которые, как известно, имеют опасные побочные эффекты. Примеры таких побочных эффектов:

- Создание произвольного файла с помощью вызова

FileOutputStream.write()

.
- Произвольное выполнение команды через вызов

Runtime.exec()

.
- Произвольный вызов метода через вызов

Method.invoke()

.

Для этой уязвимости мы фокусируемся на вызове

Method.invoke()

, побочным эффектом которого является вызов произвольных методов Java через рефлексию. Учитывая эту информацию, мы можем искать все случаи, когда

extract()

вызов метода, который мы определили как точку входа в нашем анализе патча, приводит к вызову

Method.invoke()

. По-видимому, в библиотеке Coherence есть только один экземпляр такого сериализуемого класса (реализующий интерфейс Serializable или Externalizable интерфейс).

https://forum.antichat.xyz/attachments/4874441/img_17bc9f7872.png

Взгляд на

ReflectionExtractor

класс подтверждает наше подозрение.

https://forum.antichat.xyz/attachments/4874441/img_1916bfe765.png


ReflectionExtractor

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

Дорога к RCE

Как правило, для достижения удаленного выполнения кода требуется более одного вызова метода. Например, в популярных гаджетах Apache Commons Collections это достигается путем объединения вызовов произвольных методов с использованием ChainedTransformer. Аналогичным образом, в Coherence библиотеке есть класс, который позволяет нам связывать

extract()

вызовы, который удобно называть ChainedExtractor:

https://forum.antichat.xyz/attachments/4874441/img_2a09ed01a8.png

Объединение всего этого означает, что следующая цепочка может быть использована для удаленного выполнения кода:

https://forum.antichat.xyz/attachments/4874441/img_c24b5282f1.png

Следовательно, любой проект, использующий библиотеку, в которой вы можете доставить вредоносный сериализованный объект, может быть использован для удаленного выполнения кода. Для наших целей мы демонстрируем атаку на протокол T3 WebLogic в следующем видео:

Вывод

С тех пор, как Крис Фрохофф и Габриэль Лоуренс провели в AppSecCali беседу о так называемом Апокалипсисе десериализации Java в 2015 и 2016 годах, исследователи искали ошибки десериализации для выполнения кода. Мы видели много ошибок этого класса, представленных в программу и использованных во время события Pwn2Own Miami против приложений SCADA. Это также одна из причин, по которой мы обратили особое внимание на ошибки десериализации в отчете Trend Micro Security Predictions for 2020 . Еще раз спасибо Jang из VNPT ISC за сообщение об ошибке в программе, и мы надеемся увидеть больше отчетов от него в будущем.

Перевод:Zero Day Initiative — CVE-2020-2555: RCE Through a Deserialization Bug in Oracle’s WebLogic Server