Skip to content

Commit 42e261a

Browse files
committed
Move SqlInjectionSink and PersistenceQueryInjectionSink
Join SqlInjectionSink and PersistenceQueryInjectionSink with QueryInjectionSink to make its definition more transparent.
1 parent d07d21c commit 42e261a

File tree

2 files changed

+43
-42
lines changed

2 files changed

+43
-42
lines changed

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

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,6 @@
1-
/** Definitions used by the queries for database query injection. */
2-
31
import java
42
import semmle.code.java.dataflow.FlowSources
53
import semmle.code.java.security.QueryInjection
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 SQL injection vulnerabilities. */
13-
class SqlInjectionSink extends QueryInjectionSink {
14-
SqlInjectionSink() {
15-
this.getExpr() instanceof SqlExpr
16-
or
17-
exists(MethodAccess ma, Method m, int index |
18-
ma.getMethod() = m and
19-
ma.getArgument(index) = this.getExpr()
20-
|
21-
index = m.(SQLiteRunner).sqlIndex()
22-
or
23-
m instanceof BatchUpdateVarargsMethod
24-
or
25-
index = 0 and jdbcSqlMethod(m)
26-
or
27-
index = 0 and mybatisSqlMethod(m)
28-
or
29-
index = 0 and hibernateSqlMethod(m)
30-
)
31-
}
32-
}
33-
34-
/** A sink for Java Persistence Query Language injection vulnerabilities. */
35-
class PersistenceQueryInjectionSink extends QueryInjectionSink {
36-
PersistenceQueryInjectionSink() {
37-
// the query (first) argument to a `createQuery` or `createNativeQuery` method on `EntityManager`
38-
exists(MethodAccess call, TypeEntityManager em | call.getArgument(0) = this.getExpr() |
39-
call.getMethod() = em.getACreateQueryMethod() or
40-
call.getMethod() = em.getACreateNativeQueryMethod()
41-
// note: `createNamedQuery` is safe, as it takes only the query name,
42-
// and named queries can only be constructed using constants as the query text
43-
)
44-
}
45-
}
464

475
private class QueryInjectionFlowConfig extends TaintTracking::Configuration {
486
QueryInjectionFlowConfig() { this = "SqlInjectionLib::QueryInjectionFlowConfig" }
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,48 @@
1+
/** Definitions used by the queries for database query injection. */
2+
13
import java
24
import semmle.code.java.dataflow.DataFlow
5+
import semmle.code.java.dataflow.FlowSources
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
311

412
/** A sink for database query language injection vulnerabilities. */
513
abstract class QueryInjectionSink extends DataFlow::ExprNode { }
14+
15+
/** A sink for SQL injection vulnerabilities. */
16+
private class SqlInjectionSink extends QueryInjectionSink {
17+
SqlInjectionSink() {
18+
this.getExpr() instanceof SqlExpr
19+
or
20+
exists(MethodAccess ma, Method m, int index |
21+
ma.getMethod() = m and
22+
ma.getArgument(index) = this.getExpr()
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.getExpr() |
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)