Skip to content

Commit 1f0e26f

Browse files
committed
Add (failing) test for lambda
1 parent d06c822 commit 1f0e26f

File tree

3 files changed

+113
-71
lines changed

3 files changed

+113
-71
lines changed

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

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.util.HashSet;
1515
import java.util.List;
1616
import java.util.Set;
17+
import java.util.function.Consumer;
1718

1819
class AllowListSanitizerWithJavaUtilList {
1920
public static Connection connection;
@@ -51,6 +52,7 @@ public static void main(String[] args) throws IOException, SQLException {
5152
var x = new AllowListSanitizerWithJavaUtilList();
5253
x.testNonStaticFields(args);
5354
testMultipleSources(args);
55+
testEscape(args);
5456
}
5557

5658
private static void testStaticFields(String[] args) throws IOException, SQLException {
@@ -229,11 +231,11 @@ private static void testLocal(String[] args) throws IOException, SQLException {
229231
ResultSet results = connection.createStatement().executeQuery(query);
230232
}
231233
}
232-
// BAD: an allowlist is used but it may contain a non-compile-time constant element
234+
// BAD: an allowlist is used but it contains a non-compile-time constant element
233235
{
234236
List<String> allowlist = new ArrayList<String>();
235237
allowlist.add("allowed1");
236-
possiblyMutate(allowlist);
238+
addNonConstantStringDirectly(allowlist);
237239
if(allowlist.contains(tainted)){
238240
String query = "SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY='"
239241
+ tainted + "' ORDER BY PRICE";
@@ -278,8 +280,27 @@ private static void testMultipleSources(String[] args) throws IOException, SQLEx
278280
}
279281
}
280282

281-
private static void possiblyMutate(List<String> list) {
283+
private static void testEscape(String[] args) throws IOException, SQLException {
284+
String tainted = args[1];
285+
boolean b = args[2] == "True";
286+
{
287+
// BAD: an allowlist is used which contains constant strings
288+
List<String> allowlist = new ArrayList<String>();
289+
addNonConstantStringViaLambda(e -> allowlist.add(e));
290+
if(allowlist.contains(tainted)){ // missing result
291+
String query = "SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY='"
292+
+ tainted + "' ORDER BY PRICE";
293+
ResultSet results = connection.createStatement().executeQuery(query);
294+
}
295+
}
296+
}
297+
298+
private static void addNonConstantStringDirectly(List<String> list) {
282299
list.add(getNonConstantString());
283300
}
284301

302+
private static void addNonConstantStringViaLambda(Consumer<String> adder) {
303+
adder.accept(getNonConstantString());
304+
}
305+
285306
}

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

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import java.util.Arrays;
1414
import java.util.Collections;
1515
import java.util.Set;
16+
import java.util.function.Consumer;
1617

1718
class AllowListSanitizerWithJavaUtilSet {
1819
public static Connection connection;
@@ -50,6 +51,7 @@ public static void main(String[] args) throws IOException, SQLException {
5051
var x = new AllowListSanitizerWithJavaUtilSet();
5152
x.testNonStaticFields(args);
5253
testMultipleSources(args);
54+
testEscape(args);
5355
}
5456

5557
private static void testStaticFields(String[] args) throws IOException, SQLException {
@@ -228,11 +230,11 @@ private static void testLocal(String[] args) throws IOException, SQLException {
228230
ResultSet results = connection.createStatement().executeQuery(query);
229231
}
230232
}
231-
// BAD: an allowlist is used but it may contain a non-compile-time constant element
233+
// BAD: an allowlist is used but it contains a non-compile-time constant element
232234
{
233235
Set<String> allowlist = new HashSet<String>();
234236
allowlist.add("allowed1");
235-
possiblyMutate(allowlist);
237+
addNonConstantStringDirectly(allowlist);
236238
if(allowlist.contains(tainted)){
237239
String query = "SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY='"
238240
+ tainted + "' ORDER BY PRICE";
@@ -277,8 +279,27 @@ private static void testMultipleSources(String[] args) throws IOException, SQLEx
277279
}
278280
}
279281

280-
private static void possiblyMutate(Set<String> set) {
282+
private static void testEscape(String[] args) throws IOException, SQLException {
283+
String tainted = args[1];
284+
boolean b = args[2] == "True";
285+
{
286+
// BAD: an allowlist is used which contains constant strings
287+
Set<String> allowlist = new HashSet<String>();
288+
addNonConstantStringViaLambda(e -> allowlist.add(e));
289+
if(allowlist.contains(tainted)){ // missing result
290+
String query = "SELECT ITEM,PRICE FROM PRODUCT WHERE ITEM_CATEGORY='"
291+
+ tainted + "' ORDER BY PRICE";
292+
ResultSet results = connection.createStatement().executeQuery(query);
293+
}
294+
}
295+
}
296+
297+
private static void addNonConstantStringDirectly(Set<String> set) {
281298
set.add(getNonConstantString());
282299
}
283300

301+
private static void addNonConstantStringViaLambda(Consumer<String> adder) {
302+
adder.accept(getNonConstantString());
303+
}
304+
284305
}

0 commit comments

Comments
 (0)