Skip to content

Commit 2e4a174

Browse files
committed
Java: model R2DBC SQL injection sinks
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: fb2a5047-e061-44ba-b6df-198390190733
1 parent d045392 commit 2e4a174

8 files changed

Lines changed: 61 additions & 0 deletions

File tree

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Added SQL injection sink models for Spring R2DBC `DatabaseClient` and the R2DBC SPI.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/java-all
4+
extensible: sinkModel
5+
data:
6+
- ["io.r2dbc.spi", "Connection", True, "createStatement", "(String)", "", "Argument[0]", "sql-injection", "manual"]
7+
- ["io.r2dbc.spi", "Batch", True, "add", "(String)", "", "Argument[0]", "sql-injection", "manual"]
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
extensions:
2+
- addsTo:
3+
pack: codeql/java-all
4+
extensible: sinkModel
5+
data:
6+
- ["org.springframework.r2dbc.core", "DatabaseClient", True, "sql", "(String)", "", "Argument[0]", "sql-injection", "manual"]
7+
- ["org.springframework.r2dbc.core", "DatabaseClient$GenericExecuteSpec", True, "fetch", "", "", "Argument[this]", "sql-injection", "manual"]
8+
- addsTo:
9+
pack: codeql/java-all
10+
extensible: summaryModel
11+
data:
12+
- ["org.springframework.r2dbc.core", "DatabaseClient", True, "sql", "(java.util.function.Supplier)", "", "Argument[0].ReturnValue", "ReturnValue", "taint", "manual"]

java/ql/test/query-tests/security/CWE-089/semmle/examples/SpringJdbc.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import java.sql.ResultSet;
22
import java.util.Map;
3+
import java.util.function.Supplier;
4+
import io.r2dbc.spi.Batch;
5+
import io.r2dbc.spi.Connection;
36
import org.springframework.jdbc.core.JdbcTemplate;
47
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
58
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
@@ -13,6 +16,7 @@
1316
import org.springframework.jdbc.object.SqlFunction;
1417
import org.springframework.jdbc.object.SqlUpdate;
1518
import org.springframework.jdbc.object.UpdatableSqlQuery;
19+
import org.springframework.r2dbc.core.DatabaseClient;
1620

1721
public class SpringJdbc {
1822

@@ -80,4 +84,11 @@ public static void test(JdbcTemplate template, NamedParameterJdbcOperations name
8084
namedParamTemplate.update(source(), null, null, null); // $ sqlInjection
8185
}
8286

87+
public static void testR2dbc(DatabaseClient client, Connection connection, Batch batch) {
88+
client.sql(source()); // $ sqlInjection
89+
client.sql((Supplier<String>) SpringJdbc::source).fetch(); // $ sqlInjection
90+
connection.createStatement(source()); // $ sqlInjection
91+
batch.add(source()); // $ sqlInjection
92+
}
93+
8394
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package io.r2dbc.spi;
2+
3+
public interface Batch {
4+
Batch add(String sql);
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package io.r2dbc.spi;
2+
3+
public interface Connection {
4+
Statement createStatement(String sql);
5+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package io.r2dbc.spi;
2+
3+
public interface Statement {
4+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package org.springframework.r2dbc.core;
2+
3+
import java.util.function.Supplier;
4+
5+
public interface DatabaseClient {
6+
GenericExecuteSpec sql(String sql);
7+
8+
GenericExecuteSpec sql(Supplier<String> sqlSupplier);
9+
10+
interface GenericExecuteSpec {
11+
Object fetch();
12+
}
13+
}

0 commit comments

Comments
 (0)