
إثبات مفهوم لاستغلال CVE-2021-43297، يحقق تنفيذًا عن بُعد للكود في Apache Dubbo <= 2.7.13 عبر إلغاء تسلسل Hessian-Lite.
توجد مخاطر هجوم تنفيذ الأوامر عن بُعد (RCE) المحتملة في Apache Dubbo Hessian-Lite الإصدار 3.2.11 والإصدارات السابقة. عند مواجهة استثناء في التسلسل (Serialization)، يقوم Hessian-Lite بإخراج معلومات ذات صلة، مما قد يؤدي إلى تشغيل طريقة toString لبعض كائنات Bean الخبيثة المخصصة، وبالتالي التسبب في هجوم RCE.
كان بإمكان الـ POC الأولي تنفيذ RCE فقط على Apache Dubbo <= 2.7.8، والمبدأ موضح في مقال先知 (سيتم تعديله بعد اجتياز المراجعة). بعد تقديم المقال، قمت بدراسة إضافية وتمكنت من تنفيذ RCE على Apache Dubbo <= 2.7.13، وتحليل المبدأ موجود في مقال مدونتي
التأثير كما يلي

شروط استخدام الـ 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=/绝对路径/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>
يجب تثبيتها على كل من جانب المزود (provider) والمحلي، والاعتماديات كالتالي
<dependency>
<groupId>org.apache.xbean</groupId>
<artifactId>xbean-naming</artifactId>
<version>4.15</version>
</dependency>
أضف dubbo-samples-api في IDEA، وانتبه لتعديل منافذ zookeeper و dubbo، كما قم بتعديل الكود في Application.java:
service.setRegistry(new RegistryConfig("zookeeper://" + zookeeperHost + ":" + zookeeperPort+"/?timeout=250000"));
لمنع فشل الاتصال بسبب بطء اتصال إصدارات dubbo الأعلى بـ zookeeper
قم بتشغيل Application.java في dubbo-samples-api داخل IDEA
بعد التشغيل، ظهور dubbo service started يعني أن dubbo قد بدأ بنجاح
<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>
قم بتجميع ExecTest.java، ثم عدّل مسار ExecTest.class في HttpServer.java، ثم نفّذ طريقة HttpServer.main، وأخيراً نفّذ طريقة HessianLitePoc.main