はじめに
こんにちは、株式会社シーエー・アドバンス技術統括本部の@sk888です。
今回はこのところ巷を騒がせているLog4Shellの脆弱性についてPoCを試してみた記事になります。
下記の記事を参考に脆弱性を含んだアプリケーションに対してPoCを実施します。
[Log4Shell: RCE 0-day exploit found in log4j 2, a popular Java logging package]
(https://www.lunasec.io/docs/blog/log4j-zero-day/)
Log4Shellとは
JPCERTページでは下記の通り解説されています。
[Apache Log4jの任意のコード実行の脆弱性(CVE-2021-44228)に関する注意喚起]
(https://www.jpcert.or.jp/at/2021/at210050.html)
JavaベースのオープンソースのロギングライブラリのApache Log4jには、任意のコード実行の脆弱性(CVE-2021-44228)があります。Apache Log4jが動作するサーバーにおいて、遠隔の第三者が本脆弱性を悪用する細工したデータを送信することで、任意のコードを実行する可能性があります。
Apache Log4jにはLookupと呼ばれる機能があり、ログとして記録された文字列から、一部の文字列を変数として置換します。その内、JNDI Lookup機能が悪用されると、遠隔の第三者が細工した文字列を送信し、Log4jがログとして記録することで、Log4jはLookupにより指定された通信先もしくは内部パスからjava classファイルを読み込み実行し、結果として任意のコードが実行される可能性があります。
攻撃者が入力値として渡した特定の文字列がログに記録された場合にJNDI Lookup機能によりリモート又は内部パスからjava classファイルを読み込み実行してしまう脆弱性という理解です。
JAVAは全然知らないんですが、JNDIというのはJavaで利用するデータやオブジェクトを参照するためAPIの様です。
環境
「PC」
windows10 PRO 20H2 ビルド(19042.1415)
Docker Desktop 4.2.0 (70708)
WSL2 (Ubuntu 20.04.1 LTS)
Dockerで脆弱性を含んだアプリケーション起動
[How the exploit works]
(https://www.lunasec.io/docs/blog/log4j-zero-day/#how-the-exploit-works)
コマンドプロンプトから下記「docker run」コマンドを実行してコンテナを起動します。
起動後はプロンプトは返って来ず、PoCを試すと下記にLookupのログが表示されます。
>docker run -p 8080:8080 ghcr.io/christophetd/log4shell-vulnerable-app
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.6.1)
2021-12-20 20:04:59.469 INFO 1 --- [ main] f.c.l.v.VulnerableAppApplication : Starting VulnerableAppApplication using Java 1.8.0_181 on 67a5b38efb73 with PID 1 (/app/spring-boot-application.jar started by root in /)
2021-12-20 20:04:59.477 INFO 1 --- [ main] f.c.l.v.VulnerableAppApplication : No active profile set, falling back to default profiles: default
2021-12-20 20:05:00.519 INFO 1 --- [ main] o.s.b.w.e.t.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2021-12-20 20:05:00.539 INFO 1 --- [ main] o.a.c.c.StandardService : Starting service [Tomcat]
2021-12-20 20:05:00.540 INFO 1 --- [ main] o.a.c.c.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.55]
2021-12-20 20:05:00.591 INFO 1 --- [ main] o.a.c.c.C.[.[.[/] : Initializing Spring embedded WebApplicationContext
2021-12-20 20:05:00.591 INFO 1 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1005 ms
2021-12-20 20:05:01.020 INFO 1 --- [ main] o.s.b.w.e.t.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2021-12-20 20:05:01.033 INFO 1 --- [ main] f.c.l.v.VulnerableAppApplication : Started VulnerableAppApplication in 2.046 seconds (JVM running for 2.862)
PoC実行
WSL2で起動したUbuntu上で下記Curlコマンドを実行します。
X-API-Versionヘッダの値に特定の文字列を設定しています。
>curl 127.0.0.1:8080 -H 'X-API-Version: 特定の文字列'
Hello, world!
脆弱性を含んだアプリケーションを起動したコマンドプロンプトに下記ログが表示されます。
ルックアップ先を用意してないのでコネクションエラーとなっておりますが、ログに記録された文字列を元にルックアップ自体は試行していることが分かります。
>2021-12-20 20:19:13,389 http-nio-8080-exec-1 WARN Error looking up JNDI resource [特定の文字列].
javax.naming.CommunicationException: IPアドレス:ポート番号 [Root exception is java.net.ConnectException: Connection refused (Connection refused)]
~~~~~~~~~~~~~~~~~~~~~~ 以下略 ~~~~~~~~~~~~~~~~~~~~~~
2021-12-20 20:18:52.299 INFO 1 --- [nio-8080-exec-1] HelloWorld : Received a request for API version 特定の文字列
対策
Log4ShellはRCE及びDOSの脆弱性がありこの記事を作成した12月20日時点ではLog4j 2.17.0で修正されている様です。
[Apache Log4j Security Vulnerabilities]
(https://logging.apache.org/log4j/2.x/security.html)
RCE
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-44228
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-45046
DOS
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-45105
今後また新たな脆弱性が追加される可能性もありますので、上記Apache Log4jセキュリティ情報やJPCERTのページをしばらく注視しておく必要がありそうです。
[Apache Log4jの任意のコード実行の脆弱性(CVE-2021-44228)に関する注意喚起]
(https://www.jpcert.or.jp/at/2021/at210050.html)