
Proof-of-concept exploit per CVE-2021-43297, che consente l'esecuzione remota di codice in Apache Dubbo <= 2.7.13 tramite deserializzazione Hessian-Lite.
Nelle versioni di Dubbo Hessian-Lite 3.2.11 e precedenti esiste un potenziale rischio di attacco RCE. Quando Hessian-Lite incontra un'eccezione di serializzazione, genera informazioni correlate, il che può innescare il metodo toString di alcuni Bean appositamente predisposti, causando un attacco RCE.
Il POC iniziale poteva realizzare RCE solo su Apache Dubbo<=2.7.8, il principio è descritto nell'articolo di Xianzhi(verrà modificato dopo l'approvazione della revisione). Dopo la pubblicazione, ho continuato le ricerche e ho scoperto che è possibile realizzare RCE su Apache Dubbo<=2.7.13, l'analisi del principio è disponibile nel mio articolo del blog
L'effetto è il seguente

Condizioni di utilizzo del POC:
wget http://archive.apache.org/dist/zookeeper/zookeeper-3.3.3/zookeeper-3.3.3.tar.gz
tar zxvf zookeeper-3.3.3.tar.gz
cd zookeeper-3.3.3
cp conf/zoo_sample.cfg conf/zoo.cfg
vim conf/zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
dataDir=/percorso_assoluto/zookeeper-3.3.3/data
# the port at which the clients will connect
clientPort=2181
mkdir data
touch data/myid
cd /private/var/tmp/zookeeper-3.3.3/bin
./zkServer.sh start
git clone https://github.com/apache/dubbo-samples.git
cd dubbo-samples/dubbo-samples-api
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>dubbomytest</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<source.level>1.8</source.level>
<target.level>1.8</target.level>
<dubbo.version>2.7.6</dubbo.version>
<junit.version>4.12</junit.version>
<docker-maven-plugin.version>0.30.0</docker-maven-plugin.version>
<jib-maven-plugin.version>1.2.0</jib-maven-plugin.version>
<maven-compiler-plugin.version>3.7.0</maven-compiler-plugin.version>
<maven-failsafe-plugin.version>2.21.0</maven-failsafe-plugin.version>
<image.name>${project.artifactId}:${dubbo.version}</image.name>
<java-image.name>openjdk:8</java-image.name>
<dubbo.port>20880</dubbo.port>
<zookeeper.port>2181</zookeeper.port>
<main-class>org.apache.dubbo.samples.provider.Application</main-class>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.3</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.apache.xbean</groupId>
<artifactId>xbean-naming</artifactId>
<version>4.15</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Deve essere installato sia sul lato provider che localmente, la dipendenza è la seguente
<dependency>
<groupId>org.apache.xbean</groupId>
<artifactId>xbean-naming</artifactId>
<version>4.15</version>
</dependency>
Aggiungere dubbo-samples-api in IDEA, modificare le porte di zookeeper e dubbo, e modificare il codice in Application.java:
service.setRegistry(new RegistryConfig("zookeeper://" + zookeeperHost + ":" + zookeeperPort+"/?timeout=250000"));
Per evitare che le versioni più recenti di dubbo falliscano la connessione a zookeeper a causa di una connessione troppo lenta
Avviare Application.java in dubbo-samples-api da IDEA
Dopo l'avvio, l'output dubbo service started indica che dubbo è stato avviato
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>2.7.3</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>com.caucho</groupId>
<artifactId>hessian</artifactId>
<version>4.0.51</version>
</dependency>
Compilare ExecTest.java, quindi modificare il percorso di ExecTest.class in HttpServer.java, eseguire il metodo main di HttpServer e infine eseguire il metodo main di HessianLitePoc