[ 
https://issues.apache.org/jira/browse/GROOVY-9992?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Paul King closed GROOVY-9992.
-----------------------------

> Redos in groovy.sql.Sql
> -----------------------
>
>                 Key: GROOVY-9992
>                 URL: https://issues.apache.org/jira/browse/GROOVY-9992
>             Project: Groovy
>          Issue Type: Bug
>          Components: SQL processing
>            Reporter: kingkk
>            Assignee: Paul King
>            Priority: Major
>              Labels: security
>             Fix For: 6.0.0-alpha-1
>
>
> When executing a prepare sql statement, adding too many spaces in front of 
> sql will cause redos.The following is an example.
> {code:java}
> import groovy.sql.Sql
> class SqlTest {
>     static void main(String[] args) {
>         def url = 'jdbc:mysql://127.0.0.1:3306/test'
>         def user = 'user'
>         def password = '123456'
>         def driver = 'com.mysql.cj.jdbc.Driver'
>         def conn = Sql.newInstance(url, user, password, driver)
>         def sql = ""
>         for (int i = 0; i < 400; i++) {
>             sql += " "
>         }
>         sql += "select * from users where id=?"
>         def startTime = System.currentTimeMillis()
>         conn.execute(sql, 1)
>         println("exec sql: " + (System.currentTimeMillis() - startTime))
>         conn.close()
>     }
> }{code}
> The groovy and mysql-connector versions used are as follows
> {code:java}
> <dependency>
>     <groupId>org.codehaus.groovy</groupId>
>     <artifactId>groovy-all</artifactId>
>     <version>3.0.7</version>
> </dependency>
> <dependency>
>     <groupId>org.codehaus.groovy</groupId>
>     <artifactId>groovy-sql</artifactId>
>     <version>3.0.7</version>
> </dependency>
> <dependency>
>     <groupId>mysql</groupId>
>     <artifactId>mysql-connector-java</artifactId>
>     <version>8.0.23</version>
> </dependency>
> {code}
> The output after executing this is as follows
> {code:java}
> exec sql: 11731
> {code}
> This shows that the conn.execute() operation took about 11 seconds to 
> complete, and the cpu utilization has been high during this period. Modifying 
> 400 in the for loop to 1000 will take longer and eventually lead to 
> exhaustion of computer resources.
>  
> The reason for this vuln is that 
> groovy.sql.Sql$CreatePreparedStatementCommand.appearsLikeStoredProc uses 
> improper regular expressions for matching.
> {code:java}
> private boolean appearsLikeStoredProc(String sql) {
>     return sql.matches("\\s*[{]?\\s*[?]?\\s*[=]?\\s*[cC][aA][lL][lL].*");
> }
> {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to