Skip to content

Commit 99a4f8f

Browse files
authored
Merge pull request github#3926 from rvermeulen/java-importable-cwe-089
Java: Move `QueryInjectionSink` into importable library
2 parents 2fa5455 + 7428a8c commit 99a4f8f

File tree

3 files changed

+51
-45
lines changed

3 files changed

+51
-45
lines changed

java/ql/src/Security/CWE/CWE-089/SqlInjectionLib.qll

Lines changed: 2 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,8 @@
11
/** Definitions used by the queries for database query injection. */
22

3-
import semmle.code.java.Expr
3+
import java
44
import semmle.code.java.dataflow.FlowSources
5-
import semmle.code.java.frameworks.android.SQLite
6-
import semmle.code.java.frameworks.javaee.Persistence
7-
import semmle.code.java.frameworks.SpringJdbc
8-
import semmle.code.java.frameworks.MyBatis
9-
import semmle.code.java.frameworks.Hibernate
10-
11-
/** A sink for database query language injection vulnerabilities. */
12-
abstract class QueryInjectionSink extends DataFlow::ExprNode { }
13-
14-
/** A sink for SQL injection vulnerabilities. */
15-
class SqlInjectionSink extends QueryInjectionSink {
16-
SqlInjectionSink() {
17-
this.getExpr() instanceof SqlExpr
18-
or
19-
exists(MethodAccess ma, Method m, int index |
20-
ma.getMethod() = m and
21-
ma.getArgument(index) = this.getExpr()
22-
|
23-
index = m.(SQLiteRunner).sqlIndex()
24-
or
25-
m instanceof BatchUpdateVarargsMethod
26-
or
27-
index = 0 and jdbcSqlMethod(m)
28-
or
29-
index = 0 and mybatisSqlMethod(m)
30-
or
31-
index = 0 and hibernateSqlMethod(m)
32-
)
33-
}
34-
}
35-
36-
/** A sink for Java Persistence Query Language injection vulnerabilities. */
37-
class PersistenceQueryInjectionSink extends QueryInjectionSink {
38-
PersistenceQueryInjectionSink() {
39-
// the query (first) argument to a `createQuery` or `createNativeQuery` method on `EntityManager`
40-
exists(MethodAccess call, TypeEntityManager em | call.getArgument(0) = this.getExpr() |
41-
call.getMethod() = em.getACreateQueryMethod() or
42-
call.getMethod() = em.getACreateNativeQueryMethod()
43-
// note: `createNamedQuery` is safe, as it takes only the query name,
44-
// and named queries can only be constructed using constants as the query text
45-
)
46-
}
47-
}
5+
import semmle.code.java.security.QueryInjection
486

497
private class QueryInjectionFlowConfig extends TaintTracking::Configuration {
508
QueryInjectionFlowConfig() { this = "SqlInjectionLib::QueryInjectionFlowConfig" }

java/ql/src/Security/CWE/CWE-089/SqlUnescaped.ql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class UncontrolledStringBuilderSourceFlowConfig extends TaintTracking::Configura
4040
from QueryInjectionSink query, Expr uncontrolled
4141
where
4242
(
43-
builtFromUncontrolledConcat(query.getExpr(), uncontrolled)
43+
builtFromUncontrolledConcat(query.asExpr(), uncontrolled)
4444
or
4545
exists(StringBuilderVar sbv, UncontrolledStringBuilderSourceFlowConfig conf |
4646
uncontrolledStringBuilderQuery(sbv, uncontrolled) and
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/** Provides classes to reason about database query language injection vulnerabilities. */
2+
3+
import java
4+
import semmle.code.java.dataflow.DataFlow
5+
import semmle.code.java.frameworks.Jdbc
6+
import semmle.code.java.frameworks.android.SQLite
7+
import semmle.code.java.frameworks.javaee.Persistence
8+
import semmle.code.java.frameworks.SpringJdbc
9+
import semmle.code.java.frameworks.MyBatis
10+
import semmle.code.java.frameworks.Hibernate
11+
12+
/** A sink for database query language injection vulnerabilities. */
13+
abstract class QueryInjectionSink extends DataFlow::Node { }
14+
15+
/** A sink for SQL injection vulnerabilities. */
16+
private class SqlInjectionSink extends QueryInjectionSink {
17+
SqlInjectionSink() {
18+
this.asExpr() instanceof SqlExpr
19+
or
20+
exists(MethodAccess ma, Method m, int index |
21+
ma.getMethod() = m and
22+
ma.getArgument(index) = this.asExpr()
23+
|
24+
index = m.(SQLiteRunner).sqlIndex()
25+
or
26+
m instanceof BatchUpdateVarargsMethod
27+
or
28+
index = 0 and jdbcSqlMethod(m)
29+
or
30+
index = 0 and mybatisSqlMethod(m)
31+
or
32+
index = 0 and hibernateSqlMethod(m)
33+
)
34+
}
35+
}
36+
37+
/** A sink for Java Persistence Query Language injection vulnerabilities. */
38+
private class PersistenceQueryInjectionSink extends QueryInjectionSink {
39+
PersistenceQueryInjectionSink() {
40+
// the query (first) argument to a `createQuery` or `createNativeQuery` method on `EntityManager`
41+
exists(MethodAccess call, TypeEntityManager em | call.getArgument(0) = this.asExpr() |
42+
call.getMethod() = em.getACreateQueryMethod() or
43+
call.getMethod() = em.getACreateNativeQueryMethod()
44+
// note: `createNamedQuery` is safe, as it takes only the query name,
45+
// and named queries can only be constructed using constants as the query text
46+
)
47+
}
48+
}

0 commit comments

Comments
 (0)